2

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 QueryL3CACHESIZE

4

1 に答える 1

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クラスを試してください。

于 2013-04-08T16:19:20.900 に答える