從WMI / WIN32挖出更多電腦的資訊

從WMI / WIN32挖出更多電腦的資訊

  一般來說,有些人喜歡用Performance Counter去取得電腦的相關資訊,例如CPU的Loading及HD的IO,但有些資訊是Performance Counter並不提供的,這時,就可以透過WMI及WIN32取得更多的資訊,例如CPU的型號,Socket,外頻,電壓,溫度,BIOS..等. 當然部份資訊必需是硬體有這功能才能取得到的,像是溫度資訊,如果主機板沒有這個資訊提供,那就無法得到任何資訊了.

  講到這裡,WMI及WIN32到底有那些資訊可以提供?算起來真的很多,這裡就不一一的列示出來了,需要的人可以至MSDN內去看,找出那些資訊是你所需要用的到,以下就以取得CPU的資訊的程式碼範例.



try
{
    DataTable dt = New DataTable("TestData");

    dt.Columns.Add("DeviceID",typeof(string));
    dt.Columns.Add("Name", typeof(string));
    dt.Columns.Add("LoadPercentage", typeof(string));
    dt.Columns.Add("MaxClockSpeed", typeof(string));
    dt.Columns.Add("CurrentClockSpeed", typeof(string));
    dt.Columns.Add("CurrentVoltage", typeof(string));
    dt.Columns.Add("DataWidth", typeof(string));
    dt.Columns.Add("ExtClock", typeof(string));
    dt.Columns.Add("SocketDesignation", typeof(string));
         
    ManagementObjectSearcher mos = new ManagementObjectSearcher(@"root\cimv2", "select * from Win32_Processor");

    //第一個參數填入這個Class的NameSpace,參考MSDN內的說明,就可以找到Win32_Processor的Namespace是什麼
    //第二個參數就跟SQL語法一樣,用Select的方法,取得Win32_Processor的資訊
    foreach (ManagementObject mo in mos.Get()) 
    {//在這裡,我是用Foreach的迴圈去取得CPU的資訊,因為CPU有可能是多核心的,所以要用迴圈去取得所有CPU的資訊
        DataRow dr = tmpdt.NewRow();
        dr["DeviceID"] = mo.Properties["DeviceID"].Value.ToString();//CPU的ID
        dr["Name"] = mo.Properties["Name"].Value.ToString().Trim();//CPU的名稱,ex :Intel(R) Pentium(R) 4 CPU 2.60GHz
        dr["LoadPercentage"] = mo.Properties["LoadPercentage"].Value.ToString();//Loading
        dr["MaxClockSpeed"] = mo.Properties["MaxClockSpeed"].Value.ToString();//最大頻率
        dr["CurrentClockSpeed"] = mo.Properties["CurrentClockSpeed"].Value.ToString();//目前頻率
        dr["CurrentVoltage"] = mo.Properties["CurrentVoltage"].Value.ToString();//目前電壓
        dr["DataWidth"] = mo.Properties["DataWidth"].Value.ToString();//位元
        dr["ExtClock"] = mo.Properties["ExtClock"].Value.ToString();//外頻
        dr["SocketDesignation"] = mo.Properties["SocketDesignation"].Value.ToString();//Socket描述 ex: Socket 478
        dt.Rows.Add(dr);
    }

    DataGrid1.DataSource=dt;
}
catch (Exception ex)
{
    MessageBox.Show(ex.Message);
}

 

  以上,就可以找出CPU的更詳細的資訊,其它像是BIOS,Share資源等資訊,同樣也是用此方式取得資訊,而各個Class可以取得什麼樣的資訊,於MSDN內都有詳細的說明. 以小弟的另一個自製程式ShareWatch,就是用此方式來找出電腦現在有那些共享資源,並有誰正在讀取這些資源,如果加上FileSystemWatch的功能,還可以知道使用者在異動那些檔案,或是電腦溫度過高時,發出Alter給相關管理維護人員,相信有了這些資訊後,可以做到相當多的應用,而怎麼用,就看你的想法囉.

 

參考資訊 : MSDN