English 中文(简体)
WMI-无法通过IP地址连接到某些计算机
原标题:WMI - Cannot connect to certain computers via IP address
  • 时间:2011-02-16 15:57:10
  •  标签:
  • wmi

我在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

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

我知道这是一个非常奇怪和具体的问题,我真的不希望有人能立即解决它,但我想知道是否有人有任何提示或方向?我已经和这里的网络人员谈过了,他们和我一样对这个问题感到困惑。

最佳回答

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

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

问题回答

奇怪的是,在进行查询时,在IP地址的末尾添加一个“.”可以纠正这个问题。我认为这会迫使它通过DNS解析或类似的操作。

所以通过连接

winmgmts:{impersonationLevel=impersonate}!\192.168.1.123.
ootcimv2

似乎100%都能正常工作。

不过,如果能知道这个问题的根本原因是什么,那就太好了。





相关问题
How can I query NTFS disk quotas in C#?

I need to be able to find, for all users on a given remote machine, those users disk quotas and actual disk usage. I need to be able to do this reporting in a C# application. (Well, technically a DLL ...

WMI Poor Performance

I wrote a code in C# that maps logical drives to their physical disks, using WMI (System.Management). The code working perfectly, but slow like hell. In my machine (Windows 7 x64, Dual-Core with 3 GB ...

Closing Open Files using C#

I have a situation where people are connected to files on a share and it s blocking me from overwriting the file. I m trying to write a method that will look to see if a filePath that I provide is ...

Binding an SSL certificate to a port programmatically

I m working on a self-hosted WCF service for which encrypted communications is an option. Everything works fine when a certificate is already bound to the port as described here. However, I want to ...

热门标签