我正在研究用于检查是否正在运行许多服务的perl脚本。为此,我们使用WMI查询远程Windows服务器:
my $WMI_locator = Win32::OLE->new('WbemScripting.SWbemLocator');
$WMI_locator->{Security_}->{AuthentificationLevel} = 6;
my $computer = $WMI_locator->ConnectServer($server, 'root\cimv2', $adminuser, $adminpasswd);
my $services = $computer->ExecQuery('SELECT * FROM Win32_Service', 'WQL', $flag_return_immediately | $flag_forward_only);
在我的开发笔记本电脑上执行时,此代码段可以完美运行。但是,当我尝试从生产服务器运行它时,会发生奇怪的事情:对于某些远程Windows计算机,我只能获得“服务”列表的大约一半。
我对此进行了调查,发现问题仅发生在具有大量服务(大约150个)的服务器上,并且它们的平均ping有所不同(本地为60毫秒,生产服务器为215毫秒)。这个问题似乎来自WMI,而不是perl。我尝试从DOS命令行查询服务器,尽管尝试查询CPU工作正常,但尝试获取服务时却出现错误:
E:\>wmic /NODE:server /USER:adminuser /PASSWORD:adminpasswd SERVICE GET Caption, State
Node - server
ERROR:
Code = 0x800706be
Description = The remote procedure call failed.
Facility = Win32
E:\>wmic /NODE:server /USER:adminuser /PASSWORD:adminpasswd CPU GET Name, Status
Name Status
Intel(R) Xeon(R) CPU X5650 @ 2.67GHz OK
Intel(R) Xeon(R) CPU X5650 @ 2.67GHz OK
Intel(R) Xeon(R) CPU X5650 @ 2.67GHz OK
Intel(R) Xeon(R) CPU X5650 @ 2.67GHz OK
考虑到这一点,我想这个问题与网络有关,但是我们现在正在研究一个我不熟悉的国家。是否有我遗漏的某些参数和/或我做事的方式有问题?
感谢您的回答!
最佳答案
几乎总是(尽管不是排他性的)此错误是由不同版本的SQL Server的多个实例引起的。要缩小问题的范围,请尝试WMI Diagnostic Utility,它旨在帮助解决此类问题。
关于perl - WMI查询返回不完整的结果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26467319/