C# WMI查询太慢
我需要get Office已激活或需要激活,并且我在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
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();