WinAPI:如何确定网络何时识别?

问题描述 投票:3回答:1

通过以太网连接某些设备时,我可以看到“网络连接”面板中的适配器状态更改为“识别网络”。我想使用c ++ Windows API查询此状态。

我正在我的项目中实现一些动态的ipconfig /all列表。当网络接口上的网络正在识别时,我将要显示“识别网络”。

我知道INetwork界面,但令人讨厌的是只能通过COM访问。还有另外一种方法吗?也许来自有关网络接口本身的信息?

c++ windows winapi networking
1个回答
5
投票

How does INetwork know?

如果你要在系统文件中搜索相关的属性包密钥L"NA_NetworkClass",你会有一些逆向工程技能和一点运气,你会发现INetwork界面的相关实现显然在于C:\Windows\System32\netprofmsvc.dll

IPropertyBag::Read()实现NA_NetworkClass的代码似乎通过查看网络的其他GUID属性来确定状态。显然,未识别和识别状态都由两个硬编码值中的一个信号通知,而任何其他值表示连接已完全识别。

到现在为止还挺好。如果你可以通过其他方式确定这个GUID(例如通过一些你会习惯的“vanilla”Win32 API)并自己进行比较,你也应该能够确定识别状态。但是这里有一个问题:未识别和识别的确切GUID值是在netprofmsvc.dll的不同位置动态生成的,因此它们每次都会有所不同!

此时你应该停止尝试。这是操作系统作者可以故意使用的技术之一,告诉您以这种方式搞乱系统内部结构是不受欢迎的,容易出错并且很危险。

所以只需像其他人一样使用预期的界面。来吧,与其他一些可怕的东西相比,COM一点都不差!

How was this done before Windows Vista?

答案是它根本没有完成。

我上面写的GUID实际上恰好是一个“网络配置文件GUID”,根据域认证状态,网关的MAC地址等许多网络参数计算,后来与域/工作/家庭/公共等访问配置文件之一相关联。

所有这些都只在Vista中引入,还有全新的“网络和共享中心”以及防火墙和网络管理方面的其他改进。请参阅2007年的“Exploring The Windows Firewall”文档,并搜索“网络配置文件”一章以获取更多信息。

Are there any alternative solutions?

如果你坚持避免使用INetwork,你可能永远无法100%匹配Windows网络识别状态。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.