什麼是WMIios
WMI能夠從計算機中收集大量系統信息。但有時候這些信息不易看懂,另外文檔也不夠友好。WMI是一個外部技術,PowerShell僅僅與其接口進行交互而已。shell
在最頂層,WMI被組織成命名空間(namespaces)。能夠把命名空間想象爲關聯到特定產品或技術的一個文件夾。好比,「root\CIMv2」,該命名空間包含了全部Windows操做系統和計算機硬件信息。而「root\MicrosoftDNS」命名空間包含了全部關於DNS服務器(假設你已經在計算機中安裝了該角色)的信息。express
在命名空間中,WMI被分紅一系列的類,每一個類都是可用於WMI查詢的管理單元。好比,在「root\SecurityCenter」中的「Antivirus-Product」類被設計用於保存反間諜軟件的信息;在「root\CIMv2」中的「Win32_LogicalDisk」類被設計用於保存邏輯磁盤的信息。可是即便一個計算機上存在某個類,也不表明計算機實際上安裝了對應組件。好比不管是否安裝了磁帶驅動程序。「Win32_TapeDrive」類在全部的Windows版本上都存在。不是全部的計算機都包含相同的WMI命名空間或類。編程
WMI的將來服務器
在WMI大部分生命週期中,微軟都沒有把過多的精力放在對其內部控制上(最近有所好轉)。微軟爲WMI制定了一系列的編程標準,可是產品組或多或少把精力放在如何實現類和是否對其文檔化。結果就是使得WMI變得混亂。網絡
所謂的「WMI Cmdlets」,例如「Get-WmiObject」與「Invoke-WmiMethod」——這些都是遺留命令,意味着它們依舊能工做,可是微軟不會對它們進行後續開發投入。它們與遠程過程調用(RPC)交互,也就是說,只有在防火牆支持狀態審查時才能經過防火牆(實際上很難)。ide
新版的「CIM Cmdlets」,例如「Get-CimInstance」與「Invoke-CimMethod」——它們或多或少等價於舊版本的「WMI Cmdlets」,可是它們經過WS-MAN(由Windows遠程管理服務實現)交互,替代原有的RPCs。ui
在Windows Server 2012 R2以及更新版本中,舊版的WMI默認爲禁用狀態,所以儘量使用CIM。除此以外,CIM cmdlet可使用舊版的RPC(或DCOM)協議通信,所以與老機器進行通信時,你也能夠僅使用CIM cmdlet。spa
在執行WMI篩選的時候,篩選語法是傳遞到WMI,而不是由PowerShell處理,因此你必須使用WMI規定的語法去替代內置的PowerShell操做符。操作系統
Get-WmiObject win32_process -filter {name='notepad.exe'} |Invoke-WmiMethod -Name Terminate
WMI的(微弱)優點
雖然WMI所需的RPC網絡通訊難以穿透防火牆,但WMI可以適用的計算機數量最多(當前來講);CIM只須要更新更簡單的WS-MAN通訊,但在老版本的Windows默認狀況下,並無安裝WS-MAN。
WMI串行與並行執行
Get-WMIObject命令會與一臺或多臺遠程計算機進行鏈接,可是經過串行方式實現,效率比較低。
備註:gwmi是Get-WMIObject的縮寫
gwmi -class win32_bios -computer server-r2,localhost | format-table @{label='ComputerName';expression={$_.__SERVER}}, @{label='BIOSSerial';expression={$_.SerialNumber}}, @{label='OSBuild';expression= {gwmi -class \win32_operatingsystem -computer $_.__SERVER | select-object -expand BuildNumber}} -autosize
在-ScriptBlock參數(或者是該參數的別名,-Command)中指定的任意命令都會並行發送到指定的每臺計算機。能夠同時訪問多達32臺計算機(除非你修改了-ThrottleLimit參數容許同時訪問更多或者更少的計算機),因此當你指定了超過32個計算機名稱,僅有前32臺計算機會開始執行該命令。當在前32臺計算機即將結束時,剩餘的計算機才能夠開始執行這些命令。另外,當在全部計算機上都執行結束後,上層的父做業會返回一個完整的狀態。
備註:Get-CimInstance是Get-WMIObject的新式寫法
invoke-command -ScriptBlock { Get-CimInstance -ClassName win32_process } -ComputerName WIN8 -Credential DOMAIN\Administrator
備註:本文部份內容參考圖書《powershell實戰指南第三版》
更多內容請參考