基礎知識:WMI是一項核心的 Windows 管理技術;用戶可以使用 WMI 管理本地和遠程計算機。WQL就是 WMI 中的查詢語言,翻譯成中文好像可以成為 Windows 管理規范查詢語言。
1.如何獲取CPU的溫度與型號
由於視窗本身並無提供各項硬體溫度的監控方式,因此WMI雖然是的Windows提供的管理服務,但仍然需要硬體支援才能得到所需的資訊。
MSAcpi_ThermalZoneTemperature顧名思義是透過Acpi這個共同管理界面來查詢,因此您的系統必須具備Acpi熱區才有辦法問到,而Acpi熱區其實是筆記本電腦設計下的產品,在PC系統下並無Acpi熱區的設計。
一般在電腦上是使用Win32_TemperatureProbe進行查詢,但由於Win32_TemperatureProbe是直接問SMBIOS ,由SMBIOS裡面挖出資料,但SMBIOS是否有支援WMI是由主機板廠商決定。也就是說,若主板廠商有支援WMI ,便可以使用Win32_TemperatureProbe的CurrentReading讀到CPU溫度。但很不幸的,大多數(幾乎可說是全部)的主板廠商都沒有支援這項功能。
WMI的Windows管理規范提供系統,裝置和應用程式資訊,在.NET中提供的System.Management命名空間取得WMI的訊息,以下介紹如何取得CPU的溫度與序號。
使用ManagementObjectSearcher對象類別,使用前必須先將的System.Management加入引用
private void GetCPUTemperature() { double CPUtprt = 0; System.Management.ManagementObjectSearcher mos = new System.Management.ManagementObjectSearcher(@"root\WMI", "Select * From MSAcpi_ThermalZoneTemperature"); foreach (System.Management.ManagementObject mo in mos.Get()) { CPUtprt = Convert.ToDouble(Convert.ToDouble(mo.GetPropertyValue("CrrentTemperature").ToString()) - 2732) / 10; label1.Text = "CPU溫度:" + CPUtprt.ToString() + "°C\n"; } } private void GetCPUCode() { ManagementObjectSearcher moSearch = new ManagementObjectSearcher("SELECT * FROM Win32_Processor"); foreach (ManagementObject mObject in moSearch.Get()) { this.label1.Text+=(mObject["ProcessorId"].ToString()); } }
2.WQL知識
WQL就是 WMI 中的查詢語言,WQL 的全稱是 WMI Query Language,簡稱為 WQL,翻譯成中文好像可以成為 Windows 管理規范查詢語言。熟悉 SQL 語言的朋友會感覺它和 SQL 非常相似。
WQL 其實非常簡單,它有如下特點:
1、每個 WQL 語句必須以 SELECT 開始;
2、SELECT 後跟你需要查詢的屬性名(我剛才對應 SQL 將其稱之為字段名了),也可以像 SQL 一樣,以*表示返回所有屬性值;
3、FROM 關鍵字;
4、你要查詢的類的名字;
5、另外,如果你想精確查詢結果還可以加上 WHERE 條件從句。比如某個類有 Enable 屬性,你可以在查詢的時候加上 WHERE ENABLE=true。
就像這樣:
SELECT 字段名 FROM 類名
如以下的都是正確的 WQL 語句:
Select * From Win32_LogicalDisk where drivetype=3 ’‘’‘查詢所有硬盤分區
SELECT * FROM Win32_share ’‘查詢所有共享目錄
SELECT * FROM Win32_NetworkAdapterConfiguration WHERE DHCPEnabled=TRUE
SELECT Description FROM Win32_Account WHERE Name='Administrator'
SELECT Freespace,DeviceID FROM Win32_LogicalDisk
在 WinXP 和 Win2003 中有一個自帶的 WQL 測試工具,叫 wbemtest.exe,用它就能查看有哪些類和類有哪些 屬性,使用方法如下:
首先,運行 wbemtest.exe,如下圖:
點“確定”之後會出現一個“Windows 管理規范測試器”的窗口,如下圖:
點擊“連接”會出現一個對話框,我們可以選擇連接本地主機或者遠程主機,如下圖:
如果是本機測試並且是用管理員身份登錄,可以不用填寫用戶名和密碼,如果是鏈接遠程主機則需要填寫遠程主機上的用戶名和密碼(建議使用遠程主機上的管理員身份登錄),點擊“連接”之後就會回到主界面。注意,只有登錄之後才能查看和查詢。
點擊“查詢”按鈕,輸入我們要查詢的 WQL 語句,如"Select * From Win32_LogicalDisk",這是查詢系統邏輯驅動器的 WQL 語句,如圖:
這是我們多半會得到一個號碼為"0x80041010" ,描述為"無效類別"的錯誤,如下圖:
出現這個錯誤是因為剛開始默認的名稱空間為"root\default",這時我們需要更改名稱空間。再點擊“連接”按鈕,將默認的"root\default"更改為"root\cimv2",然後再點"連接"按鈕,如下圖:
登錄成功之後我們就可以查看系統有哪些類,並且還可以執行 WQL 查詢了。點擊"枚舉類別"按鈕,然後在彈出的對話框中輸入要查找的類名就可以查詢類的屬性了。如下圖(注意:我沒有填寫超類別名稱,並且選中"遞歸"單選按鈕,這樣就是遞歸列舉系統中所有的類):
查詢結果如下圖:
查看本欄目
這些可都是有用的東西哦,如果你細心,你會這個列表裡發現我以前所用到的 WQL 語句裡設計到的所有的類,如 Win32_LogicalDisk、Win32_share 等等。需要注意的是,有些還有括號,這些是方法。
下面是一些查詢的結果:
我們還可以對其中某一項數據雙擊查看屬性,如下圖:
如果我們不習慣這種方式查看,我們還可以點擊上面這個窗口中的"顯示 MOF“按鈕,下圖是我點擊"顯示MOF“按鈕的結果:
從上面的圖裡就能看出這個類有哪些屬性及對應的屬性值了。
今天的內容看起來似乎和.net 沒有什麼聯系,但是只有了解並且熟悉了 WQL 才能使我們快速和順利地編寫.net 代碼。
相信信息可以參照下面的地址了解:
http://msdn.microsoft.com/zh-cn/library/system.management.managementobjectsearcher(v=vs.100)
http://blog.useasp.net/archive/2013/06/15/the-tutorial-series-of-wql-that-the-sql-in-wmi-chapter-one-keywords.aspx
3.WQL類
那麼,在WMI中,我們有多少類可以供WQL查詢呢?這個Mitchell倒是沒有具體去統計數字,但在普通的操作中,能夠涉及到的卻並不是十分的多,我們可以用表格的形式列出在Win32下面比較常用的一些類。表格如下:
有了WMI類之後,我們就可以根據自己的需要來寫WQL來查詢系統中的各個數據了,比如我們想知道當前系統中有多少物理磁盤的存在,只需要下面這樣就能返回系統的磁盤實例:
SELECT * FROM Win32_DiskDrive
如果需要進一步了解這些物理磁盤的信息,可以從獲取的參數中去查找,這些參數,你可以查找MSDN上的幫助文檔即可,是不是非常的方便?