通过服务创建适用于所有应用程序 运行 的 Windows 防火墙 API 规则

Creating a rule with the Windows Firewall API that applies to all applications run by a service

我正在尝试为 Windows 服务设置防火墙规则以拒绝所有入站和出站 TCP 和 UDP 连接,但使用 Windows 服务强化 API,遵循 VBScript 示例 here

现在,该服务可能会产生新的进程(因为它是一个持续集成构建和测试代理),所以仅仅像上面的示例脚本那样设置 NewOutboundRule.ApplicationName = "%systemDrive%\WINDOWS\system32\svchost.exe" 是不够的 - 我需要一个规则来适用于服务所有 个应用程序运行。

但是,如果我尝试设置一个新的入站规则,其中据称可选的 ApplicationName 属性 没有在 INetFw 接口上指定,调用添加新的规则失败(在上面脚本的 wshRules.Add NewOutboundRule 行)。其他都对,就好像我指定了ApplicationName,调用成功

有没有什么方法可以创建适用于 ApplicationName 所有可能值的规则,或者有其他替代方法吗?

经过一些实验,事实证明 WSH 规则是这样工作的:对 INetFwServiceRestriction::RestrictService 的调用(使用 restrictService=TRUE)只需要包含被调用的主要可执行文件的名称启动服务。如果该进程使用任何其他可执行文件生成一个新进程,则默认情况下该新进程会阻止所有入站和出站网络连接。即使通过 INetFwServiceRestriction::Rules.

为主要可执行文件添加了异常也是如此

因此,如果服务的辅助可执行文件 运行 需要网络访问权限,也有必要为这些可执行文件添加明确的 INetFwRule 例外。这是有道理的 - 对 RestrictService 的调用会阻止所有内容,然后可以添加包含应用程序名称的异常白名单。