【Base】:WMI是一項(xiàng)核心的 Windows 管理技術(shù);用戶可以使用 WMI 管理本地和遠(yuǎn)程計(jì)算機(jī)。WQL就是 WMI 中的查詢語言,翻譯成中文好像可以成為 Windows 管理規(guī)范查詢語言。
1.如何獲取CPU的溫度與型號(hào)
由于視窗本身并無提供各項(xiàng)硬體溫度的監(jiān)控方式,因此WMI雖然是的Windows提供的管理服務(wù),但仍然需要硬體支援才能得到所需的資訊。
MSAcpi_ThermalZoneTemperature顧名思義是透過Acpi這個(gè)共同管理界面來查詢,因此您的系統(tǒng)必須具備Acpi熱區(qū)才有辦法問到,而Acpi熱區(qū)其實(shí)是筆記本電腦設(shè)計(jì)下的產(chǎn)品,在PC系統(tǒng)下并無Acpi熱區(qū)的設(shè)計(jì)。
一般在電腦上是使用Win32_TemperaturePRobe進(jìn)行查詢,但由于Win32_TemperatureProbe是直接問SMBIOS ,由SMBIOS里面挖出資料,但SMBIOS是否有支援WMI是由主機(jī)板廠商決定。也就是說,若主板廠商有支援WMI ,便可以使用Win32_TemperatureProbe的CurrentReading讀到CPU溫度。但很不幸的,大多數(shù)(幾乎可說是全部)的主板廠商都沒有支援這項(xiàng)功能。
WMI的Windows管理規(guī)范提供系統(tǒng),裝置和應(yīng)用程式資訊,在.NET中提供的System.Management命名空間取得WMI的訊息,以下介紹如何取得CPU的溫度與序號(hào)。
使用ManagementObjectSearcher對(duì)象類別,使用前必須先將的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知識(shí)
WQL就是 WMI 中的查詢語言,WQL 的全稱是 WMI Query Language,簡稱為 WQL,翻譯成中文好像可以成為 Windows 管理規(guī)范查詢語言。熟悉 SQL 語言的朋友會(huì)感覺它和 SQL 非常相似。
WQL 其實(shí)非常簡單,它有如下特點(diǎn):
1、每個(gè) WQL 語句必須以 SELECT 開始;
2、SELECT 后跟你需要查詢的屬性名(我剛才對(duì)應(yīng) SQL 將其稱之為字段名了),也可以像 SQL 一樣,以*表示返回所有屬性值;
3、FROM 關(guān)鍵字;
4、你要查詢的類的名字;
5、另外,如果你想精確查詢結(jié)果還可以加上 WHERE 條件從句。比如某個(gè)類有 Enable 屬性,你可以在查詢的時(shí)候加上 WHERE ENABLE=true。
就像這樣:
SELECT 字段名 FROM 類名
如以下的都是正確的 WQL 語句:
Select * From Win32_LogicalDisk where drivetype=3 ’‘’‘查詢所有硬盤分區(qū)
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 中有一個(gè)自帶的 WQL 測(cè)試工具,叫 wbemtest.exe,用它就能查看有哪些類和類有哪些 屬性,使用方法如下:
首先,運(yùn)行 wbemtest.exe,如下圖:

點(diǎn)“確定”之后會(huì)出現(xiàn)一個(gè)“Windows 管理規(guī)范測(cè)試器”的窗口,如下圖:

點(diǎn)擊“連接”會(huì)出現(xiàn)一個(gè)對(duì)話框,我們可以選擇連接本地主機(jī)或者遠(yuǎn)程主機(jī),如下圖:

如果是本機(jī)測(cè)試并且是用管理員身份登錄,可以不用填寫用戶名和密碼,如果是鏈接遠(yuǎn)程主機(jī)則需要填寫遠(yuǎn)程主機(jī)上的用戶名和密碼(建議使用遠(yuǎn)程主機(jī)上的管理員身份登錄),點(diǎn)擊“連接”之后就會(huì)回到主界面。注意,只有登錄之后才能查看和查詢。
點(diǎn)擊“查詢”按鈕,輸入我們要查詢的 WQL 語句,如"Select * From Win32_LogicalDisk",這是查詢系統(tǒng)邏輯驅(qū)動(dòng)器的 WQL 語句,如圖:

這是我們多半會(huì)得到一個(gè)號(hào)碼為"0x80041010" ,描述為"無效類別"的錯(cuò)誤,如下圖:

出現(xiàn)這個(gè)錯(cuò)誤是因?yàn)閯傞_始默認(rèn)的名稱空間為"root/default",這時(shí)我們需要更改名稱空間。再點(diǎn)擊“連接”按鈕,將默認(rèn)的"root/default"更改為"root/cimv2",然后再點(diǎn)"連接"按鈕,如下圖:

登錄成功之后我們就可以查看系統(tǒng)有哪些類,并且還可以執(zhí)行 WQL 查詢了。點(diǎn)擊"枚舉類別"按鈕,然后在彈出的對(duì)話框中輸入要查找的類名就可以查詢類的屬性了。如下圖(注意:我沒有填寫超類別名稱,并且選中"遞歸"單選按鈕,這樣就是遞歸列舉系統(tǒng)中所有的類):

查詢結(jié)果如下圖:

這些可都是有用的東西哦,如果你細(xì)心,你會(huì)這個(gè)列表里發(fā)現(xiàn)我以前所用到的 WQL 語句里設(shè)計(jì)到的所有的類,如 Win32_LogicalDisk、Win32_share 等等。需要注意的是,有些還有括號(hào),這些是方法。
下面是一些查詢的結(jié)果:


我們還可以對(duì)其中某一項(xiàng)數(shù)據(jù)雙擊查看屬性,如下圖:

如果我們不習(xí)慣這種方式查看,我們還可以點(diǎn)擊上面這個(gè)窗口中的"顯示 MOF“按鈕,下圖是我點(diǎn)擊"顯示MOF“按鈕的結(jié)果:

從上面的圖里就能看出這個(gè)類有哪些屬性及對(duì)應(yīng)的屬性值了。
今天的內(nèi)容看起來似乎和.net 沒有什么聯(lián)系,但是只有了解并且熟悉了 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查詢呢?這個(gè)Mitchell倒是沒有具體去統(tǒng)計(jì)數(shù)字,但在普通的操作中,能夠涉及到的卻并不是十分的多,我們可以用表格的形式列出在Win32下面比較常用的一些類。表格如下: