我们有一个.NET应用程序,它使用WMI在整个网络中的机器上收集大量信息,例如读取Win32_NTLogEvent以查看Symantec Antivirus是否已编写任何内容。查询工作正常,但在重复运行WMI查询后,“通用失败”错误将开始返回。大约在这之后非常一致地发生125个电话。重新启动我们正在运行WMI查询的计算机,始终修复错误...直到运行下125个查询。
看来存储库很好,我们无法找到任何日志文件大小问题。
更多信息 - 收到错误后找到WMIDiag并找到 -
25607 13:55:38(1)!!错误:报告WMI ENUMERATION操作错误:2 ERROR(S)!
25608 13:55:38(0)** - ROOT / CIMV2,SubClassesOf,'*',0x80041006 - (WBEM_E_OUT_OF_MEMORY)操作内存不足。
25609 13:55:38(0)** MOF注册:'C:\ WINNT \ SYSTEM32 \ WBEM \ SNMPREG.MOF “ 25610 13:55:38(0)** - Root / CIMv2,InstancesOf,'Win32_PerfFormattedData_PerfProc_Thread',0x8007000E - 没有足够的存储空间来完成此操作..
25611 13:55:38(0)** MOF注册:'C:\ WINDOWS \ SYSTEM32 \ WBEM \ WMI.MOF'
有人见过这个吗?想法?
答案 0 :(得分:4)
我们通过不同的WMI查询多次看到“通用失败”错误,我们基本上得出的结论是WMI不够稳定,不能用于原始管理以外的任何其他操作。几个月后,我们唯一的解决方案是拉出所有WMI调用并在纯API调用中找到替换。他们总是会工作一段时间,然后失败的“通用错误”(我知道这不是一个答案,但这是一个共享的经验,如果有人有答案,我会很高兴听到它。) / p>
答案 1 :(得分:2)
我相信我们已经找到了这个问题。为了简化我们的一些查询,我们在where子句中添加了类似1 = 1的内容,以简化查询的构建。删除了constant = constant,我正在测试的一个查询从40秒到.4秒,并且运行了10,000次而没有产生一般性故障(WBEM_E_OUT_OF_MEMORY)。
答案 2 :(得分:0)
Windows远程管理(WinRM)可以克服所有这些问题。 WinRM是WS-Management Protocol的Microsoft实现,WS-Management Protocol是一种基于标准的简单对象访问协议(SOAP)。
答案 3 :(得分:0)
尝试通过WMI在远程计算机上卸载/安装软件时,我遇到了类似的问题。
问题出现在目标计算机上存在漫游配置文件的位置。这可能是因为已经在目标机器上查询了WMI。
我不知道这是否是同一个问题,但在我尝试卸载软件之前,我必须检查一下是否在我的配置文件位于目标计算机上的Documents and Settings文件夹中。
我假设当您运行查询时,它会在本地计算机上创建您的配置文件。
每当我尝试在我之前使用过remotley的机器上卸载软件时,我都收到了Generic Failure消息。
现在我确保在尝试卸载/安装软件组件remotley之前,我的配置文件已从目标计算机中删除。从那以后我没有遇到任何问题。
希望这有助于任何人。