如何在 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=7071
、PORT2=7072
,等等。这有多合适取决于您需要指定的最大端口数。
我使用 属性 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=7071
、PORT2=7072
,等等。这有多合适取决于您需要指定的最大端口数。