WMI查询太慢

时间:2018-10-05 09:22:18

标签: c# wmi wmi-query get-wmiobject

我需要激活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

查询不起作用,为什么?

1 个答案:

答案 0 :(得分:1)

根据您提供的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)

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();

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