WMI技术介绍和应用——WMI概述
? ? ? ? 今天,我要開始一系列關于微軟WMI技術的介紹。通過之后若干節的介紹,我想WMI技術將為在windows平臺上從事開發的朋友開啟另外一扇窗。(轉載請指明出于breaksoftware的csdn博客)
? ? ? ? 第一次接觸WMI技術是在一年前,當時我接到一個研究型的需求,無意中發現WMI技術是最可靠的解決方案。當時,WMI這種“特別”的使用方式讓我這個VC程序員產生了濃厚的興趣——像寫SQL般去寫程序。研究WMI技術的火種一直在我內心燃燒,最近正好有時間,我準備把WMI技術做一次比較系統性的梳理。由于WMI技術涉及的方面非常的廣泛,我準備主要從應用的角度去講解一些主要的使用場景,這樣才會讓該技術比較生動。同時WMI技術一個非常大的優勢就是可以訪問遠程計算機,對于遠程計算機的訪問,我將安排在最末節去介紹。
? ? ? ? 本節主要講解WMI的一些概述,如果不想了解WMI一些背景,本節可以過掉。
? ? ? ? WMI的全稱是Windows Management Instrumentation,即Windows管理工具。它是Windows操作系統中管理數據和操作的基礎模塊。我們可以通過WMI腳本或者應用程序去管理本地或者遠程計算機上的資源。對于VC和匯編程序員,想獲取諸如CPU序列號和硬盤序列號等信息是非常容易的。但是對于VB以及其他一些腳本語言,想嘗試獲取系統中一些硬件信息可能就沒那么容易了。微軟為了能達到一種通用性目的(遵守某些行業標準),設計了WMI。它提供了一個通過操作系統、網絡和企業環境去管理本地或遠程計算機的統一接口集。應用程序和腳本語言使用這套接口集去完成任務,而不是直接通過Windows API。可能有人要問,為什么不讓設計的腳本直接在底層使用Windows API,而非要弄個新的技術呢?原因是在目前Windows API中,有些是不支持遠程調用或者腳本調用的。這樣通過統一模型的WMI,像VB和腳本語言就可以去訪問部分系統信息了。但是并不是所有腳本語言都可以使用WMI技術:它要支持ActiveX技術。
? ? ? ? 那么WMI遵守的是哪個行業標準呢?是WBEM。WMI是對WBEM模型的一種實現。WBEM即Web-Based Enterprise Management,它是一個行業倡議:開發一款在企業環境下訪問管理信息的標準技術。這個倡議規范了企業網絡中受管資源的描述和使用。它對WMI技術影響最大是其組件CIM和MOF。CIM是Common Information Modal,即公共信息模型。MOF是Managed Object Format,即托管對象格式。WMI使用了這兩個標準實現相關功能,我們將在之后的應用章節介紹它們。WBEM倡議目前已經得到微軟、甲骨文、惠普等大公司的支持。
? ? ? ? 雖然這種標準已被廣泛支持,但是WMI技術可能還是鮮為人知。其實它的歷史并不短暫。在Win2K之前的操作系統中,就已經支持了WMI技術,只是當時需要下載并安裝一個開發包。從Win2K系統開始,系統就自帶了WMI,并且WMI成為系統的一個重要組件。隨著Xp、2003、Vista、Win7等的發布,WMI所能提供的功能也在不斷的增強和完善中。因為增強和完善,我們將發現,在不同的系統中,調用相同的操作將會獲得不同的信息(得到的子集不同),這也是影響WMI使用的一個因素。但是從技術角度說,這個不是問題。
? ? ? ? 使用WMI技術主要分為兩個大的方面:1 獲取信息;2 提供數據。其中“獲取信息”需要WMI Classes(以后稱為WMI類)。“提供數據”需要WMI Provider(以后稱為WMI提供者)。在之后的應用例子中,我將先介紹相對簡單點的“獲取信息”,然后再講解稍微復雜點的“提供數據”。為什么說“獲取信息”相對簡單?我們就先看下WMI的構架圖,下圖來源為MSDN
? ? ? ? 總體看來,可以將WMI分成3層結構。我們由上而下介紹這3層結構。
? ? ? ? WMI Consumers(WMI使用者)
? ? ? ? 它位于WMI構架的最頂層,是WMI技術使用的載體。如果我們是C++程序員,我們可以通過COM技術直接與下層通信。而腳本語言則要支持WMI Scripting API,間接與下層通信。對于.net平臺語言,則要使用System.Management域相關功能與下層通信。這些WMI的使用者,可以查詢、枚舉數據,也可以運行Provider的方法,還可以向WMI訂閱消息。當然這些數據操作都是要有相應的Provider來提供。
? ? ? ? WMI Infrastructure(WMI基礎結構)
? ? ? ? WMI基礎結構是Windows系統的系統組件。它包含兩個模塊:包含WMI Core(WMI核心)的WMI Service(WMI服務)(Winmgmt)和WMI Repository(WMI存儲庫)。
? ? ? ? WMI存儲庫是通過WMI Namespace(WMI命名空間)組織起來的。在系統啟動時,WMI服務會創建諸如root\default、root\cimv2和root\subscription等WMI命名空間,同時會預安裝一部分WMI類的定義信息到這些命名空間中。其他命名空間是在操作系統或者產品調用有關WMI提供者(WMI Provider)時才被創建出來的。簡而言之,WMI存儲庫是用于存儲WMI靜態數據的存儲空間。之后,我們將優先介紹訪問WMI存儲庫來獲取有用的信息。
? ? ? ? WMI服務扮演著WMi提供者、管理應用和WMI存儲庫之間的協調者角色。一般來說,它是通過一個共享的服務進程SVCHOST來實施工作的。當第一個管理應用向WMI命名空間發起連接時,WMI服務將會啟動。當管理應用不再調用WMI時,WMI服務將會關閉或者進入低內存狀態。如我們上圖所示,WMI服務和上層應用之間是通過COM接口來實現的。當一個應用通過接口向WMI發起請求時,WMI將判斷該請求是請求靜態數據還是動態數據。如果請求的是一個靜態數據,WMI將從WMI存儲庫中查找數據并返回;如果請求的是一個動態數據,比如一個托管對象的當前內存情況,WMI服務將請求傳遞給已經在WMI服務中注冊的相應的WMI提供者。WMI提供者將數據返回給WMI服務,WMI服務再將結果返回給請求的應用。
? ? ? ??Managed object and WMI providers(托管對象和WMI提供者)
? ? ? ? WMI提供者是一個監控一個或者多個托管對象的COM接口。一個托管對象是一個邏輯或者物理組件,比如硬盤驅動器、網絡適配器、數據庫系統、操作系統、進程或者服務。和驅動相似,WMI提供者通過托管對象提供的數據向WMI服務提供數據,同時將WMI服務的請求傳遞給托管對象。
? ? ? ? 從文件的角度來說,WMI提供者是由一個實現邏輯的DLL和承載著描述數據和操作的類的托管對象格式(Managed Object Format)文件組成。這個兩個文件都保存在%Windir%\System32\Wbem目錄下。
? ? ? ? 通過以上對WMI的介紹,我想大家應該對WMI有了個初步的認識。下面我將講解在VC中使用WMI的一些步驟,之后我會再從應用的角度講解怎么使用WMI技術。
? ? ? ? 工程鏈接:http://pan.baidu.com/s/1i4pTM3V 密碼:9tj1
總結
以上是生活随笔為你收集整理的WMI技术介绍和应用——WMI概述的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在windows程序中嵌入Lua脚本引擎
- 下一篇: WMI技术介绍和应用——VC开发WMI应