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