Вопросы о добавлении исключения брандмауэра в инсталляторе 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

Итак, у меня есть два вопроса:

  1. Почему создается только одно исключение? Должно ли имя исключения быть уникальным?
  2. Почему значение атрибута "Протокол" не вступает в силу?

Я ссылаюсь на официальный документ о расширении брандмауэра: 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>
Другие вопросы по тегам