WinAPI:如何确定网络何时识别?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WinAPI:如何确定网络何时识别?相关的知识,希望对你有一定的参考价值。
通过以太网连接某些设备时,我可以看到“网络连接”面板中的适配器状态更改为“识别网络”。我想使用c ++ Windows API查询此状态。
我正在我的项目中实现一些动态的ipconfig /all
列表。当网络接口上的网络正在识别时,我将要显示“识别网络”。
我知道INetwork
界面,但令人讨厌的是只能通过COM访问。还有另外一种方法吗?也许来自有关网络接口本身的信息?
How does INetwork
know?
如果你要在系统文件中搜索相关的属性包密钥L"NA_NetworkClass"
,你会有一些逆向工程技能和一点运气,你会发现INetwork
界面的相关实现显然在于C:WindowsSystem32
etprofmsvc.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地址)可能是一个足够好的近似值。祝好运!
以上是关于WinAPI:如何确定网络何时识别?的主要内容,如果未能解决你的问题,请参考以下文章