【第159期 December 8, 2010】
 

研發新視界

WMI (Windows Management Instrumentation) 介紹及應用

作者/史印辰

[發表日期:2010/11/18]



前言

WMI(Windows Management Instrumentation)是微軟根據DMTF(Distributed Management Task Force)所制訂的Web-based Enterprise Management(WBEM)為基礎的實作。眾多的系統、周邊、網路、通訊等軟硬體大廠為了讓系統管理人員便於管理大型的企業網路,所以聯合組成DMTF,希望能透過DMTF訂出讓各家廠商共同遵守的規格,進而簡化產品之間的溝通與聯繫。

因此,WBEM便是DMTF所制訂出來的規格,之後各個大廠再依據這個共通的規格,各自實作出自己的管理介面或是管理工具。而微軟便是根據DMTF/WBEM實作出WMI;也可以說,WMI是微軟視窗版的WBEM;WBEM是根據DMTF的CIM(Common Information Model)所制訂出來的。

WMI的目的

我們平常在使用電腦時,有時候會需要取得電腦系統中的某些資訊,例如C碟磁中剩餘的硬碟空間或是CPU、Memory的使用率等。我們知道可以用人工的方法透過檔案總管或是系統管理員取得剩餘硬碟空間或是CPU、Memory的使用率數字,但是是否想過要如何利用程式自動取得這種資訊呢?例如希望安裝程式能夠判斷硬碟空間的大小,當硬碟空間小於某個數字時就停止安裝,或是當CPU或Memory的使用率超過一定數值時發出警示,那程式該如何寫呢?

其實所有的電腦或網路日常維護管理工作的第一步都是如何取得系統的各項狀態資訊,但是在不同系統之間因為其資訊內容各異,取得資訊的方法也大有不同,所以傳統的管理人員光是想要搜集到所有的管理資訊,恐怕就先要練就十八般武藝。

就實用或使用角度而言,WMI其實是一個龐大的物件模組,透過這個物件模組,程式設計師可以掌控整個Windows系統的軟硬體資源,包括目前登入的使用者、執行中的行程(process)或服務(service)、連線的印表機、磁碟空間等。

簡單來說,WMI將程式設計師/系統管理者與作業系統資源隔開,如果程式設計師想要開發Windows系統管理程式,或者是系統管理者想要利用如VBScript、或JavaScript等描述語言自行撰寫系統管理的小程式,都可以直接利用WMI所提供的類別來完成,而不需另行透過Win32 API或其他的程式庫。

另外,由於WMI已經完全考慮到遠端遙控、網路處理的狀況,因此系統管理者可以輕易地利用WMI物件模組並透過網路來管理遠端的Windows伺服器。

WMI的架構

WMI是一個三套式架構的模型,由上而下分別是 WMI資料提供者(WMI Provider)、CIM物件管理員(CIM Object Manager)以及WMI資訊請求者(WMI Consumer)。


《圖一》


一、WMI資料提供者(WMI Provider):

WMI Provider正是WMI與這些資料來源之間的中介。當WMI架構中需要得到某項被管理系統的資訊時,就會命令WMI Provider到被管理系統中取回資料。其實WMI Provider除了可以從資料來源讀出資訊之外,必要時還可以寫入資訊。

被WMI管理的物件可能是Windows作業系統的行程、服務,或者是安裝在Windows的硬體周邊設備。不論是Windows系統上的軟體或硬體資源,都必須透過各自的WMI Provider,將相關的資訊或規格提供給WMI Object Model,以便程式設計師或系統管理者藉以掌控。

二、CIM物件管理員(CIM Object Manager):

中間這一層是上、下兩層以及WMI repository相互運作的媒介,其中包含了撰寫程式需要叫用的WMI類別,例如自己寫的管理程式若要處理WMI provider提供的資訊,就要透過這一層的協助。

因為資料來源種類太多,CIM希望統一其呼叫方式,因此在WMI架構之下,當網管人員或網管系統需要某項系統管理資訊時,WMI Data Consumer並不需要知道各項資料來源的真正位置及呼叫方式,而是透過WMI所訂的統一資料格式,以查詢語言向CIMOM提出請求。

對CIMOM而言,每一個WMI Provider被視為一個外掛模組,透過COM(Common Object Model)的介面與CIMOM溝通。CIMOM會隨時追蹤現在有那些類別的資料可以提供查詢,以及應該由那一個WMI Provider負責回應資料。CIMOM也有一個自已的資料庫,存放靜態的系統資料,因此當CIMOM收到這類資料請求時能不必等待WMI Provider傳回的資料就立即回應。

三、WMI資訊請求者(WMI Consumer):

一切需要借助於WMI取得管理資訊的應用系統均屬於此一層。這一層就是會利用WMI的管理程式,只要以Visual Basic、C/C++以及.NET、ActiveX Scripting所支援的語言,就可以叫用WMI所提供的介面(也就是中間層);甚至也可以SQL語言透過ODBC存取WMI所提供的管理資
料。

應用實例

以下簡單舉例說明利用WMI來完成監控某台電腦的服務狀態的需求。


《圖二》


如上圖所示,透過WMI可以取得某台電腦上的所有服務資訊,同時也能透過WMI下指令將服務啟動或是停止,甚至可以安裝或卸載服務。

這個實作程式只透過WMI讀取服務資訊或是執行某些指令,如同上述介紹還可以再透過WMI取得主機資訊或是有哪些行程正在執行,也可以針對該台電腦執行重新開機或關機指令,或是建立新的行程或是停止某個行程,可以針對不同的需求做出開發。

參考資料

http://en.wikipedia.org/wiki/Windows_Management_Instrumentation
http://www.microsoft.com/taiwan/technet/columns/profwin/24-wmi.mspx
http://www.msservermag.com.tw/technicwords/021128.aspx
http://msdn.microsoft.com/en-us/library/aa394418(VS.85).aspx