如何通过WMI/COM连接到链路本地IPv6?
我正在尝试从主机B对主机A进行一些v4网络配置。因为使用WMI通过v4会遇到一些麻烦,所以我想用链路本地的v6来建立连接。
据说COM从2003年起就支持IPv6,但链路本地的部分似乎被遗忘了。
让人困惑的是:如果主机A有正常工作的IPv4(没错,就是4),那么在Python中这样做是可以的:
>>> c = wmi.WMI('fe80::c0af:e3e1:8383:ddc7%17', user='Administrator', password='blabla')
>>>
但是,当我把A的接口上的v4地址去掉,或者换成一个主机B无法连接的地址时,上面的调用就失败了,报错信息是“指定的对象导出器未找到”。有趣的是,主机A上的netstat显示确实有连接尝试。
补充信息:
- Windows的telnet.exe可以接受fe80地址,无论有没有%17,都能顺利连接到135端口。
- Python的socket.socket.connect也是这样。
有没有什么提示呢?
解决了:看起来WMI做了一种回调连接,而在这种情况下,它无法处理链路本地的v6。正在向微软支持寻求帮助。
1 个回答
1
原来,WMI(Windows管理工具)用来实现双向通信的那些奇怪的回调机制,无法处理链接本地地址。我要向微软支持部门升级这个问题。
更新:我和微软支持部门讨论了这个问题。结果发现,Windows防火墙的默认设置会阻止链接本地名称解析,而WMI需要正常的名称解析才能工作。
在你要连接的机器上,启用“网络发现(LLMNR-UDP-In)”的允许规则,就能让一切正常运作。显然,这个问题并不是某种回连,而是WMI坚持要连接到一个有名称的端点。或者说是其他什么原因。