【问题标题】:How to handle management exception for WMI如何处理 WMI 的管理异常
【发布时间】:2013-04-08 08:47:51
【问题描述】:

我正在使用 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 中不存在,正如 here 所讨论的那样。 通过读取存在的值来处理这个问题的最佳方法是什么?

【问题讨论】:

    标签: c# .net wmi wmi-query


    【解决方案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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-07
      • 2018-08-25
      • 1970-01-01
      • 2011-06-05
      • 2012-07-26
      • 1970-01-01
      相关资源
      最近更新 更多