我在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 & "
ootcimv2"
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
ootcimv2
C: estwmi.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
ootcimv2
BROKENCOMPUTER
如果我通过主机/计算机名称引用计算机,我仍然可以打开WMI连接。我还可以通过IP地址(如HTTP或RDP)连接到机器上运行的其他服务器-请求tphttp://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
然后我在两台机器上同时运行了这个脚本。我发现两者之间的行为相似(能够连接和无法连接的间隔为几分钟),但两者之间并不同步;有时两者都可以连接,有时只有一个(或另一个)可以连接,也有两个都不能连接的时期。
我知道这是一个非常奇怪和具体的问题,我真的不希望有人能立即解决它,但我想知道是否有人有任何提示或方向?我已经和这里的网络人员谈过了,他们和我一样对这个问题感到困惑。