在我的项目中,我正在实现类似于动态
ipconfig / all
列表。当网络接口上的网络正在识别时,我将显示“正在识别网络”。我知道
INetwork
接口,但它只能通过COM访问,这很麻烦。是否有其他方法?也许是从网络接口本身的信息中获取?ipconfig / all
列表。当网络接口上的网络正在识别时,我将显示“正在识别网络”。INetwork
接口,但它只能通过COM访问,这很麻烦。是否有其他方法?也许是从网络接口本身的信息中获取?INetwork
如何知道网络标识状态?如果你在系统文件中搜索相关的属性包键 L"NA_NetworkClass"
,并具备一定的反向工程技能和一点运气,你可以发现 INetwork
接口的相关实现似乎位于 C:\Windows\System32\netprofmsvc.dll
中。
为 NA_NetworkClass
实现 IPropertyBag::Read()
的代码似乎通过查看网络的某些其他 GUID 属性来确定其状态。显然,无法识别和正在识别的状态都是由其中两个硬编码值之一来表示的,而任何其他值都意味着连接已完全被识别。
到目前为止还不错。如果您可以通过其他方式(例如通过某些您熟悉的“原始” Win32 API)确定此 GUID 并自行进行比较,则应该也能够确定标识状态。但是问题在于:用于表示 unidentified 和 identifying 的确切 GUID 值是在 netprofmsvc.dll
中的另一个位置动态生成的,因此每次都会有所不同!
此时您应该停止尝试。这是操作系统作者故意使用的技术之一,告诉您不鼓励、容易出错且危险的系统内部操作。
所以请像其他人一样使用预定的接口。嘿,与其他可怕的事情相比,COM 根本不坏!
答案是根本没有这样做过。
上面提到的 GUID 实际上是“网络配置文件 GUID”,它是从许多网络参数(如域身份验证状态、网关的 MAC 地址等)计算得出的,然后与一个访问配置文件(如域/工作组/家庭/公用)相关联。
所有这些都是在 Vista 中引入的,与全新的“网络和共享中心”以及防火墙和网络管理的其他改进一起。请参阅此文档 "探索 Windows 防火墙" 中名为“网络配置文件”的章节以获取更多信息。
如果您坚持避免使用 INetwork
,则可能永远无法完全匹配 Windows 网络识别状态。
如上文所述,网络位置感知 (NLA) 服务显然需要经过大量工作才能可靠地识别网络,考虑到许多其他参数,而不仅仅是分配的 IP 地址或已启用的协议。自己复制所有这些内容(以确定您知道一切必要的内容来说明网络已被识别)将是具有挑战性的,特别是因为该过程的确切细节未经记录。
话虽如此,在大多数情况下,检查有效的DHCP配置(有效的主机和网关IP地址)可能是一个足够好的近似值。祝你好运!
INetwork
似乎是在Vista中引入的。我想知道在那之前是如何完成的。 - Tony Clifton