WQL就是WMI中的查詢語言,WQL的全稱是WMI Query Language,簡稱為WQL,翻譯成中文好像可以成為Windows管理規(guī)范查詢語言。熟悉SQL語言的朋友會感覺它和SQL非常相似。
WQL其實非常簡單,它有如下特點:
1、每個WQL語句必須以SELECT開始;
2、SELECT后跟你需要查詢的屬性名(我剛才對應(yīng)SQL將其稱之為字段名了),也可以像SQL一樣,以*表示返回所有屬性值;
3、FROM關(guān)鍵字;
4、你要查詢的類的名字;
5、另外,如果你想精確查詢結(jié)果還可以加上WHERE條件從句。比如某個類有Enable屬性,你可以在查詢的時候加上WHERE ENABLE=true。
如以下的都是正確的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中有一個自帶的WQL測試工具,叫wbemtest.exe,用它就能查看有哪些類和類有哪些 屬性,使用方法如下:
首先,運行wbemtest.exe,如下圖:
點“確定”之后會出現(xiàn)一個“Windows管理規(guī)范測試器”的窗口,如下圖:
點擊“連接”會出現(xiàn)一個對話框,我們可以選擇連接本地主機或者遠程主機,如下圖:
如果是本機測試并且是用管理員身份登錄,可以不用填寫用戶名和密碼,如果是鏈接遠程主機則需要填寫遠程主機上的用戶名和密碼(建議使用遠程主機上的管理員身份登錄),點擊“連接”之后就會回到主界面。注意,只有登錄之后才能查看和查詢。
點擊“查詢”按鈕,輸入我們要查詢的WQL語句,如"Select * From Win32_LogicalDisk",這是查詢系統(tǒng)邏輯驅(qū)動器的WQL語句,如圖:
這是我們多半會得到一個號碼為"0x80041010" ,描述為"無效類別"的錯誤,如下圖:
出現(xiàn)這個錯誤是因為剛開始默認的名稱空間為"root/default",這時我們需要更改名稱空間。再點擊“連接”按鈕,將默認的"root/default"更改為"root/cimv2",然后再點"連接"按鈕,如下圖:
登錄成功之后我們就可以查看系統(tǒng)有哪些類,并且還可以執(zhí)行WQL查詢了。
點擊"枚舉類別"按鈕,然后在彈出的對話框中輸入要查找的類名就可以查詢類的屬性了。如下圖(注意:我沒有填寫超類別名稱,并且選中"遞歸"單選按鈕,這樣就是遞歸列舉系統(tǒng)中所有的類):
查詢結(jié)果如下圖:
這些可都是有用的東西哦,如果你細心,你會這個列表里發(fā)現(xiàn)我以前所用到的WQL語句里設(shè)計到的所有的類,如Win32_LogicalDisk、Win32_share等等。需要注意的是,有些還有括號,這些是方法。
下面是一些查詢的結(jié)果:
我們還可以對其中某一項數(shù)據(jù)雙擊查看屬性,如下圖:
如果我們不習(xí)慣這種方式查看,我們還可以點擊上面這個窗口中的"顯示MOF“按鈕,下圖是我點擊"顯示MOF“按鈕的結(jié)果:
從上面的圖里就能看出這個類有哪些屬性及對應(yīng)的屬性值了。
今天的內(nèi)容看起來似乎和.net沒有什么聯(lián)系,但是只有了解并且熟悉了WQL才能使我們快速和順利地編寫.net代碼。
WMI 測試器 (wbemtest.exe) 演練
現(xiàn)在,您對可用于瀏覽和查看 CIM 的工具已經(jīng)有了一些認識,讓我們使用 WMI 測試器 (wbemtest.exe) 來檢查Win32_Process 類定義并修改清單 2,以便從在您的本地計算機上運行的進程檢索一些屬性。
打開一個命令提示,鍵入 C:\>wbemtest.exe,按下 Enter 來開始 WMI 測試器工具。請注意,大部分按鈕在主 WMI 測試器窗口上是被禁用的,這說明此時您沒有連接到 WMI。
單擊 Connect? 連接到本地或遠程計算機上的 WMI 服務(wù)。顯示“連接”對話框,它提供一個標(biāo)記為Namespace 的文本輸入?yún)^(qū)域,該區(qū)域默認值為 root\default。將 Namespace 區(qū)域的值更改為root\cimv2,單擊“連接”對話框的 Connect 按鈕返回到主 WMI 測試器窗口。
主窗口中左上角的命名空間標(biāo)識符應(yīng)該顯示為 root\cimv2。請注意,所有的按鈕現(xiàn)在都已啟用,這說明在當(dāng)前憑據(jù)環(huán)境下,您已經(jīng)成功連接到本地主機上的 WMI。單擊 Enum Classes? 打開“超類信息”對話框。
在“超類信息”對話框中,不要填寫 Enter superclass name 區(qū)域,單擊 Recursive 選項,單擊 OK 以枚舉 root\cimv2 名稱空間中定義的所有 CIM 類。
此時,您可能應(yīng)該正在查看一個列出了數(shù)百個類定義的“查詢結(jié)果”對話框。類的數(shù)量主要取決于您正在運行的 Windows 的版本。例如,如果使用 Windows 2000,則您應(yīng)該會看到大約 600 個類定義。如果運行 Windows XP,則您應(yīng)該會看到大約 900 個類定義。
請注意,列于“查詢結(jié)果”對話框頂部的類是以兩個下劃線為開頭的。這些是系統(tǒng)類。系統(tǒng)類是預(yù)定義的 CIM 類,支持內(nèi)部 WMI 配置與操作,例如提供程序注冊、命名空間安全性及事件通知等,F(xiàn)在,忽略系統(tǒng)類,向下滾動“查詢結(jié)果”對話框直至看到以 CIM_ 開頭的類。
名稱以 CIM_ 開頭的類是由 DMTF 維護的核心與公共基類。繼續(xù)向下滾動直至到達以 Win32_ 開頭的類。
名稱以 Win32_ 開頭的類是 Microsoft 擴展類,表示 Windows 特定的托管資源。如果這是您第一次檢查root\cimv2 命名空間,您可能希望熟悉 root\cimv2 命名空間中的類的完整集合,尤其是有 Win32_ 前綴的類。
向下滾動“查詢結(jié)果”對話框直至到達 Win32_Process 類,雙擊該類名打開 Win32_Process 對話框的對象編輯器。
“對象編輯器”對話框顯示被選定類的定義和實現(xiàn)的詳細信息(屬性和方法)。回憶一下我們之前討論的內(nèi)容 — 類定義是 WMI 可管理資源的藍圖。
選擇 Hide System Properties 復(fù)選框隱藏系統(tǒng)屬性。剩余的 Win32_Process 屬性表示您可以從在本地或遠程計算機上運行的進程檢索的信息。
要完成您的 WMI 腳本練習(xí),嘗試去檢索 Name、Handle 和 ProcessID 屬性。使用前面的三個清單之一作為模板,試著在進行到第 7 步之前運行腳本。
注 要在本地計算機上運行腳本,將 strComputer 變量的值設(shè)置為“.”(引號內(nèi)的一個單點)。
在運行新創(chuàng)建的 GetProcesses.vbs 腳本之后,您可以用 WIMI 測試器驗證腳本的結(jié)果。在 Win32_Process 對話框的對象編輯器中,單擊 Instances。產(chǎn)生的查詢結(jié)果對話框列出在計算機上運行的進程的實例。雙擊一個指定的進程實例,查看該實例的詳細信息。
WMI 測試器演練的答案
strComputer = "." ' Dot (.) equals local computer in WMI
Set wbemServices = Getobject("winmgmts:\\" & strComputer)
Set wbemObjectSet = wbemServices.InstancesOf("Win32_Process")
For Each wbemObject In wbemObjectSet
WScript.Echo "Name: " & wbemObject.Name & vbCrLf & _
" Handle: " & wbemObject.Handle & vbCrLf & _
" Process ID: " & wbemObject.ProcessID
Next