Winapi:如何确定网络何时识别



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

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

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

INetwork如何知道?

如果您将在系统文件中搜索相关的属性袋键L"NA_NetworkClass",并且您将具有一些反向工程技能和一些运气,则可以发现INetwork接口的相关实现显然位于C:WindowsSystem32netprofmsvc.dll中。

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

到目前为止一切都很好。如果您可以通过其他一些方式来确定此GUID(例如,通过一些您可以使用的" Vanilla" Win32 API(并自己对其进行比较,那么您也应该能够确定识别状态。但这是捕获量:不确定的识别的确切GUID值是在netprofmsvc.dll中的另一个位置动态生成的,因此每次它们都会有所不同!

此时,您应该停止尝试。这是操作系统作者可以故意使用的技术之一,告诉您以这种方式与系统内部拼凑在一起是不鼓励,容易出错且危险的。

因此,只要像其他所有人一样使用预期的界面。来吧,与那里的其他一些可怕的事情相比,com一点也不错!

Windows Vista之前是如何完成的?

答案是根本没有完成。

我写的关于上述的GUID实际上恰好是"网络配置文件GUID",它是根据域身份验证状态,网关的MAC地址等的许多网络参数计算得出的,后来与域名/Work/Work/Work/Work/主页/公共。

所有这些仅在Vista中引入,以及全新的"网络和共享中心"以及防火墙和网络管理的其他改进。有关更多信息,请参见2007年的"探索Windows防火墙",并搜索一个名为"网络配置文件"的章节。

有其他解决方案吗?

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

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

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

最新更新