2

我需要获取 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

并且查询不起作用,为什么?

4

1 回答 1

2

根据您提供的 WMIC 查询,您只需要提取“名称”属性,这会提高您的性能,以便您的查询仅运行 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();

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

于 2018-10-14T07:01:18.453 回答