WMI - 无法通过IP地址连接到某些计算机

问题描述:

我在网络上的几台机器上遇到了一个非常奇怪的WMI问题。WMI - 无法通过IP地址连接到某些计算机

我有一块软件(.NET/C#)编写,扫描本地网络上的IP范围,然后使用WMI查询有关计算机的某些数据(计算机名称,.NET框架版本等)。我最近遇到的一个问题是,这些机器的一小部分将不会响应通过其IP地址进行的WMI连接 - 它们只是抛出“RPC服务器不可用”异常,就像WMI没有开始运行一样。

这与C#应用程序,并试图简单的查询,以返回计算机的名称的VBScript的应用程序中出现两个:

if wscript.arguments.count >= 1 then 
    host = wscript.arguments(0) 
end if 
if host = "" or isnull(host) then host = "." 

connectionStr = "winmgmts:{impersonationLevel=impersonate}!\\" & host & "\root\cimv2" 
wscript.echo connectionStr 

set objWMIService = GetObject(connectionStr)  
set objCompName = objWMIService.ExecQuery("Select * from Win32_ComputerSystem") 
for each x in objCompName 
    wscript.echo x.Name 
next 

这将返回以下的结果:

C:\>nslookup BROKENCOMPUTER 
Address: 192.168.1.123 

C:\>cscript testwmi.vbs 192.168.1.123 
winmgmts:{impersonationLevel=impersonate}!\\192.168.1.123\root\cimv2 
C:\testwmi.vbs(9, 1) Microsoft VBScript runtime error: The remote server machine does not exist or is unavailable: 'GetObject' 

C:\>cscript testwmi.vbs BROKENCOMPUTER 
winmgmts:{impersonationLevel=impersonate}!\\BROKENCOMPUTER\root\cimv2 
BROKENCOMPUTER 

我可以如果我通过主机/计算机名称引用计算机,仍然会打开WMI连接。我也可以通过IP地址(例如HTTP或RDP)连接到机器上运行的其他服务器 - 请求成功返回http://192.168.1.123

为了让事情变得更加怪异,行为甚至不一致。有时连接到IP会正常工作,并且分批发生。为了测试这个问题,我设置了一个脚本,每隔5秒向所涉及的计算机反复发送WMI请求,并记录结果(以及结果趋势)。我发现的是,所有请求都会失败或成功处理大约一定数量的请求(180- 15分钟间隔)或其倍数。示例:

- Start script 
    - 35 successful requests in a row 
    - 180 failed requests in a row 
    - 180 successful requests 
    - 360 failed requests 
    - 180 successful requests 
    - 180 failed requests 
    - 900 successful requests 
    - etc etc 

然后我在两台机器上同时运行此脚本。我发现两者之间的行为是相似的(有几分钟的时间能够连接并且无法连接),但两者之间没有同步;有两个时期都可以连接,只有一个(或另一个)可以连接的时期,以及两个都不可以连接的时期。

我知道这是一个令人难以置信的奇怪和具体的问题,我真的不希望任何人能够立即解决它,但我想知道如果任何人有任何提示或方向?我在这里和网络人员交谈过,他们和我一样对这个问题感到困惑。

除了MisterZimbu提供的正确答案之外,我可以在这里增加一些观点。假设微软不删除我对这篇文章的评论,请参阅http://msdn.microsoft.com/en-us/library/windows/desktop/aa393720%28v=vs.85%29.aspx。基本上,当IP地址传递到WMI时,微软似乎在做反向DNS查询。如果您的DNS不干净,您将得到“不可预知的结果”,也就是说您将连接到您不希望连接的计算机。

向IP地址添加周期会强制反向(或转发)查找失败,然后通过某种奇迹实际使用IP地址,而不是从DNS返回的(可能不正确的)主机名。看起来,为IP地址添加一段时间可以用于许多情况下(UNC,浏览器等),但有可能遇到的警告和其他故障。请注意,如果您查看DNS缓存(ipconfig/displaydns),则会在追加期间时看到失败的查找,因此它不会阻止操作系统执行查找 - 它只会确保陈旧的DNS条目不会使用。

奇怪的是,添加一个“。”在查询纠正问题时将其添加到IP地址的末尾。我认为这迫使它通过DNS解析或类似的东西。

所以通过

winmgmts:{impersonationLevel=impersonate}!\\192.168.1.123.\root\cimv2 

连接似乎工作的时间正确的100%。

尽管如此,仍然很高兴知道究竟是什么问题的根本原因。