首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WinAPI:如何确定网络何时识别?

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

Stack Overflow用户
提问于 2018-02-26 16:41:15
回答 1查看 745关注 0票数 3

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

我在我的项目中实现了一个动态ipconfig /all清单。当网络接口上的网络正在识别时,我想显示“标识网络”。

我知道INetwork接口,但令人烦恼的是它只能通过COM访问。还有别的办法吗?也许是关于网络接口本身的信息?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-03 02:21:33

INetwork怎么知道的?

如果您在系统文件中搜索相关的属性包密钥L"NA_NetworkClass",并且您有一些反向工程技能和一些运气,您会发现INetwork接口的相关实现显然在C:\Windows\System32\netprofmsvc.dll中。

实现IPropertyBag::Read() for NA_NetworkClass的代码似乎通过查看网络的其他GUID属性来确定状态。显然,身份不明和标识状态都由两个硬编码值中的一个发出信号,而任何其他值都意味着完全标识了连接。

到目前一切尚好。如果您可以通过其他一些方法(例如,通过一些您熟悉的“普通”Win32 API )来确定这个GUID,并自己对它进行比较,那么您也应该能够确定标识状态。但是这里有一个问题:在netprofmsvc.dll中的不同位置动态生成身份不明和标识的确切GUID值,所以每次都会不同!

在这一点上你应该停止尝试。这是OS作者可以故意使用的技术之一,它告诉您,以这种方式破坏系统内部是不鼓励的、容易出错的和危险的。

因此,只需像其他人一样使用预期的界面。算了吧,和其他一些可怕的事情相比,COM一点也不坏!

在Windows之前是如何做到这一点的?

答案是根本没做过。

我上面写的GUID实际上是一个“网络配置文件GUID",它是从许多网络参数(如域身份验证状态、网关的MAC地址等)中计算出来的,后来与域/Work/Home/Public等访问配置文件相关联。

所有这些都是只在Vista中引入的,还有全新的“网络和共享中心”以及防火墙和网络管理方面的其他改进。请参阅2007年的"Windows防火墙的探索“文档,并搜索”网络概要文件“一章以获得更多信息。

有没有其他的解决办法?

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

正如在上面的文章中解释的那样,网络位置感知(NetworkLocation感知,NLA)服务显然要经过大量的工作才能可靠地识别网络,同时考虑到许多其他参数,而不仅仅是分配的IP地址或启用的协议。自我复制所有这些(确定什么时候知道所有需要说网络被识别的东西)将是很有挑战性的,特别是因为流程的确切细节是没有文档记录的。

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48993113

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档