Вопросы о добавлении исключения брандмауэра в инсталляторе wix по расширению брандмауэра
Я новичок в установщике Wix. Я пытаюсь добавить исключение брандмауэра для моей программы.
Мой код выглядит следующим образом:
<Component Id="_VIEW.EXE" Guid="*" Transitive="yes">
<File Id="view.exe"
Name="view.exe"
KeyPath="yes"
Source="$(var.INSTALLSOURCE)\view.exe">
<fire:FirewallException Id="view_firewall_domain_tcp"
Name="View"
Protocol="tcp"
Scope="any"
IgnoreFailure="yes"
Profile="domain" />
<fire:FirewallException Id="view_firewall_domain_udp"
Name="View"
Protocol="udp"
Scope="any"
IgnoreFailure="yes"
Profile="domain" />
<fire:FirewallException Id="view_firewall_private_tcp"
Name="View"
Protocol="tcp"
Scope="any"
IgnoreFailure="yes"
Profile="private" />
<fire:FirewallException Id="view_firewall_private_udp"
Name="View"
Protocol="udp"
Scope="any"
IgnoreFailure="yes"
Profile="private" />
</File>
</Component>
В своем коде я добавляю 4 исключения брандмауэра, и каждое исключение имеет различное значение для атрибутов "Профиль" и "Протокол". Мой ожидаемый результат - 4 созданных исключения:
NAME GROUP Profile Enabled Action Override Program Local Address Remote Address Protocol Local Port Remote Port Allowed Users Allowed Computers
view Domain Yes Allow No c:\test\view.exe Any Any TCP Any Any Any Any
view Domain Yes Allow No c:\test\view.exe Any Any UDP Any Any Any Any
view Private Yes Allow No c:\test\view.exe Any Any TCP Any Any Any Any
view Private Yes Allow No c:\test\view.exe Any Any UDP Any Any Any Any
Но фактическим результатом является создание только одного исключения, а значением атрибута "Протокол" является "любой" вместо "TCP" или "UDP":
NAME GROUP Profile Enabled Action Override Program Local Address Remote Address Protocol Local Port Remote Port Allowed Users Allowed Computers
view Domain Yes Allow No c:\test\view.exe Any Any Any Any Any Any Any
Итак, у меня есть два вопроса:
- Почему создается только одно исключение? Должно ли имя исключения быть уникальным?
- Почему значение атрибута "Протокол" не вступает в силу?
Я ссылаюсь на официальный документ о расширении брандмауэра: http://wixtoolset.org/documentation/manual/v3/xsd/firewall/firewallexception.html В документе я увидел описание атрибута "Файл":
Идентификатор файла, которому будет предоставлен доступ ко всем входящим портам и протоколам. Если вы используете Файл, вы также не можете использовать Программу. Если вы используете Файл, а также Порт или Протокол в одном и том же элементе FirewallException, исключение не удастся установить в Windows XP и Windows Server 2003. IgnoreFailure="yes" можно использовать для игнорирования возникающего сбоя, но исключение не будет добавлено,
Означает ли это, что если я установлю правило брандмауэра для программы, атрибуты "Протокол" и "Порт" будут автоматически "Любыми", даже если я установлю "Протокол"?
2 ответа
Существующие настраиваемые действия wix FirewallException используют API брандмауэра Windows XP/Server2003. В этом API установка исключения брандмауэра для конкретного исполняемого файла подразумевает, что все порты и все протоколы будут открыты для исключения.
Для справки: интерфейсы API брандмауэра XP/Server2003. Обратите внимание, что INetFwOpenPort может получить / установить порт, а INetFwAuthorizedApplication - нет.
Если вы хотите создать исключение брандмауэра в программе и явно ограничить порт, протокол и домен, вам необходимо использовать расширенный API-интерфейс брандмауэра Windows, поставляемый с Vista. Проверьте эти ссылки: Обзор высокого уровня
Справочное руководство
Справочное руководство по командной строке
К сожалению, еще никто не реализовал расширение AdvancedFirewallException для wix, которое использует эти обновленные API. Возможно, я проведу кампанию на кикстартере, чтобы узнать, есть ли интерес к финансированию разработки;P
Попробуйте использовать разные имена для каждого идентификатора FirewallExeption. Это сработало для меня:
<File Id="sample.exe"
Name="sample.exe"
Source="..\TestFrame\bin\debug\sample.exe"
Vital="yes"
KeyPath='yes'>
<fire:FirewallException Id="FirewallDomainSampleTcp"
Name="Domain Sample TCP"
Protocol="tcp"
Port="8080"
Scope="any"
IgnoreFailure="yes"
Profile="domain" />
<fire:FirewallException Id="FirewallDomainSampleUdp"
Name="Domain Sample UDP"
Protocol="udp"
Port="8080"
Scope="any"
IgnoreFailure="yes"
Profile="domain" />
<fire:FirewallException Id="FirewallPrivatSampleTcp"
Name="Private Sample TCP"
Protocol="tcp"
Port="8080"
Scope="any"
IgnoreFailure="yes"
Profile="private" />
<fire:FirewallException Id="FirewallPrivateSampleUdp"
Name="Private Sample UDP"
Protocol="udp"
Port="8080"
Scope="any"
IgnoreFailure="yes"
Profile="private" />
</File>