2013-04-08 102 views
2

我正在使用WMI讀取處理器的詳細信息WIN32_PROCESSOR。目前我正試圖讀取這些屬性:SELECT CAPTION,L2CACHESIZE,L3CACHESIZE FROM WIN32_PROCESSOR。這樣,我就用下面的代碼工作:如何處理WMI的管理異常

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 2008 R2的計算機上工作正常,但相同的代碼給我的System.Management.ManagementException例外 - >Invalid Query因爲L3CACHESIZE不存在於XP所討論here。 什麼可以是最好的方式來處理這與閱讀值存在?

回答

1

如果要檢查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_CacheMemory