WinAPI:如何确定网络正在识别?

3
当我通过以太网连接一些设备时,我可以看到网络连接面板中的适配器状态更改为“正在识别网络”。我想使用c++ Windows API查询此状态。
在我的项目中,我正在实现类似于动态ipconfig / all列表。当网络接口上的网络正在识别时,我将显示“正在识别网络”。
我知道INetwork接口,但它只能通过COM访问,这很麻烦。是否有其他方法?也许是从网络接口本身的信息中获取?

2
使用COM有什么问题吗? - David Heffernan
1
实际上,我想什么都不需要。我宁愿不必初始化com对象,查找网络,查询propertybag接口并读取所需的属性值。如果必须这样做,我会这样做,但如果有更直接的方法,比如使用我已经拥有的网络接口信息,我更喜欢它。INetwork似乎是在Vista中引入的。我想知道在那之前是如何完成的。 - Tony Clifton
1
最好开始适应COM。这是Windows Runtime中唯一剩下的东西。您可以使用Windows Runtime C++模板库(WRL)(或其他您喜欢的库)来使访问COM接口更加容易。 - IInspectable
1
既然有官方API可以提供这些信息,可能就没有其他的了,那你期望得到什么答案呢? - Simon Mourier
1
我不明白你在寻找什么。调用像这样的COM接口并不是很复杂,而且与...导出DLL差不多,你到底期望什么?PS:当你向用户(除了OP)发表评论时,请使用@前缀,否则他不会收到通知。 - Simon Mourier
显示剩余3条评论
1个回答

5

INetwork 如何知道网络标识状态?

如果你在系统文件中搜索相关的属性包键 L"NA_NetworkClass",并具备一定的反向工程技能和一点运气,你可以发现 INetwork 接口的相关实现似乎位于 C:\Windows\System32\netprofmsvc.dll 中。

NA_NetworkClass 实现 IPropertyBag::Read() 的代码似乎通过查看网络的某些其他 GUID 属性来确定其状态。显然,无法识别和正在识别的状态都是由其中两个硬编码值之一来表示的,而任何其他值都意味着连接已完全被识别。

到目前为止还不错。如果您可以通过其他方式(例如通过某些您熟悉的“原始” Win32 API)确定此 GUID 并自行进行比较,则应该也能够确定标识状态。但是问题在于:用于表示 unidentifiedidentifying 的确切 GUID 值是在 netprofmsvc.dll 中的另一个位置动态生成的,因此每次都会有所不同!

此时您应该停止尝试。这是操作系统作者故意使用的技术之一,告诉您不鼓励、容易出错且危险的系统内部操作。

所以请像其他人一样使用预定的接口。嘿,与其他可怕的事情相比,COM 根本不坏!

Windows Vista 之前是如何做到的?

答案是根本没有这样做过。

上面提到的 GUID 实际上是“网络配置文件 GUID”,它是从许多网络参数(如域身份验证状态、网关的 MAC 地址等)计算得出的,然后与一个访问配置文件(如域/工作组/家庭/公用)相关联。

所有这些都是在 Vista 中引入的,与全新的“网络和共享中心”以及防火墙和网络管理的其他改进一起。请参阅此文档 "探索 Windows 防火墙" 中名为“网络配置文件”的章节以获取更多信息。

是否有其他替代方案?

如果您坚持避免使用 INetwork,则可能永远无法完全匹配 Windows 网络识别状态。

如上文所述,网络位置感知 (NLA) 服务显然需要经过大量工作才能可靠地识别网络,考虑到许多其他参数,而不仅仅是分配的 IP 地址或已启用的协议。自己复制所有这些内容(以确定您知道一切必要的内容来说明网络已被识别)将是具有挑战性的,特别是因为该过程的确切细节未经记录。

话虽如此,在大多数情况下,检查有效的DHCP配置(有效的主机和网关IP地址)可能是一个足够好的近似值。祝你好运!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接