批處理的api--WMIC學習體會
作者:lcx
來源:vbs小鋪
給黑手專欄裡寫的文章
批處理的api--WMIC學習體會
lcx
上期的專欄裡,NP給大家寫了一篇很精彩也很有實際應用效果的批處理教程。這期,我給大家講一下最近我學習wmic的體會。在這篇文章裡也許你看不 到很多奇特有用的的實際常式,但是呢,授人以魚不如授人以漁,希望我的文章能讓你通俗易懂的瞭解一些wmic的基本知識,可以有一個學習的興趣,讓自己繼 續深研一下wmic。
在WINDOWS\Help目下,wmic.chm文檔是這樣解釋wmi的:Windows Management Instrumentation (WMI) 是“基於 Web 的企業管理倡議 (WBEM)”(這是一個旨在建立在商業網路上訪問和共用管理資訊的標準的工業倡議)的 Microsoft 的實現。有關 WBEM 的詳細資料,請訪問 WBEM。XOXWMI 為公用資訊模型 (CIM)(該資料模型描述存在於管理環境中的對象)提供完整的支援。WMI 包括對象儲備庫和 CIM 物件管理員,其中對象儲備庫是包含對象定義的資料庫,對象管理器負責處理儲備庫中對象的收集和操作並從 WMI 提供者 (WMI provider) 收集資訊。WMI 提供者 (WMI provider) 在 WMI 和作業系統、應用程式以及其他系統的組件之間充當中介。例如,註冊表提供者從註冊表中提供資訊,而 SNMP 提供者則從 SNMP 裝置中提供資料和事件。提供者提供關於其組件的資訊,也可能提供一些方法,這些方法可以操作可設定的組件、屬性,或者操作可能警告您在組件中要發生更改 的事件。Windows Management Instrumentation 命令列 (WMIC) 向您提供了簡單的 Windows Management Instrumentation (WMI) 命令列介面,這樣即可利用 WMI 來管理運行 Windows 的電腦。WMIC 與現有命令列程式和公用程式命令相互操作,且很容易通過指令碼或其他面向管理的應用程式來擴充 WMIC。
以上的這些說法太專業了,通俗一點講就是wmic.exe是一個命令列程式,可以用它這個介面來實現在命令列下直接管理電腦軟硬體等方方面面的操作,相當於批處理的api了。
一、wmic的基本命令格式簡析
經常看網上的相關資料的話,讀者可能會對wmic有一個基本的認識,不過看得越多估計會越糊塗,起碼我是這樣認為的。其實簡單總結一下,命令格式就是“wmic+全域開關+別名+wql語句+動詞+副詞(或者說是動詞的參數)+動詞開關”而已了。這個命令格式可以根據需要來寫全或者寫部份格式,我這裡依次對格式的每個名稱按自己的理解來解釋一下,不過肯定完全不符合微軟專家的定義,只是讓大家弄懂它們而已。
wmic就是wmic.exe,位於windows目錄底下,是一個命令列程式。WMIC可以以兩種模式執行:互動模式(Interactive mode)和非互動模式(Non-Interactive mode),經常使用Netsh命令列的讀者應該非常熟悉這兩種模式。
互動模式。如果你在命令提示字元下或通過"運行"菜單只輸入WMIC,都將進入WMIC的互動模式,每當一個命令執行完畢後,系統還會返回到WMIC提示符 下,如"Root\cli",互動模式通常在需要執行多個WMIC指令時使用。互動模式有時還會對一些敏感的操作要求確認,比如刪除操作,最大限度地防止 使用者操作出現失誤。
非互動模式。非互動模式是指將WMIC指令直接作為WMIC的參數放在WMIC後面,當指令執行完畢後再返回到普通的命令提示字元下,而不是進入到WMIC上下文環境中。WMIC的非互動模式主要用於批處理或者其他一些指令檔中,我在本文中一律用●非互動模式●樣本。
開關有以下的全域開關,打入wmic.exe /?可以看到的(這裡我們先不討論每個開關的具體意思,具體用法看樣本):
★
/NAMESPACE 別名使用的名稱空間路徑。
/ROLE 包含此別名定義的角色路徑。
/NODE 別名使用的伺服器。
/IMPLEVEL 客戶類比層級。
/AUTHLEVEL 客戶身分識別驗證層級。
/LOCALE 客戶應用的語言識別符。
/PRIVILEGES 啟用或禁用所有特權。
/TRACE 將調試資訊輸出到 stderr。
/RECORD 將所有輸入命令和輸出寫入日誌。
/INTERACTIVE 設定或重設互動模式。
/FAILFAST 設定或重設 FailFast 模式。
/USER 會話期間使用的使用者。
/PASSWORD 用於會話登入的密碼。
/OUTPUT 為輸出重新定向指定模式。
/APPEND 為輸出重新定向指定模式。
/AGGREGATE 設定或重設集合模式。
/AUTHORITY Specifies the <authority type> for the connection.
/?[:<BRIEF|FULL>] Usage information.
★
至於別名啦,就是給主板、服務、系統、進程啦這些和電腦相關的東東起了個英文名,在wmic.exe /?命令列下也可以看到。
wql語句和我們平常用的注入時的sql語句的文法幾乎是一模一樣,甚至更簡單。一般是where name="xxx" and 之類的,不過有時候要把name=“xxx"這樣的格式換成"name='xxx'"或者是where(name='xxx')這樣,反正正常情況下不行 的話就換個寫法。
動詞呢,就那麼簡單幾個assoc、call、CREATE、DELETE、GET、LIST、SET,從英文名字上應當可以看出它們是用來幹什麼的。不過說實話,assoc我真的還沒用到過。
至於副詞(動詞的參數),就是得到用動詞+它的參數得到對象的屬性。像屬於list動詞的副詞,就是顯示個什麼樣的呀,例如顯示詳細狀態或簡要狀態。
動詞開關就好比顯示個橫表格式的或者顯示個豎表格式的或者輸出個什麼樣格式的檔案,或者是幾秒來重複顯示資訊等等,有的動詞並沒有開關。
二、一步一步來完成我們的wmic命令列
wmic裡有個別名是logicaldisk,就是對磁碟進行管理。我們先按照最簡單的格式來寫,在cmd命令列下輸入●wmic logicaldisk list●(wmic.exe+別名+list動詞),稍等一會兒螢幕上會出現本地硬碟的各式各樣的資料,看上去雜亂無章。這樣子太不方便看了,我們來改寫一下,改成●wmic logicaldisk list brief●,在list動詞後加個brief參數,也就是brief副詞,顯示的就會很整齊,效果如下:
★
DeviceID brief FreeSpace ProviderName Size VolumeName
A: 2
C: 3 2925694976 6805409792 WINXP
D: 3 1117487104 1759936512 WORK
E: 5
★
大家可能注意到了上面命令列中有動詞list和副詞brief。list動詞決定顯示的資訊格式與範圍,它有Brief、Full、 Instance、Status、System、Writeable等多個參數(副詞),full只是它的一個參數,也是list的預設參數,表示顯示所 有的資訊。其他幾個參數顧名思義,如Brief表示只顯示摘要資訊,Instance表示只顯示對象執行個體,Status表示顯示對象狀 態,Writeable表示只顯示該對象的可寫入的屬性資訊等。
我們再來把語句加點東東,在上邊磁碟返回資訊當中的DeviceID的值為3時表示是本地硬碟的分區,如果是5為光區,為2則是移動磁碟了。我們把語句改 一下,加入wql語句,只顯示本地磁碟。語句改成●wmic logicaldisk where "DriveType=3" list brief●或者是●wmic logicaldisk where(DriveType=3) list brief●,顯示效果都是下邊的樣子:
★
DeviceID DriveType FreeSpace ProviderName Size VolumeName
C: 3 2925686784 6805409792 WINXP
D: 3 1117487104 1759936512 WORK
★
但是上邊的格式呢顯示的我們還是不太滿意,ProviderName不知是個什麼東東也給顯示出來了,我們只想要我們想要的東東,像卷標 VolumeName之類的我們也不要它,再把語句改一下,換個get動詞,命令改為●wmic logicaldisk where "DriveType=3" get DeviceID,Size,FreeSpace,Description,FileSystem●,返回資訊如下:
★
DeviceID,Size,FreeSpace,Description,FileSystem
Description DeviceID FileSystem FreeSpace Size
本地固定磁碟 C: FAT32 2925686784 6805409792
本地固定磁碟 D: FAT 1117487104 1759936512
★
至於get動詞後面跟的參數你可以先用list來查看一下就明白了。好了,這回可以得到我們想要的結果了。不過命令裡的開關我們還沒用到呢,加幾個全域開關吧。先來加個/OUTPUT吧,讓它把顯示資訊輸出到一個檔案中,命令如下:●wmic /output:a.html logicaldisk where "DriveType=3" get DeviceID,Size,FreeSpace,Description,FileSystem●,這樣一來剛才螢幕上返回的資訊就到目前的目錄的a.htm裡了。但是a.htm開啟看看後,根本就像一個記事本一樣,沒有任何樣式,看起來也不美觀,我們給它指定一個樣式,就要用到format這個動詞開關了,命令改為●wmic /output:a.html logicaldisk where "DriveType=3" get DeviceID,Size,FreeSpace,Description,FileSystem /format:htable●, 這樣一來a.htm裡就花花綠綠的用表格顯示我們本地磁碟的資訊了。也許你要問,htable是什麼東東,其實這是一個檔案,你想要上邊的a.html什 麼格式,就可以在C:\WINDOWS\system32\wbem這裡找一個你想要的格式的檔案名稱,具體有以下一些檔案:
★
CSV
HFORM
HMOF
HTABLE
HXML
LIST
TABLE
VALUE
htable-sortby
htable-sortby.xsl
texttablewsys
texttablewsys.xsl
wmiclimofformat
wmiclimofformat.xsl
wmiclitableformat
wmiclitableformat.xsl
wmiclitableformatnosys
wmiclitableformatnosys.xsl
wmiclivalueformat
wmiclivalueformat.xsl
★
還有人也許要問了,我只想顯示c:盤的,不要其它盤的可以做到嗎?當然可以,這就要用到wql語句的name這個變數了。你可以先用●wmic logicaldisk list Instance●看到name的具體名字,然後更改上邊的wql語句。好啦,我們改一下,改成●wmic /output:a.html logicaldisk where "name='c:'" get DeviceID,Size,FreeSpace,Description,FileSystem /format:htable或者wmic /output:a.html logicaldisk where(name='c:') get DeviceID,Size,FreeSpace,Description,FileSystem /format:htable●就可以了。值得注意的是我們在DriveType=3的沒有用到單引號是因為3是數字型的,而c:是字元型的所以要用單引 號或雙引號。不過要注意的是如果在wql語句中用到了and,請用()或者""把語句引起來。
這樣一來,我們最後的語句基本符合了我文章開頭說的wmic的命令格式是“wmic+開關+別名+wql語名+動詞+副詞(或者說是動詞的參數)+動詞開 關”。不過wmic可不只能對本機操作,還可以對遠程機器進行操作,我們再來加三個全域開關,讓我們的這條命令對遠程格式進行操作,命令就是:
●WMIC /node:"192.168.8.100" /user:"administrator" /password:"lcx" /output:a.html logicaldisk where "name='c:'" get DeviceID,Size,FreeSpace,Description,FileSystem /format:htable●
其中node開關表示對哪台機器進行訪問,user和password當然是遠程機器的使用者名稱和密碼了,這個命令有了以上的講解,大家應當一目瞭然 了吧。到現在為止,我們的動詞只用到了get和list,我們再加一個set來改變c:盤的卷標。命令如下:●WMIC logicaldisk where "name='c:'" set VolumeName ="lcx"●,這樣大家就更進一步清楚了這個格式的用法。寫了這麼多字,也許你要問到我wmic最有用的開關是什麼,當然是"?"了,如果那個命令不會 用,可以用wmic /? 、WMIC logicaldisk /?、WMIC logicaldisk list /?、WMIC logicaldisk set /?這樣儀次來查詢用法。
三、總結
wmic是很強大的,像開2003的3389一句話就可以做到:●wmic RDTOGGLE WHERE ServerName='%COMPUTERNAME%' call SetAllowTSConnections 1●。不過呢,
這篇文章估計會有讓觀眾上當受騙的感覺,一個wmic的磁碟命令寫了這麼長的篇幅,具體的奇淫技巧卻沒有看到。不過我想有了本文的基礎,你研究wmic其它的別名像進程、服務、bios、主板呀,都會有一個切入點,具體的好的技巧如開3389等就要靠大家去研究發現了。