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

时间:2018-02-26 16:41:16

标签: c++ windows winapi networking

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

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

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

1 个答案:

答案 0 :(得分:5)

INetwork如何知道?

如果您要在系统文件中搜索相关的属性包密钥L"NA_NetworkClass",并且您将拥有一些逆向工程技能并且有点运气,您可以找到INetwork接口的相关实现显然在于C:\Windows\System32\netprofmsvc.dll

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

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

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

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

在Windows Vista之前如何完成?

答案是根本没有完成。

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

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

有没有其他替代解决方案?

如果您坚持避免INetwork,则可能永远无法100%匹配Windows网络标识状态。

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

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