4

我是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

但实际结果是只创建了一个异常,“Protocol”属性的值为“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 在文档中,我看到了一些关于“文件”属性的描述:

被授予访问所有传入端口和协议的文件的标识符。如果您使用 File,则不能同时使用 Program。如果在同一个 FirewallException 元素中使用 File 以及 Port 或 Protocol,则该异常将无法在 Windows XP 和 Windows Server 2003 上安装。IgnoreFailure="yes" 可用于忽略导致的失败,但不会添加该异常.

这是否意味着如果我为程序设置防火墙规则,即使我设置了“协议”,“协议”和“端口”属性也会自动为“任何”?

4

2 回答 2

3

现有的 wix FirewallException 自定义操作使用 XP/Server2003 windows 防火墙 API。在此 API 中,为特定可执行文件设置防火墙例外意味着所有端口和所有协议都将对例外开放。

作为参考,XP/Server2003 防火墙 API 接口。请注意,INetFwOpenPort 能够获取/设置端口,而 INetFwAuthorizedApplication 没有。

如果您想在程序上创建防火墙例外并明确限制端口、协议和域,则需要使用 Vista 附带的 Windows“高级”防火墙 API。查看这些参考: 高级概述
参考指南
命令行参考指南

可悲的是,还没有人为 wix 实现 AdvancedFirewallException 扩展来使用这些更新的 API。也许我会举办一个kickstarter活动,看看是否有兴趣资助开发;P

于 2014-09-25T14:45:38.890 回答
2

尝试为每个 FirewallExeption ID 使用不同的名称。这对我有用:

<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>
于 2014-10-30T07:00:34.440 回答