如何为Wapproj打包的桌面应用中多可执行文件配置防火墙规则?
我有一个通过wapproj + appxmanifest打包的全信任Windows桌面应用,需要运行一个提供网络服务(yggstack)的独立后台可执行文件。此前仅需单个可执行文件时,AppxManifest.xml中的防火墙规则配置如下,可正常监听13456端口:
<desktop2:Extension Category="windows.firewallRules"> <desktop2:FirewallRules Executable="App\App.exe"> <desktop2:Rule Direction="in" IPProtocol="TCP" Profile="all" LocalPortMin="13456" LocalPortMax="13456" /> </desktop2:FirewallRules> </desktop2:Extension>
现在我将yggstack.exe打包进应用后,尝试添加如下配置为其设置防火墙规则时:
<desktop2:Extension Category="windows.firewallRules"> <desktop2:FirewallRules Executable="App\App.exe"> <desktop2:Rule Direction="in" IPProtocol="TCP" Profile="all" LocalPortMin="13456" LocalPortMax="13456" /> </desktop2:FirewallRules> <desktop2:FirewallRules Executable="App\yggstack.exe"> <desktop2:Rule Direction="in" IPProtocol="TCP" Profile="all" LocalPortMin="5090" LocalPortMax="5090" /> </desktop2:FirewallRules> </desktop2:Extension>
出现以下错误:
AppxManifest.xml : error APPX0501: Validation error. error C00CE014: App manifest validation error: The app manifest must be valid as per schema: Line 53, Column 8, Reason: Element '{http://schemas.microsoft.com/appx/manifest/desktop/windows10/2}FirewallRules' is unexpected according to content model of parent element '{http://schemas.microsoft.com/appx/manifest/desktop/windows10/2}Extension'.
请问是否可以为另一个.exe配置防火墙规则?该如何实现?
解决方案
可以为多个可执行文件配置防火墙规则,问题出在你的配置格式违反了AppxManifest的Schema约束:单个desktop2:Extension(类别为windows.firewallRules)节点下只能包含一个desktop2:FirewallRules元素,你在同一个Extension里放了两个,所以触发验证错误。
正确的做法是为每个需要配置规则的可执行文件单独创建一个desktop2:Extension节点,每个节点对应一个exe的防火墙规则配置。修改后的AppxManifest.xml配置如下:
<!-- 为App.exe配置防火墙规则 --> <desktop2:Extension Category="windows.firewallRules"> <desktop2:FirewallRules Executable="App\App.exe"> <desktop2:Rule Direction="in" IPProtocol="TCP" Profile="all" LocalPortMin="13456" LocalPortMax="13456" /> </desktop2:FirewallRules> </desktop2:Extension> <!-- 为yggstack.exe配置防火墙规则 --> <desktop2:Extension Category="windows.firewallRules"> <desktop2:FirewallRules Executable="App\yggstack.exe"> <desktop2:Rule Direction="in" IPProtocol="TCP" Profile="all" LocalPortMin="5090" LocalPortMax="5090" /> </desktop2:FirewallRules> </desktop2:Extension>
这样拆分后,每个Extension节点只包含对应exe的FirewallRules配置,符合Schema要求,验证就能通过,两个可执行文件的防火墙规则也会生效。
内容的提问来源于stack exchange,提问作者LOST

