【发布时间】:2011-06-28 11:15:06
【问题描述】:
我在网络上的几台机器上遇到了一个非常奇怪的 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
然后我在两台机器上同时运行这个脚本。我发现两者之间的行为相似(能够连接和无法连接的时间间隔为几分钟),但两者之间没有同步;有些时期两者都可以联系,有些时期只有一个(或另一个)可以联系,有些时期两者都无法联系。
我知道这是一个非常奇怪和具体的问题,我真的不希望任何人能够立即解决它,但我想知道是否有人有任何提示或方向?我已经和这里的网络人员谈过了,他们和我一样对这个问题感到困惑。
【问题讨论】:
标签: wmi