Win2000自動(dòng)化管理的實(shí)現(xiàn)
與以前的操作系統(tǒng)相比,Windows 2K/XP的優(yōu)點(diǎn)之一是具有更好的可管理性。例如它支持Windows 2000服務(wù)器終端服務(wù)下的遠(yuǎn)程管理模式,支持Microsoft管理控制臺(tái)(MMC), 再有一個(gè)就是支持WMI。WMI是Windows Management Instrumentation的縮寫,即Windows 管理規(guī)范。WMI有許多用途,其中之一就是通過腳本編程實(shí)現(xiàn)管理自動(dòng)化。
一、為什么要用腳本?
回顧九十年代,Windows NT之所以獲得成功,原因之一就在于相對(duì)而言這個(gè)操作系統(tǒng)比較容易使用,任何能夠使用Windows 3.1的用戶差不多就可以管理一個(gè)簡(jiǎn)單的NT網(wǎng)絡(luò)(這在今天聽起來有點(diǎn)不可思議,但事實(shí)是,NT 3.1比Windows 2K/XP功能少得多,因而簡(jiǎn)單得多)。只要看看NT的控制面板,這個(gè)操作系統(tǒng)可以做些什么就大致有個(gè)印象了。
隨著操作系統(tǒng)的發(fā)展,原來友好的界面變得更加友好。在Windows 2K/XP中,幾乎每一個(gè)操作過程都有向?qū)?,每一個(gè)操作系統(tǒng)級(jí)的對(duì)象都有圖形化的屬性頁;不同的操作選擇引導(dǎo)你到達(dá)最終完成任務(wù)的對(duì)話框,MMC允許你把常用的工具(甚至是第三方的工具)插入到定制的工具集。
然而,高級(jí)用戶感到友好的GUI實(shí)在太繁瑣了。另外,盡管在命令行上也可以執(zhí)行某些任務(wù),但命令行沒有圖形工具那樣完備的功能。為了讓W(xué)indows 2K/XP下的操作任務(wù)自動(dòng)化,一種較好的途徑是通過腳本程序直接訪問圖形化工具訪問的管理接口。WMI允許用戶通過一個(gè)統(tǒng)一的接口,用腳本語言訪問操作系統(tǒng)的幾乎任意一個(gè)部分。當(dāng)然,用腳本對(duì)WMI編程也有一些限制,例如不能直接訪問Win32 API。
二、WMI是什么?
WMI是Windows 2K/XP管理系統(tǒng)的核心;對(duì)于其他的Win32操作系統(tǒng),WMI是一個(gè)有用的插件。WMI以CIMOM為基礎(chǔ),CIMOM即公共信息模型對(duì)象管理器(Common Information Model Object Manager),是一個(gè)描述操作系統(tǒng)構(gòu)成單元的對(duì)象數(shù)據(jù)庫,為MMC和腳本程序提供了一個(gè)訪問操作系統(tǒng)構(gòu)成單元的公共接口。有了WMI,工具軟件和腳本程序訪問操作系統(tǒng)的不同部分時(shí)不需要使用不同的API;相反,操作系統(tǒng)的不同部分都可以插入WMI,如圖一所示(該圖來自MSDN),工具軟件和WMI可以方便地讀寫WMI。
圖一
Windows 2K/XP和Windows 98 都支持WMI;如果為NT 4.0和Windows 95加上了 Service Pack 4或更高版本,NT 4.0和Win95也支持WMI。因此,用WMI進(jìn)行遠(yuǎn)程管理時(shí),并非一定要用Windows 2K/XP(當(dāng)然,如果WMI腳本在一臺(tái)沒有性能監(jiān)視器的Win9x機(jī)器上運(yùn)行,就不能在遠(yuǎn)程Win9x系統(tǒng)上查詢Windows 2K/XP的性能監(jiān)視器。
如前所述,WMI允許通過一個(gè)公共的接口訪問多種操作系統(tǒng)構(gòu)成單元,因此不必分別對(duì)待各種底層接口或所謂的“提供者”。利用WMI可以高效地管理遠(yuǎn)程和本地的計(jì)算機(jī);與此相對(duì),并非所有的Windows 2K/XP命令行工具都支持遠(yuǎn)程運(yùn)行。
WMI是WBEM模型的一種實(shí)現(xiàn)。WBEM即Web-Based Enterprise Management,或基于Web的企業(yè)管理,WBEM由DMTF(Distributed Management Task Force,分布式管理任務(wù)組)在許多廠商的幫助下創(chuàng)立,包括Compaq、Sun、Microsoft等。WBEM的目標(biāo)是,為管理企業(yè)環(huán)境開發(fā)一個(gè)標(biāo)準(zhǔn)的接口集。WBEM模型最關(guān)鍵的部分是它的數(shù)據(jù)模型(或描述和定義對(duì)象的方式)、編碼規(guī)范(Encoding Specification),以及在客戶端和服務(wù)器端之間傳輸數(shù)據(jù)的模式。
WBEM的數(shù)據(jù)模型是CIM(Common Information Model,公共信息模型)。CIM是一個(gè)用來命名計(jì)算機(jī)的物理和邏輯單元的標(biāo)準(zhǔn)的命名系統(tǒng)(或稱為命名模式),例如硬盤的邏輯分區(qū)、正在運(yùn)行的應(yīng)用的一個(gè)實(shí)例,或者一條電纜。
CIM是一個(gè)面向?qū)ο蟮哪P?,使用一組面向?qū)ο蟮男g(shù)語進(jìn)行描述。CIM包含類(Class),類是被管理單元的模板。類的實(shí)例稱為對(duì)象(Object),對(duì)象代表著底層系統(tǒng)的一個(gè)具體單元。名稱空間(Namespace)是一個(gè)類的集合,每個(gè)名稱空間面向一個(gè)特定的管理領(lǐng)域。類包含屬性(Property)和方法(Method)。
三、WMI軟件開發(fā)包
利用WMI軟件開發(fā)包(SDK)可以方便地查看可用的CIM和Win32類。WMI SDK可以從http://msdn.microsoft.com/downloads/default.asp?URL=/code/sample.asp?url=/msdn-files/027/001/566/msdncompositedoc.xml下載,有8M多,可謂不小。
WMI SDK要求操作系統(tǒng)必須是Windows 2K/XP或者NT 4.0 SP4或更高版本;盡管Win9x系統(tǒng)上可以安裝WMI支持軟件,但SDK不能在Win9x上運(yùn)行。另外,為支持SDK的ActiveX控件,SDK還要求有IE 5.0或更高版本。SDK對(duì)機(jī)器性能的最低要求是:Pentium處理器,32 Mb的RAM,40 Mb的磁盤空間,以及至少要有800 x 600、256色的顯示設(shè)備。對(duì)于運(yùn)行Windows 2K/XP的機(jī)器來說,這些要求應(yīng)該不會(huì)成為問題。CIMOM默認(rèn)以服務(wù)的形式運(yùn)行,但如果機(jī)器沒有網(wǎng)卡,CIMOM不能作為服務(wù)運(yùn)行,不過此時(shí)可以作為一個(gè)應(yīng)用運(yùn)行,只需執(zhí)行winmgmt.exe即可。winmgmt.exe在%systemroot%system32wbem的WMI主目錄下。
SDK必須由管理員組的成員安裝。安裝過程很簡(jiǎn)單,執(zhí)行WMISdk.exe啟動(dòng)向?qū)?,指定安裝的目標(biāo)目錄(默認(rèn)是program fileswmi)。選擇要安裝的可選組件(默認(rèn)安裝除了SNMP支持以外的所有組件),最后點(diǎn)擊Finish。安裝SDK不需要重新啟動(dòng)。安裝完成后,“開始/程序”菜單上會(huì)增加一個(gè)WMI SDK組。
點(diǎn)擊WMI SDK程序組的WMI CIM Studio。CIM Studio提示連接名稱空間,并顯示默認(rèn)連接的名稱空間是rootcimv2,確認(rèn)即可。如果你用Administrator身分登錄Windows,再次點(diǎn)擊確定以當(dāng)前身份登錄;如果你用其他的身份登錄Windows,請(qǐng)改用Administrator登錄。
現(xiàn)在,假設(shè)我們要在當(dāng)前的機(jī)器上查找一個(gè)對(duì)象:C:驅(qū)動(dòng)器。我們不知道C:驅(qū)動(dòng)器在CIM或WMI中的具體名稱,瀏覽CIM Studio列出的數(shù)百個(gè)類又太麻煩,怎么辦呢?可以使用Find按鈕(左邊上方的望遠(yuǎn)鏡,參見圖三)。圖二顯示了點(diǎn)擊Find按鈕后顯示的Search for Class對(duì)話框,在這里輸入我們猜想C:驅(qū)動(dòng)器的類名稱中應(yīng)當(dāng)包含的單詞,然后點(diǎn)擊Go!按鈕。由于我們正在尋找一個(gè)命名的磁盤分區(qū),而且我們知道Windows把這種分區(qū)叫做logical disk或logical drive,因此這里的搜索關(guān)鍵詞可以是logical。當(dāng)然,搜索關(guān)鍵詞也可以是disk,但這時(shí)會(huì)有大量的搜索結(jié)果出現(xiàn)。
圖二
圖二顯示了搜索關(guān)鍵詞logical得到的結(jié)果。選擇Win32_LogicalDisk并點(diǎn)擊OK,圖三的窗口出現(xiàn)(為什么不選擇CIM_LogicalDisk?前面已經(jīng)提到,WMI管理的所有對(duì)象都帶有Win32前綴。如果選擇CIM_LogicalDisk然后要求顯示出它的實(shí)例,不可能看到可用邏輯驅(qū)動(dòng)器的任何具體信息,只能看到對(duì)應(yīng)每一個(gè)可用邏輯驅(qū)動(dòng)器的Win32_LogicalDisk條目)。現(xiàn)在,窗口的右邊顯示出Win32_logicalDisk類的屬性??梢钥吹?,屬性的值都為空,這是因?yàn)槲覀冋诓榭吹氖且粋€(gè)類,而不是類的具體實(shí)例。要顯示出Win32_LogicalDisk類的實(shí)例,點(diǎn)擊右邊上面的Instances按鈕(右數(shù)第四)。
圖三
點(diǎn)擊Instances按鈕之后,窗口顯示出當(dāng)前機(jī)器上所有邏輯驅(qū)動(dòng)器的實(shí)例,包括網(wǎng)絡(luò)邏輯驅(qū)動(dòng)器。點(diǎn)擊設(shè)備ID為“C:”的實(shí)例,顯示出圖四的結(jié)果。右邊窗格包含了當(dāng)前實(shí)例的屬性和方法,當(dāng)前邏輯驅(qū)動(dòng)器的名稱顯示在右邊窗格的上方。
圖四
利用腳本可以修改這些屬性或調(diào)用這些方法。如果對(duì)某個(gè)屬性的含義不太清楚,只需選擇Win32_LogialDisk類或Win32_LogicalDisk.DeviceID='C:'實(shí)例,再點(diǎn)擊Help按鈕。大多數(shù)對(duì)象的屬性和方法都有詳細(xì)的說明。
CIM分三層。第一層是核心模型(Core Model),這一層包含的類定義對(duì)于所有管理領(lǐng)域來說都是共同的。第二層是公共模型(Common Model),這一層包含的類定義對(duì)于特定的管理領(lǐng)域來說是公共的,但與具體的操作系統(tǒng)和系統(tǒng)設(shè)計(jì)無關(guān)。第三層是擴(kuò)展模型(Extension model),這一層包含的類定義與特定的操作系統(tǒng)或技術(shù)有關(guān)。
WMI是Microsoft擴(kuò)展CIM 2.0得到的面向Win32系統(tǒng)的擴(kuò)展模型。引用WMI類和屬性的形式是“擴(kuò)展前綴_類名稱.屬性名稱”,例如Win32_ComputerSystem.Name,其中Win32是CIM模式cimv2名稱空間內(nèi)WMI擴(kuò)展類的前綴,ComputerSystem是類,Name是屬性。
編寫WMI腳本的很大一部分工作涉及到讀取和設(shè)置屬性值。當(dāng)前,WMI提供的方法還很有限,但隨著時(shí)間的推移,相信WMI和CIM提供的方法都會(huì)越來越豐富。
四、腳本編程初步
前面我們通過SDK查看了Win32_LogicalDisk類和它的屬性,下面來看看如何在腳本中訪問這些信息。如果你的系統(tǒng)上安裝了Microsoft Windows 2000 Resource Kit,program filesresource kit文件夾下默認(rèn)會(huì)有一個(gè)listfreespace.vbs腳本。這個(gè)腳本查詢Win32_LogicalDisk類的各個(gè)對(duì)象,分別提取一組屬性值:DeviceID,即驅(qū)動(dòng)器標(biāo)識(shí)符;FreeSpace,驅(qū)動(dòng)器空閑空間的字節(jié)數(shù)。假設(shè)一臺(tái)機(jī)器的A:是軟盤驅(qū)動(dòng)器,D:是CD-ROM驅(qū)動(dòng)器,listfreespace.vbs的輸出類如:
A: not availableC: 8,243,381,248 bytesD: not available
下面顯示了getfree.vbs腳本程序的代碼,它用更少的代碼獲取類似的信息。啟動(dòng)getfree.vbs時(shí)要指定驅(qū)動(dòng)器標(biāo)識(shí)符,getfree.vbs將顯示出驅(qū)動(dòng)器空閑空間和文件系統(tǒng)類型。
' 變量聲明Dim driveArg, dObject, driveName' 創(chuàng)建文件系統(tǒng)對(duì)象,并將該對(duì)象賦值' 給dObject變量(drive object的縮寫)Set dObject = CreateObject('Scripting.FileSystemObject')' 如果用戶沒有在命令行指定待查詢的驅(qū)動(dòng)器標(biāo)識(shí)符,' 則顯示錯(cuò)誤信息并停止運(yùn)行腳本If Wscript.Arguments.Count < 1 Then _ Wscript.Echo '請(qǐng)?jiān)诿钚袇?shù)中指定要查詢的驅(qū)動(dòng)器,例如C:',_ Wscript.Quit(1)' 把用戶指定的驅(qū)動(dòng)器標(biāo)識(shí)符提供給文件系統(tǒng)對(duì)象,' 在driveArg中保存對(duì)應(yīng)的絕對(duì)路徑名driveArg = dObject.GetAbsolutePathName(Wscript.Arguments(0))' 獲取用戶指定的驅(qū)動(dòng)器的名字driveName = dObject.GetDriveName(driveArg)' 提取指定驅(qū)動(dòng)器的屬性信息' 在對(duì)話框中顯示這些信息With dObject.GetDrive(driveName) Wscript.Echo '驅(qū)動(dòng)器', .DriveLetter,':空閑空間是',.Freespace / 1024,_ 'KB,文件系統(tǒng)是', .FileSystem End With' 結(jié)束...Set dObject = Nothing
在Windows命令行窗口中,執(zhí)行“Wscript getfree.vbs c:”將顯示出類如圖五的結(jié)果。如果執(zhí)行“Cscript getfree.vbs c:”,則提示信息以字符方式顯示。
圖五
又如,下面的VBScript腳本提示輸入遠(yuǎn)程機(jī)器的名字,然后關(guān)閉指定的遠(yuǎn)程機(jī)器:
MachineName = InputBox('輸入要關(guān)閉的遠(yuǎn)程機(jī)器名字')Set OSSet = GetObject('winmgmts:{(Debug,RemoteShutdown)}//'& MachineName &'/root/cimv2').ExecQuery('select * from Win32_OperatingSystem where Primary=true')for each OpSys in OSSet OpSys.Shutdown()next
當(dāng)然,如果只有本文的知識(shí),你還不能算是一個(gè)WMI腳本編程的高手。但現(xiàn)在你已經(jīng)了解了如何用SDK查詢信息,如何通過腳本訪問對(duì)象的屬性和方法。繼續(xù)努力吧!
