【问题标题】:WMI - Cannot connect to certain computers via IP addressWMI - 无法通过 IP 地址连接到某些计算机
【发布时间】: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


    【解决方案1】:

    除了 MisterZimbu 的精彩回答之外,我还可以对此添加一些观点。假设 Microsoft 没有在本文中删除我的 cmets,请参阅 http://msdn.microsoft.com/en-us/library/windows/desktop/aa393720%28v=vs.85%29.aspx。基本上,当 IP 地址被传递到 WMI 时,Microsoft 似乎正在执行反向 DNS 查找。如果你的 DNS 不是很干净,你会得到“不可预测的结果”,也就是说你会连接到你没想到会连接到的机器。

    将句点添加到 IP 地址会强制反向(或正向)查找失败,然后奇迹般地,他们实际上使用了 IP 地址,而不是从 DNS 返回的(可能不正确的)主机名。似乎可以在许多情况下(UNC、浏览器等)使用在 IP 地址上附加句点,但是您可能会遇到一些警告和其他故障。请注意,如果您查看 DNS 缓存 (ipconfig /displaydns),您将在附加句点时看到失败的查找,因此它不会阻止操作系统进行查找 - 它只是确保过时的 DNS 条目不会使用。

    【讨论】:

      【解决方案2】:

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

      所以通过连接

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

      似乎 100% 的时间都能正常工作。

      不过,如果知道问题的根本原因是什么,我仍然会很高兴。

      【讨论】:

        猜你喜欢
        • 2019-04-08
        • 2012-10-23
        • 1970-01-01
        • 2018-09-15
        • 2014-02-11
        • 2012-02-05
        • 2013-07-18
        • 1970-01-01
        • 2011-06-06
        相关资源
        最近更新 更多