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

时间:2015-05-25 13:16:35

标签: installation wix windows-installer installer custom-action

我使用属性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添加多个端口?

1 个答案:

答案 0 :(得分:1)

<强>摘要

在WIX 3.9(及更早版本)中,FirewallExtension仅支持Port属性的单个整数。 Port属性支持Formatted值,但格式化结果必须仍为单个整数。在您的情况下,[PORTS]必须求值为单个整数。

如果Port属性设置为“非数字”,您通常会在安装日志中看到此错误:

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 decarations:

来解决此限制
<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,依此类推。这有多合适取决于您需要指定的最大端口数。