Windows 防火墙:寻找用户交互 API

问题描述

我正在考虑为 Windows 10 制作一个小型 GUI 应用程序,它与 Windows 防火墙交互。

但是,我无法找到所需操作的相关 API。

用例(情况)

当 Windows 10 在相当出厂认的家庭使用情况下使用时(图片:奶奶阅读她的电子邮件和浏览网页),防火墙的配置方式很常见:

  1. 存在许多规则,允许范围广泛的 Windows 服务和应用程序(例如网络浏览器、电子邮件客户端)进行各种形式的网络访问
  2. 也许有一些规则会阻止特定应用程序访问互联网(或受到特定限制)。
  3. 几个可能的配置文件/策略之一正在生效,这些配置文件/策略决定了当以前未知的应用程序尝试使用网络或互联网时要执行的操作。

我的问题完全围绕第 3 点展开。

我的目标

通常,Windows 防火墙的活动配置文件认设置为拒绝此类“新”应用程序的连接,但也会显示一个弹出窗口,询问用户是否允许。 我希望保持此功能在很大程度上保持原样,但不是出现内置弹出窗口,我希望 Windows 通知我的自定义应用程序,并让我决定适当的操作(无论是否有用户交互)。

截图:

WINDOWS 防火墙 API

至于我目前发现的情况: “Windows Defender 防火墙”或“Windows 防火墙”(netfw.h) 有许多相关的 API/功能。 它们(大部分)在以下位置有详细记录:https://docs.microsoft.com/en-us/windows/win32/api/netfw/

INetFwRule(|2|3) API 处理各个防火墙规则。

INetFwProfileINetFwPolicy(|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 签名等),这并不是特别相关/重要(但稍后会详细介绍)。

我的问题

然而,主要问题是,这仍然没有真正让我知道我的(想象中的 INetFwProduct 注册)软件将如何完成我想要的。

我希望在某处有另一个 API,它提供了将我的 INetFwProduct 包连接到 NETFW 或至少某些网络层 API 等的方法

有谁知道我在哪条小道上,通向哪里?或者可能熟悉一种更简单的方法来完成同样的事情。

INETFWPRODUCT 似乎过大了

我也开始怀疑整个 INetFwProduct 路线涉及我的程序承担巨大的责任,而我真正想做的只是替换/挂钩到 NETFW 工作量的一小部分。 毕竟,我不想替换整个规则集/策略后端,也不想改变解释规则的方式,也不想改变任何其他花哨的东西。 我只是希望我的用户空间程序被调用,而不是(或在此之前)用户被弹出式 GUI 窃听。 理想情况下,我的所有程序都会返回一个关于是否允许连接通过的布尔值(如果需要,它可以使用 INetFwRule API 还为来自同一程序的未来连接添加永久规则)

验证码要求

与我的问题没有直接关系,但 INetFwProduct 功能也确实给图片带来了一堆新的约束, 然后,我的应用程序(似乎)必须是 Authenticode 签名的,并且需要一个 IMAGE_DLLcharacteristics_FORCE_INTEGRITY 标头。 我对这两件事都不是很熟悉,尽管我确实认为(并且似乎已经确认)不能为此使用免费的 Lets Encrypt 证书,而且自签名证书可能也是如此。 因为我不打算把它做成一个非常大的(也不是抛光的或付费的)产品,也不是特别打算将它作为一个 FOSS 项目发布,结果似乎是,没有你就不能制作这样的程序每年至少花费 150 欧元或 350 欧元用于认证。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)