当通过以太网连接某些设备时,我可以看到“网络连接”面板中的适配器状态更改为“识别网络”。我想使用c ++ Windows API查询此状态。
我在项目中实现了一些动态ipconfig /all
列表。当网络接口上的网络识别出来时,我想要显示“识别网络”。
我知道INetwork
接口,但烦人的只能通过COM访问。还有另外一种方法吗?也许来自有关网络接口本身的信息?
答案 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一点都不差!
答案是根本没有完成。
我上面写的GUID实际上恰好是“网络配置文件GUID”,根据许多网络参数(如域身份验证状态,网关的MAC地址等)计算,后来与域/工作/等访问配置文件之一相关联。主页/公共。
这一切只在Vista中引入,还有全新的“网络和共享中心”以及防火墙和网络管理方面的其他改进。请参阅2007年的此文档“Exploring The Windows Firewall”,并搜索“网络配置文件”一章以获取更多信息。
如果您坚持避免INetwork
,则可能永远无法100%匹配Windows网络标识状态。
正如上文所述,网络位置感知(NLA)服务显然经历了大量工作以可靠地识别网络,考虑到许多其他参数,而不仅仅是分配的IP地址或启用的协议。自己复制所有这些(以确定何时知道所有必要的网络被识别)将是具有挑战性的,特别是因为该过程的确切细节没有记录。
也就是说,在大多数情况下,检查有效的接收DHCP配置(有效主机和网关IP地址)可能足够近似。祝你好运!