一段时间后 WMI 出错

Posted

技术标签:

【中文标题】一段时间后 WMI 出错【英文标题】:WMI erroring out after a while 【发布时间】:2009-03-20 07:39:16 【问题描述】:

我遇到了一些在 Windows 2003 Server 上运行的 VBScript 的有趣/烦人的问题(它们在 XP 上运行良好)。

脚本基本上定期调用 WMI 对象以提取性能信息并将其写入日志文件。它由每天早上 12:05 的计划任务启动并运行到午夜(或者如果它没有继续崩溃)。它归管理员所有,任务是"cscript xx.vbs blah blah blah"

有时它会运行几个小时,有时只运行几分钟。调用的形式为:

set objWMI = getObject("winmgmts:\\.\root\cimv2")
:   :   :
do lots of times:
    set itemCpu = wmi.get("Win32_PerfRawData_PerfOS_Processor.Name='_Total'")

它返回的错误是一个对话框,指出远程过程调用无法执行,但没有额外信息(它确实给出了一个 32 位十六进制数字,下次发生时我会用它更新这个问题,但是我的 Google 搜索出现了非常通用的页面,所以我不确定代码是否会有所帮助。

它也曾经在以下行中崩溃(同样的错误),但我没有看到这个问题,因为我将它更改为使用 Win32_Perf Raw Data_PerfOS_Memory。

set colMem = wmi.execQuery("select AvailableKBytes" & _
    " from Win32_PerfFormattedData_PerfOS_Memory",,48)

我认为它与网络无关,因为它在同一台机器上。

我还尝试将 objWMI 设置为空,并在每次循环中执行另一个 getObject,但这没有帮助。

另一个可能的问题,它实际上是在 VMWare Workstation 中运行的(但 XP 也是如此) - 下周我将在物理 PC 上运行 Win2k3 设置来测试它。

奇怪的是,它有时会运行几个小时而没有问题,收集数据并将其发送到日志文件。其他时候,它会在十分钟内崩溃。

我们中间的 Windows 专家有什么想法吗?

更新:

好吧,终于又失败了。这是我在截屏方面的一点努力:

+-------------------------------------------------+
|  Windows Script Host                          |X|
+-------------------------------------------------+
|  /   Script:   C:\Program Files\blah\blah.vbs  |
|  /\   Line:     271                             |
|       Char:     2                               |
|       Error:    The remote procedure call       |
|                 failed and did not execute.     |
|       Code:     800706BF                        |
|       Source:   SWbemServicesEx                 |
+-------------------------------------------------+

第 271 行是:

set itemCpu = wmi.get("Win32_PerfRawData_PerfOS_Processor.Name='_Total'")

wmi 之前已设置为:

set wmi = getObject("winmgmts:\\.\root\cimv2")

(这个在循环中不断被重新创建,所以我认为 RPC 连接过时不是问题)。

【问题讨论】:

关于事件中的错误,什么都没有? 事件查看器中什么都没有(我应该提到这一点)。 【参考方案1】:

错误 1722(0x6BF) 是:RPC 服务器不可用。

一个建议:在你的脚本中明确释放所有对象

要执行最佳诊断,请尝试使用Microsoft Network Monitor 3.2 嗅探您的网络并搜索问题。(查看此帮助How to capture network traffic with Network Monitor)

好看。

【讨论】:

原来这是部分修复。有几个对象没有被显式释放,尽管我认为当变量被分配其他东西或超出范围时它们会被释放。问题的另一半是尽可能地打击 WMI。 当我在完成所有对象后立即显式释放所有对象,并且每十秒只查询一次 WMI,问题就消失了。好吧,它可能仍然存在,但我的进程会在每个午夜重新启动,因此运行缓慢的位可能只会使其每 25 小时发生一次,而不是每 3 小时发生一次 :-) 所以,+1 并接受。你帮助我避免了用 C 重写东西。【参考方案2】:

如果您的脚本在运行时检查任何用户帐户,请查看此修补程序。这只是 2003 年的一个问题,这可以解释为什么它在您的 XP 系统上运行良好。

http://support.microsoft.com/kb/933593

它在工作中给我们造成了一些不完全符合文章描述的随机问题,但修补程序确实解决了我们的问题。

【讨论】:

@Jerb,为信息+1,但它没有解决我遇到的具体问题。

以上是关于一段时间后 WMI 出错的主要内容,如果未能解决你的问题,请参考以下文章

一段反编译后的C#代码段,不知道是啥意思,但是出错。

dubbo服务+spring动态数据源出错

向hbase中导入数据出错怎么办

mysql 批处理文件出错后继续执行

什么是WMI 有什么用?

获取响应流时出错 (ReadDone2):接收失败