C# WMI查询太慢

C# WMI查询太慢,c#,wmi,wmi-query,get-wmiobject,C#,Wmi,Wmi Query,Get Wmiobject,我需要get Office已激活或需要激活,并且我在WMI中使用普通查询: ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM " + wmi + " WHERE Name LIKE \"%Office%\" "); fo

我需要get Office已激活或需要激活,并且我在WMI中使用普通查询:

 ManagementObjectSearcher searcher =
                        new ManagementObjectSearcher("root\\CIMV2",
                        "SELECT * FROM " + wmi + " WHERE Name LIKE \"%Office%\" ");

                    foreach (ManagementObject queryObj in searcher.Get())
                    { 
                        queryObj["Name"].ToString() + "', '" + queryObj["LicenseStatus"].ToString();                           
但是这个查询有时需要45/50秒,现在我必须了解如何替换它或加速它,因为如果我使用CMD中的这个命令

WMIC /NAMESPACE:\\root\CIMV2 PATH SoftwareLicensingProduct WHERE LicenseStatus=1 GET Name
它在2秒钟内响应!但我不能将CMD集成到C#中,只有在运行外部命令并且从CMD我没有完全的查询访问权限的情况下

此查询工作:

WMIC /NAMESPACE:\\root\CIMV2 PATH SoftwareLicensingProduct WHERE "name like '%Office%'" Get Name
现在添加LicenseStatus=1

WMIC /NAMESPACE:\\root\CIMV2 PATH SoftwareLicensingProduct WHERE "name like '%Office%'" and LicenseStatus=1 Get Name

而查询不起作用,为什么?

根据您提供的WMIC查询,您只需提取“Name”属性,这是提高性能的原因,因此您的查询只运行2秒钟

所以这个

WMIC /NAMESPACE:\\root\CIMV2 PATH SoftwareLicensingProduct WHERE LicenseStatus=1 GET Name
将在您的代码中转换为此查询

SELECT Name FROM SoftwareLicensingProduct WHERE LicenseStatus=1
你的另一个例子是正确的,但你只需要移动你的第二个引号

WMIC /NAMESPACE:\\root\CIMV2 PATH SoftwareLicensingProduct WHERE "name like '%Office%' and LicenseStatus=1" Get Name
在您的代码中,它看起来是这样的(由于您在例程中引用了该属性,所以我也将LicenseStatus添加到了查询中)


这应该运行得相当快,因为它只获得了您正在使用的两个属性。

此博客将非常有用,有助于了解性能差异。cmd真的可以捕获吗?没有%%的时间change@MarcusJ.Kennedy:嗯,你可以运行“控制台”在您的应用程序中编程并捕获它的输出请参阅有问题的查询更新,请帮助我
ManagementObjectSearcher searcher =
                        new ManagementObjectSearcher("root\\CIMV2",
                        "SELECT Name, LicenseStatus FROM " + wmi + " WHERE Name LIKE \"%Office%\" and LicenseStatus=1");

                    foreach (ManagementObject queryObj in searcher.Get())
                    { 
                        queryObj["Name"].ToString() + "', '" + queryObj["LicenseStatus"].ToString();