为什么WMI查询有时会这么慢?

时间:2009-09-14 21:19:16

标签: c# wmi

我在.Net中使用System.Management命名空间来对远程服务器执行各种WMI查询。在我的日志中,我可以看到有时查询需要30或40秒才能完成,而其他时候查询会在不到一秒的时间内完成。

当我看到这些慢查询时,我尝试使用wbemtest连接到该框,但它总是连接并快速执行查询。

任何想法,指示,建议?

在反射器中查看System.Management.ManagementScope时,我注意到它似乎泄漏了IWbemServices指针。看起来这是一个需要在其上调用Release的COM接口(Marshal.ReleaseComObject())。我不确定这是否相关。在整个过程中,我确实连接了许多不同的服务器。

4 个答案:

答案 0 :(得分:2)

您可以尝试设置WITHIN字段以查看它是否会更快地强制查询。你可以发布你正在使用的查询吗?这可能有助于调试任何进一步的问题

答案 1 :(得分:2)

我有相同类型的应用程序在所有不同类型的设备上执行多个WMI查询,我遇到相同的行为。使用wbemtest有时会更快但不一定。我还发现同一台机器上的一些查询与同一台机器上的其他查询的行为方式不同,因为不同的类是查询。

属于EnumerationOptions类的ReturnImmediately属性可以帮助您更快地获得结果,如果您在一个批处理中获取它们而不是通过网络枚举它们。

EnumerationOptions options = new EnumerationOptions();
options.ReturnImmediately = false;

你可以尝试一下,看看它是否有帮助。我知道这不是你想听到的,但我的个人意见是,你无能为力。您需要编写代码才能解决问题。真正的答案在于深埋在DCOM,WMI协议和WMI存储库中。

答案 2 :(得分:1)

问题特定于一个盒子吗?我曾经在远程方案中遇到过同样的问题。我通过在进行远程调用的盒子上重建TCP / IP堆栈来修复它。

答案 3 :(得分:0)

查看WBEM_FLAG_RETURN_IMMEDIATE& WBEM_FLAG_FORWARD_ONLY标记您的语言。使用Scriptomatic(来自MS的优秀小VBScript GUI进行WMI调用)时,此选项会自动添加为选项的一部分。 48表示WBEM_FLAG_RETURN_IMMEDIATE | WBEM_FLAG_FORWARD_ONLY。 VBScript示例:

objWMIService.ExecQuery ("Select * from Win32_NetworkConnection",,48)

https://msdn.microsoft.com/en-us/library/aa390880(v=vs.85).aspx