如何在 Wix 中向 FirewallException 添加多个端口?

How to add several ports to FirewallException in Wix?

我使用 属性 PORTS 将一些 http 端口传递到我的安装。
然后这些端口将被存储到init文件中并被应用程序使用。
我需要将这些端口添加到 FirewallException 吗? 但以下代码不起作用:

<Component Id="fwException" Guid="MyGUID">
   <Condition>Privileged</Condition>
   <RegistryKey Root="HKCU" Key="Software\Company\[ProductName]">
      <RegistryValue Name="fwException" Value="1" KeyPath="yes" Type="integer" />
   </RegistryKey>

   <fire:FirewallException Id="My_Ports" Name="My Node.exe" Profile="domain" Port="[PORTS]" Protocol="tcp" Scope="localSubnet"/>
</Component>

如何将多个端口添加到 FirewallException?

总结

在 WIX 3.9(及更早版本)中,FirewallExtension only supports a single integer for the Port attribute. The Port attribute supports Formatted 值,但格式化结果仍必须是单个整数。在您的情况下 [PORTS] 必须评估为单个整数。

如果 Port 属性设置为 'Not a number',您通常会在安装日志中看到此错误:

SchedFirewallException:  Error 0x80070057: failed to parse record field: 3 as number: Not a number

根据@Sean 的评论,多个端口应该在 WIX 3.10 中工作。有关功能请求的详细信息,请参阅 http://wixtoolset.org/issues/4206/

WIX 3.9 及更早版本的解决方法

可以通过使用 FirewallExtension 声明来解决此限制:

<Component Id="fwException" Guid="-- YOUR GUID --">
  <Condition>Privileged</Condition>
  <RegistryKey Root="HKCU" Key="Software\Company\[ProductName]">
  <RegistryValue Name="fwException" Value="1" KeyPath="yes" Type="integer" />
  </RegistryKey>

  <fire:FirewallException Id="My_Port1" Name="My Node.exe" Profile="domain" Port="[PORT1]" Protocol="tcp" Scope="localSubnet"/>
  <fire:FirewallException Id="My_Port2" Name="My Node.exe" Profile="domain" Port="[PORT2]" Protocol="tcp" Scope="localSubnet"/>
</Component>

如果您需要可变数量的端口(达到预定义的最大限制),您可以尝试为每个组件使用 1 个防火墙扩展,每个组件都有一个条件:

<Component Id="fwException1" Guid="-- YOUR GUID --">
  <Condition>Privileged AND PORT1</Condition>
  <RegistryKey Root="HKCU" Key="Software\Company\[ProductName]">
  <RegistryValue Name="fwException1" Value="1" KeyPath="yes" Type="integer" />
  </RegistryKey>

  <fire:FirewallException Id="My_Port1" Name="My Node.exe" Profile="domain" Port="[PORT1]" Protocol="tcp" Scope="localSubnet"/>
</Component>

<Component Id="fwException2" Guid="-- YOUR GUID --">
  <Condition>Privileged AND PORT2</Condition>
  <RegistryKey Root="HKCU" Key="Software\Company\[ProductName]">
  <RegistryValue Name="fwException2" Value="1" KeyPath="yes" Type="integer" />
  </RegistryKey>

  <fire:FirewallException Id="My_Port2" Name="My Node.exe" Profile="domain" Port="[PORT2]" Protocol="tcp" Scope="localSubnet"/>
</Component>

在命令行中,您可以指定多个端口,如:PORT1=7071PORT2=7072,等等。这有多合适取决于您需要指定的最大端口数。