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

Ton*_*ton 3 c++ windows networking winapi

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

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

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

Yir*_*kha 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年的" 探索Windows防火墙 " 文档,并搜索名为"网络配置文件"的章节以获取更多信息.

有没有替代解决方案?

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

正如上文所述,网络位置感知(NLA)服务显然经历了大量工作以可靠地识别网络,考虑到许多其他参数,而不仅仅是分配的IP地址或启用的协议.复制所有自己(来决定,当你知道必要说网络是一切确定)将是具有挑战性的,尤其是因为该过程的具体细节是无证.

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