我正在考虑为 Windows 10 制作一个与 Windows 防火墙交互的小型 GUI 应用程序。
但是,我无法为一项所需的操作找到相关的 API。
用例(情况)
当在相当出厂默认的家庭使用情况下使用 Windows 10 时(图片:奶奶正在阅读她的电子邮件并浏览网页),防火墙的配置方式通常类似于:
- 存在许多规则,允许范围广泛的 Windows 服务和应用程序(例如 webbrowser、emailclient)各种形式的网络访问。
- 可能有一些规则完全阻止特定应用程序访问互联网(或受到特定限制)。
- 几个可能的配置文件/策略之一正在生效,它决定了当以前未知的应用程序尝试使用网络或互联网时要做什么。
我的问题完全围绕第 3 点展开。
我的目标
通常,Windows 防火墙的活动配置文件将默认设置为拒绝此类“新”应用程序的连接,但也会显示一个弹出窗口,询问用户是否允许。我希望保持这个功能在很大程度上保持原样,但不是出现内置弹出窗口,我希望窗口通知我的自定义应用程序,并让我决定适当的操作(无论是否有用户交互)。
截图:
WINDOWS 防火墙 API
至于我到目前为止发现的内容:“Windows Defender 防火墙”或只是“Windows 防火墙”(netfw.h)有许多相关的 API/功能。它们(大部分)有据可查:https ://docs.microsoft.com/en-us/windows/win32/api/netfw/
INetFwRule(|2|3) API处理各个防火墙规则。
INetFwProfile和INetFwPolicy(|2) API 处理与我感兴趣的设置相关的设置,例如:
INetFwPolicy2::get_NotificationsDisabled
INetFwProfile::get_NotificationsDisabled
但是在附近我找不到任何与注册函数挂钩的任何东西,只有用于打开或关闭通知的 getter/setter 方法。
迄今为止发现的最有前途的 API 似乎是INetFwProduct(s);其中包含
INetFwProducts::Register -> 允许应用程序或服务访问向 Windows 防火墙注册第三方防火墙产品的方法和属性。
INetFwProduct::get_RuleCategories -> 对于第三方防火墙产品注册,指示第三方防火墙希望从 Windows 防火墙获得所有权的规则类别。
这显然与注册第三方程序(例如 Zone Alarm、Norton Security 等)有关,以便它可以接管 NETFW 工作负载的某些方面。这确实是我的应用程序属于安全工具的名称,这并非不可能。
INetFwProduct的东西带来了一些烦人的约束(Authenticode-signing 等),这并不是特别相关/重要(但稍后会详细介绍)。
我的问题
然而,主要问题是,这仍然没有让我真正了解我的(想象中的INetFwProduct注册的)软件将如何完成我想要的。
我希望在某个地方会有另一个 API,它提供将我的INetFwProduct包连接到 NETFW 或至少一些网络层 API 等的方法。
有谁知道我在哪里,通向哪里?或者也许熟悉一种更简单的方法来完成同样的事情。
IETFW 产品似乎有点过头了
我也开始怀疑整个INetFwProduct路线涉及我的程序承担巨大的责任,而我真正想做的只是替换/挂钩到 NETFW 工作量的一小部分。毕竟,我不想替换整个规则集/策略后端,也不想改变解释规则的方式,也不想改变任何其他花哨的东西。我只希望调用我的用户空间程序,而不是(或之前)用户被弹出 GUI 窃听。理想情况下,我的程序所做的只是返回一个关于是否允许连接通过的布尔值(如果需要,它可以使用INetFwRule API 来为来自同一程序的未来连接添加一个永久规则)
验证码要求
与我的问题没有直接关系,但INetFwProduct功能也确实给图片带来了一堆新的约束,然后我的应用程序(似乎)必须经过 Authenticode 签名并需要一个 IMAGE_DLLCHARACTERISTICS_FORCE_INTEGRITY 标头。我对这两件事都不是很熟悉,尽管我确实认为(并且似乎已经确认)免费的 Lets Encrypt 证书不能用于此目的,自签名证书可能也是如此。而且由于我不打算把它做成一个非常大的(也不是抛光或付费的)产品,也没有特别计划将它作为 FOSS 项目发布,结果似乎是,你不能没有这样的程序每年至少花费 150 欧元或 350 欧元进行认证。