我在WMI上遇到了一个非常奇怪的问题,我在网络上的几台机器上遇到了这个问题。
我编写了一个软件(.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)连接到机器上运行的其他服务器 - 请求tp 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
然后我在两台机器上同时运行此脚本。我发现两者之间的行为是相似的(有几分钟长的间隔能够连接而且无法连接)但两者之间没有同步;有两个时期都可以连接的时期,只有一个(或另一个)可以连接的时期,以及两者都无法连接的时期。
我知道这是一个令人难以置信的奇怪和具体的问题,我真的不希望任何人能够解决它,但我想知道是否有人有任何提示或方向?我已经和网络人员交谈,他们和我一样对这个问题感到困惑。
答案 0 :(得分:4)
除了MisterZimbu的精彩答案外,我还可以对此加一些看法。假设Microsoft未删除对本文的评论,请参阅http://msdn.microsoft.com/en-us/library/windows/desktop/aa393720%28v=vs.85%29.aspx。基本上,当IP地址传递到WMI时,Microsoft似乎正在进行反向DNS查找。如果您的DNS没有干净利落,您将获得“不可预测的结果”,也就是说您将连接到您不希望连接的计算机。
将句点添加到IP地址会强制反向(或转发)查找失败,然后通过一些奇迹,它们实际上使用IP地址,而不是从DNS返回的(可能不正确的)主机名。似乎在IP地址中添加一个句点可以在许多上下文中使用(UNC,浏览器等),但是您可能会遇到警告和其他故障。请注意,如果您查看DNS缓存(ipconfig / displaydns),您将在附加句点时看到失败的查找,因此它不会阻止操作系统执行查找 - 它只是确保过时的DNS条目不会使用。
答案 1 :(得分:1)
奇怪的是,添加了一个“。”在查询更正问题时,到IP地址的末尾。我认为这会强制它通过DNS解析或类似的东西。
通过
连接winmgmts:{impersonationLevel=impersonate}!\\192.168.1.123.\root\cimv2
似乎在100%的时间都能正常工作。
虽然知道问题的根本原因仍然很好。