如何处理WMI的管理异常
本文关键字:WMI 管理 异常 处理 何处理 | 更新日期: 2023-09-27 18:08:05
我正在使用WMI读取处理器的详细信息WIN32_PROCESSOR。目前我正试图读取这些属性:SELECT CAPTION,L2CACHESIZE,L3CACHESIZE FROM WIN32_PROCESSOR
。这样我就可以使用下面的代码:
static void Main(string[] args)
{
string strQuery = "SELECT CAPTION,L2CACHESIZE,L3CACHESIZE FROM WIN32_PROCESSOR";
string strIPAddress = "XXX.XXX.X.XXX";
DataTable dtProcessor = new DataTable();
dtProcessor.Columns.Add("CAPTION");
dtProcessor.Columns.Add("L2CACHESIZE");
dtProcessor.Columns.Add("L3CACHESIZE");
ManagementScope scope = new ManagementScope(@"''" + strIPAddress + @"'root'cimv2");
SelectQuery query = new SelectQuery();
query.QueryString = strQuery;
ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query);
ManagementObjectCollection queryCollection = searcher.Get();
foreach (ManagementObject mngmntObj in queryCollection)
{
DataRow dr = dtProcessor.NewRow();
dr["CAPTION"] = mngmntObj["CAPTION"];
dr["L2CACHESIZE"] = mngmntObj["L2CACHESIZE"];
dr["L3CACHESIZE"] = mngmntObj["L3CACHESIZE"];
dtProcessor.Rows.Add(dr);
}
}
这在我的Windows Server 2008R2机器上工作得很好,但是相同的代码给了我System.Management.ManagementException
-> Invalid Query
的例外,因为L3CACHESIZE
不存在于XP中,如这里所讨论的。如何处理读取当前值的问题?
如果您想要检查是否存在wmi属性,您可以使用ManagementBaseObject.Properties
属性并遍历集合。
试试这样
static void Main(string[] args)
{
string strQuery = "SELECT * FROM WIN32_PROCESSOR";
string strIPAddress = "XXX.XXX.X.XXX";
DataTable dtProcessor = new DataTable();
dtProcessor.Columns.Add("CAPTION");
dtProcessor.Columns.Add("L2CACHESIZE");
dtProcessor.Columns.Add("L3CACHESIZE");
ManagementScope scope = new ManagementScope(@"''" + strIPAddress + @"'root'cimv2");
SelectQuery query = new SelectQuery();
query.QueryString = strQuery;
ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query);
ManagementObjectCollection queryCollection = searcher.Get();
List<string> properties = new List<string>();
foreach (ManagementObject mngmntObj in queryCollection)
{
if (properties.Count==0)
{
foreach (PropertyData property in mngmntObj.Properties)
properties.Add(property.Name);
}
DataRow dr = dtProcessor.NewRow();
dr["CAPTION"] = mngmntObj["CAPTION"];
dr["L2CACHESIZE"] = mngmntObj["L2CACHESIZE"];
if (properties.Contains("L3CACHESIZE", StringComparer.OrdinalIgnoreCase))
{
dr["L3CACHESIZE"] = mngmntObj["L3CACHESIZE"];
}
dtProcessor.Rows.Add(dr);
}
}
对于这种特殊情况,如果你想获得与内存缓存相关的信息,请尝试win32_cachemmemory类