什么是WMIC?
WMIC擴展
WMI(Windows
Management Instrumentation,Windows管理規范)
,提供了從命令行接口和批命令腳本執行系統管理的支持。在WMIC出現之前,如果要管理WMI系統,必須使用一些專門的WMI應用,例如SMS,或者使用
WMI的腳本編程API,或者使用象CIM Studio之類的工具。如果不熟悉
C++之類的編成語言或
VBScript之類的腳本語言,或者不掌握WMI名稱空間的基本知識,要用WMI管理系統是很困難的。WMIC改變了這種情況,為WMI名稱空間提供了一個強大的、友好的命令行接口。
WMIC比WMI簡單、直觀得多,這主要是由于使用了別名(Alias)。別名機制獲取用戶在命令行上輸入的一些簡單命令,按照預定義的方式操作WMI名
稱空間,例如根據一個簡單的WMIC別名Get命令構造出一個復雜的WMI查詢語言(WQL)命令。從這個意義上看,別名是用戶和名稱空間之間一個簡化操
作的中間層。例如,如果在WMIC命令行上執行下面這個簡單的WMIC命令,就可以獲得用戶帳戶的基本信息:
useraccount list brief
在上面的命令中,Useraccount別名執行了一個Win32_Useraccount類的WQL查詢,以文本的形式顯示出從該類提取的信息。另
外,WMIC還以文本的形式顯示出Win32_Useraccount類的屬姓。除了文本形式的輸出之外,WMIC還能夠以其他形式返回命令執行結果,例
如XML、HTML或者CSV(逗號分隔的文本文件)。
WMIC以WMI模式中類的實例的形式保存別名。默認的別名類——MSFT_CliAlias,以及其他支持WMIC的類保存在模式的默認名稱空間,或者
說root\cli角色。角色可以簡單地看成專門用來支持WMIC的另一個WMI名稱空間。默認角色root\cli連接到root\cimv2名稱空
間,操作root\cimv2之內的類。雖然使用WMIC時一般不需要用到CIM Studio,但CIM
Studio可以用來方便地查看root\cli名稱空間
你可以向root\cli名稱空間和其他名稱空間加入新的別名,還可以用Class和Path命令直接訪問WMI名稱空間,本文后面將詳細說明Class和Path命令。
運行WMIC
執行“wmic”命令啟動WMIC命令行環境。這個命令可以在XP或
.NET Server的標準命令行解釋器(cmd.exe)、Telnet會話或“運行”對話框中執行。這些啟動方法可以在本地使用,也可以通過.NET Server終端服務會話使用。
第一次執行WMIC命令時,Windows首先要安裝WMIC,然后顯示出WMIC的命令行提示符。在WMIC命令行提示符上,命令以交互的方式執行。例如,執行下面的命令將關閉正在運行的Outlook:
process where name='outlook.exe' call terminate
命令運行結束后,WMIC命令行提示符重新出現。
WMIC也可以按照非交互的模式運行。如果要執行某個單步的任務,或者運行批命令中的一系列WMIC命令,非交互模式就很有用。要使用非交互模式,只要在
同一個命令行上啟動WMIC并輸入要執行的命令就可以了。例如,執行cmd.exe打開一個命令行窗口,然后執行下面的命令,就可以輸出連接到
MACHINE1的打印機清單:
wmic /node:MACHINE1 printer list status
在這個例子中,第一個操作是啟動WMIC,然后是根據/node參數建立一個到MACHINE1的遠程連接,最后執行一個WMIC命令顯示出打印機狀態信息。命令運行結束后,返回到Windows命令行提示符狀態。
安裝了WMIC的機器可以連接到任何一臺安裝了WMI的機器,被連接的機器不需要安裝
WMIC。例如,從一臺運行Win XP Pro的機器啟動WMIC,可以連接和管理所有賬行著XP、Win2K、Windows NT
4.0、Windows Me和Windows 9x的機器。
WMIC命令行構成
WMIC提供了大量的全局開關、別名、動詞、命令和豐富的命令行幫助增強用戶接口。全局開關是適用于整個WMIC會話的配置選項。例
如,/trace:on開關啟用錯誤跟蹤機制,如果這個開關處于打開狀態,WMIC返回每一個命令的錯誤信息。利用/note開關可以訪問遠程機器,
/interactive:on開關要求WMIC在執行刪除操作之前提示確認,其他的全局開關還包括/role、/user、/implevel以及
/namespace。
如前所述,別名是用戶和WMI名稱空間一個簡化語法的中間層。當你指定一個別名時,動詞(Verb)表示要執行的動作。例如,前面例子中的List和Call就是兩個動詞的例子。表一描述了其他一些WMIC動詞,并為每一個動詞給出了例子。
表一:WMIC動詞
動詞 例子 說明
Assoc group where name= 'administrators' assoc 顯示出Administrators組與系統的所有關聯,包括Administrators組成員等。
又如,os assoc顯示出有關操作系統的信息和已經安裝的補丁。
Create environment create name="progloc",
username="work01\User1",variablevalue= "%programfiles%\prog01"
創建一個名字為Progloc的變量,把它的值設置為Program
Files文件夾的一個子文件夾,把這個變量加入到Work01工作組計算機User1帳戶。
Delete environment where(name= "progloc") delete 刪除Progloc環境變量。測試WMIC命令時,為了防止意外地刪除,可以使用/interactive:on全局開關,這時刪除之前會要求確認。
Get partition get bootpartition, description, deviceid, bootable 返回分區是否可啟動、描述信息和設備ID屬姓等信息。
Set path WIN32_USERACCOUNT where(name="user01") set disabled="true" 在成員服務器或工作站上禁用User01用戶帳戶。
命令用來控制對WMIC和WMI名稱空間的訪問。注意表一的最后一個例子,這個例子用的是
Path和Win32_USERACCOUNT類,而不是Useraccount別名。Path是一個直接訪問WMI名稱空間中實例的命令,不必再通過別
名訪問。如果待執行的系統管理任務沒有現成的別名可用,Path命令特別有用。雖然你可以用新的別名和角色擴展WMIC,但如果你對WMI名稱空間比較熟
悉,使用Path命令也很方便。
除了Path命令之外,WMIC還支持Class、Context、Quit和Exit命令。
Class命令用來直接訪問WMI模式內的類或創建現有類的實例。Class命令和Path命令的不同之處在于,Path命令的作用對象是實例以及它的屬
姓(例如,提取管理用的信息),而Class命令的作用對象是類的定義。例如,如果要提取出WIN32_SOFTWAREELEMENT類的所有屬姓,可
以執行如下命令:
class WIN32_SOFTWAREELEMENT get
這個命令的輸出是
HTML格式,稍后我們將了解如何用/output全局開關把輸出重定向到可用瀏覽器打開的HTML文件。Class命令加上Assoc動詞能夠顯示出類的名稱空間路徑以及其他與該類關聯的類。利用Class命令可以刪除類、創建類的實例,但不能創建類。
Context命令顯示出全局開關的當前設置。Quit和Exit命令用來退出WMIC命令提示符環境,返回以前的Shell環境(例如Telnet環境,或XP的 命令行提示符環境)。
命令行幫助是熟悉WMIC的有效途徑。表二是在WMIC提示符下查找信息的常用命令:
表二:命令行幫助
命令 例子 說明
/? 或 -? 顯示所有全局開關和別名的語法
/ /? /user /? 顯示指定全局開關的信息
/? class /? 顯示某個命令的信息
/? memcache /? 顯示某個別名的信息
/? temperature get /? 顯示別名與動詞組合的信息
/?:Full irq get /?:Full 顯示動詞的幫助信息
實踐應用
以上我們了解了WMIC命令行環境的基礎知識,下面來看看如何用批命令運行WMIC,以及把輸出結果定向到控制臺或HTML、XML文件。從批命令文件運
行WMIC的好處在于不需要重復輸入一系列復雜的命令,例如,下面是一個批命令文件的內容,它的作用是顯示出MACHINE1和MACHINE2這兩臺機
器的CPU信息,輸出結果顯示在控制臺上。/format開關是面向動詞的開關,而不是全局開關,它只用于Get和List動詞。
wmic /node:MACHINE1, MACHINE4 cpu get name, caption,
maxclockspeed, systemname /format:textvaluelist.xsl
WMIC批命令可以使用變量。也就是說,對于上面的批命令,服務器的名字不僅可以直接
指定,而且還可以通過%1、%2的形式指定,下面就是一個例子。把下面的代碼放入一個批命令文件,然后在執行批命令文件時加上一到二個機器的名字即可;另
外,也可以創建一個獨立的文本文件,然后在文本文件中放入機器名字的清單,清單可以是
CSV格式,或用換行符分隔的格式。如果使用獨立的文本文件提供機器名字,只需在/node全局開關后面加上以@符號為前綴的文本文件名字,@符號告訴/node開關后面的參數是一個文件名字而不是機器名字。
@echo off if "%1"==""
goto msg if "%2"==""
goto single wmic /node:%1, %2 cpu get name, caption, maxclockspeed, systemname
/format:textvaluelist.xsl goto end :single wmic /node:%1 cpu get name, caption, maxclockspeed,
systemname /format:textvaluelist.xsl goto end :msg echo 必須指定至少一臺計算機的名字。 :end
如前所述,WMIC命令的輸出結果不僅可以發送到控制臺,還可以發送到XML或HTML、
MOF(Managed Object
Format)格式的文件。在安裝了WMI的計算機上,MOF是WMI數據庫中類和類實例的原始保存形式。下面的例子顯示了如何把MACHINE4處理器
信息的查詢結果輸出到HTML文件,/output全局開關要求WMIC把輸出發送到file1.htm,/format開關要求WMIC把原始的XML
輸出轉換成HTML格式。用來轉換格式的XSL樣式文件既可以是自定義的,也可以是任何安裝了WMIC的機器上\%systemroot%
\system32\wbem文件夾下面的任意XSL文件。例如,利用csv.xsl樣式文件可以把輸出結果轉換成CSV格式,利用htable.xsl
樣式可以構造出一個包含結果數據的表格
是在瀏覽器中打開的file1.htm文件。
wmic /node:MACHINE4 /output:e:\file1.htm cpu get description,
maxclockspeed, extclock, manufacturer,revision /format:hform.xsl
前面已經提到,Class命令加上Get動詞的默認輸出是HTML格式。因此,如果要把這類命
令的輸出結果保存到HTML文件,只需指定/output開關,不必加上/format開關。/record和/append全局開關也能夠從WMIC命
令行截取信息,請利用WMIC的命令行幫助功能了解有關這些開關的更多信息。
如果要以XML格式輸出,用/translate開關和Basicxml關鍵詞把大于符號“>”和小于符號“<”轉換成
XML中有意義的字符。
下面是輸出XML的一個例子,輸出的XML數據可導入到數據庫或其他能夠理解XML標記的系統。下面代碼的輸出中包含了WMIC命令、命令行請求參數、目標節點、全局開關以及命令執行結果。
wmic cpu get maxclockspeed /translate:basicxml /format:rawxml.xsl
總之,WMIC是XP和.NET Server中命令行管理功能的一次重要改進,對于從命令行訪問和管理WMI名稱空間提供了強健的支持。雖然掌握和熟悉WMIC命令行環境需要一段時間,但只要你熟悉了它,一個系統管理的全新境界將展現在你的面前。