Skip to main content
 首页 » 编程设计

c#中WMI 查询太慢

2025年12月25日22freeliver54

我需要激活 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 中我没有完整的查询访问权限时,我才能将 CMD 集成到 C# 中

此查询有效:

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 查询,您只提取“名称”属性,这会提高您的性能,因此您的查询仅运行 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(); 

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