PowerShell 2.0之使用WMI管理Windows(三)對WMI對象的語言支持

管理大型的異構網絡非常繁瑣,而在本地計算機上用不同的自動化接口,如PowerShell、COM對象,甚至基於.NET的程序管理單獨的程序和服務則容易得多。關鍵是存在於混合網絡中的分佈式系統,即如何操作防火牆後面的設備。如果它只是一種硬件設備,如路由器,則使用WMI(Windows Management Instrumentation)即可。WMI是協同工作的一系列技術,可以提供網絡對象的統一訪問形式。並且用其查詢服務信息,尤其是各種形式的數據、觸發命令,以及改變配置選項。

在第2個PowerShell版本中針對WMI對象增加了很多語言增強功能,允許用戶使用類似URL的字符串作爲WMI對象的別名。

首先介紹將包含WQL查詢字符串轉換爲WMI查詢對象,這個類型是[wmisearcher],由此可以引申出ManagementObjectSearcher對象。搜索對象只有一個Get()方法,用於執行WMI查詢,返回值是匹配的對象。仍以搜索winword.exe進程爲例,如圖1所示,該實例是關於通過搜索對象獲取當前系統中運行的Word進程信息的方法。

image

圖1 使用WQL查詢winword.exe進程

當需要本地對象時,在方法間傳遞對象沒有意義。但需要從遠程主機取回對象時,因爲需要爲searcher對象設置作用域(scope)屬性和爲遠程連接配置適當的參數,如目標地址、CIM命名空間,以及用戶憑據,但是確定這些內容似乎有些過於複雜。調用Get-WmiObject並傳遞-computer和-credential參數則更爲簡單。

最簡單的方法是將對象路徑也轉換爲真實的對象,保存相關的參數,如進程ID或服務名很有必要。這樣可以運行WQL查詢,得到真實的對象。可以使用[wmi]類型名強制類型轉換創建相對或絕對的對象地址。圖2所示代碼用來獲取DNS cache 服務引用的絕對和相對地址。

image

圖2 使用[wmi]獲取對象絕對和相對地址

用對象路徑檢索對象非常方便,而且被所有的對象類型支持,在使用絕對地址時還能訪問遠程主機對象。如果使用Get-WmiObject,需要針對不同類型的對象採用不同的WQL查詢,如進程對象的查詢不適用於服務。因爲進程用其Handle屬性作爲路徑組件,而服務卻使用Name屬性。使用Get-WmiObject的最好場景莫過於使用不同默認憑證連接到遠程主機。

WMI允許用戶獲取類的應用,PowerShell可以將使用包含類名的字符串轉換爲正確的WMI類,需要使用的類名是[wmiclass]。獲取類允許用戶調用靜態方法,或者不屬於對象的方法。作爲示範,這裏使用Win32_Process類的Create()創建新進程,運行結果如圖3所示。

image

圖3 使用[wmiclass]創建新進程的運行結果

上述實例中的方法返回一個包含新創建進程ID_PARAMETERS對象,可以用這些信息獲取進程的引用。圖4所示爲通過進程ID作爲Handle屬性值獲取程序絕對位置的方法。

image

圖4 獲取程序絕對位置的方法

WMI類的類型轉換語法非常便捷,但不可將其應用在遠程主機上。需要找到一種方法通過標準的WQL獲取類對象的引用,並用Get-WmiObject傳遞。可以使用CIM包含類元數據,通過檢索meta_class對象的實例來獲取類對象。圖5所示爲使用這種方法獲取Win32_Process類。

image

圖5 獲取Win32_Process類

過濾器使用_THIS這個特殊的屬性指向這個類對象,如果當前類是Win32_Process或繼承於Win32_Process,則ISA操作將返回真。爲驗證獲取遠程主機信息的效果,在遠程主機上創建notepad.exe進程,如圖6所示。

image

圖6 使用gwmi在遠程主機上的創建notepad.exe進程

1 獲得類和命名空間清單

每個WMI類是meta_class的實例,可以在命名空間中檢索類清單。需要的只是發出一個獲取指定類的所有實例的請求,圖7所示爲使用Get-WmiObject獲取類清單的結果。

image

圖7 使用Get-WmiObject獲取類清單的結果

在執行上述命令後能夠得到很長的清單,分爲兩列,分別顯示類名和實際的類。如果需要查看較小範圍內的結果,可以通過WQL語言提供一個過濾器,如圖13所示,獲取所有名稱以Win32開頭的字符串。

Get-WmiObject cmdlet有個用於在命名空間中獲取所有類快捷方式,可以通過提供-list開關獲取所有的類清單,如圖8所示。

image

圖8 獲取所有名稱以Win32開頭的字符串

image

圖9 獲取所有的類清單

上述操作存在一些限制,-filter參數無效,前面的所有查詢都基於默認的命名空間root/cimv2。爲了從其他命名空間獲取類,需要-namespace參數。爲知道當前系統中的命名空間,需要獲取_NAMESPACE類的所有實例。命名空間分等級,其根節點是root命名空間。如圖10所示爲獲取根命名空間下的所有空間。

image

圖10 獲取root下的所有命名空間

當然獲取一個命名空間下的另外一個只需要在-namespace參數中傳遞相應的命名空間結構,獲取命名空間root/Microsoft下所有記錄的方法如圖11所示。

image

圖11 獲取root/Microsoft命名空間所有記錄的方法

2 WMI系統屬性

每一個WMI對象都有一些特別的屬性,允許用戶獲得系統相關的信息。在WMI文檔中稱之爲“系統屬性”,並且均以雙下畫線開頭。以_CLASS爲例,用戶可以用其獲取對象的附加信息。

這些屬性介紹如下。

(1)_CLASS:保存對象的類名。可以用其校驗查詢返回的對象類是否是爲預期。

(2)_SUPERCLASS:保存父類名。

(3)_DYNASTY:包含對象類來源的頂層類,以及超類的最終來源。

(4)_DERIATION:所有對象類來源類的集合,其中第1個元素是_SUPERCLASS類,最後一個是_DYNASTY類。

(5)_NAMESPACE:保存包含對象類的名命名空間的字符串。

(6)_GENUS:用於區別類和對象,類對象的值爲1;對象的值爲2。

(7)_SERVER:包含對象所在的主機名。

(8)_PATH:包含對象所在的絕對路徑。

(9)_RELPATH:對象的相對路徑,只適用於運行在同一主機上的對象及其客戶端。

(10)_PROPERTY_COUNT::包含對象擁有的非系統屬性的數量。

3 總結

WMI是一系列能夠用於日程管理工作的成熟技術,隨着Windows遠程管理時代的到來,因爲可以在不重新配置防火牆允許DCOM流量,從而使得WMI變得更具吸引力。在所有與WMI相關的腳本工具中,PowerShell是學習、掌握和使用WMI最簡單的一個。

學習WMI是一個漫長的過程,因爲其中包含大量編程涉及的對象需要掌握,讀者可以從微軟腳本中心的腳本資料庫http://www.microsoft.com/technet/scriptcenter/ default.mspx中獲取很多有用的知識。其中包含大量的腳本實例,絕大多數是使用WMI編程操作系統組件;另外一個獲取WMI類參考的網址是http://msdn.microsoft.com/en-us/library/aa394554.aspx,這個頁面是WMI類的資料索引。其中包含所有類完整的文檔,可以從中間找到任何一個特定的屬性和方法。最後,可以通過DMTF的規範http://www.dmtf.org/standards/wbem獲取WBEM的整體概況並通過DMTF指南http://www.wbemsolutions.com/tutorials/DMTF獲取標準的一些基本知識。

 

作者: 付海軍
出處:http://blog.csdn.net/fuhj02
版權:本文版權歸作者和csdn共有
轉載:歡迎轉載,爲了保存作者的創作熱情,請按要求【轉載】,謝謝
要求:未經作者同意,必須保留此段聲明;必須在文章中給出原文連接;否則必究法律責任
個人網站: http://txj.shell.tor.hu/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章