每當我們需要查找有關 Windows 電腦及其組件的任何信息時,我們可以使用 Get-WmiObject
。
通過利用 WMI 方法,Get-WmiObject
也可以在本地或遠程系統上運行操作。這個 cmdlet 是 PowerShell 中可以使用 WMI 存儲庫來更輕鬆管理大量系統的幾個 cmdlet 之一。
使用 Get-WmiObject 發現類別
在最基本的情況下,這個 cmdlet 可以從本地計算機查詢信息。您只需要知道命名空間(可能是默認的 root\cimv2
)和包含您要查找信息的 WMI 類別即可。
有數千個類別,您可能還不知道要使用哪個類別。使用 Get-WmiObject
,我們可以查詢命名空間中的所有可用類別。使用 Get-WmiObject -List
,您將能夠查看 root\cimv2
命名空間中的所有類別。如果您需要檢查其他命名空間中的類別,也可以使用 Namespace
參數。
獲取 WMI 屬性
一旦獲得了類別,就可以進一步調查並查看該類別中的屬性。也許我想查看計算機運行的操作系統。我可能正在生成一份報告,並想查看一台遠程機器的運行情況。Get-WmiObject
有一個 ComputerName
參數,您可以在其中指定一台或多台遠程計算機,而不僅僅是本地計算機。
我的遠程電腦是一個域控制器,名為 DC。我將查看 Win32_OperatingSystem 類別,以查看其中包含的屬性。
這是有用的信息,但我沒有看到操作系統名稱。與許多其他 PowerShell 輸出一樣,您不會看到所有屬性。為此,我們需要使用 Select-Object 來返回所有屬性。
I can now see a property called Caption
that lets me know the version of Windows.
查找 WMI 屬性
如果您不是在尋找特定的屬性,而是尋找與特定值匹配的屬性該怎麼辦?例如,我們可以查詢 CIM_DataFile 類別中的所有實例,但這將返回系統上的每個文件!相反,我們可以使用 Filter 或 Query 參數按值篩選實例。讓我們一起討論這兩種方法。
以 CIM_DataFile 為例,也許我只想找到表示壓縮文件的實例。由於 Compressed 屬性是每個實例上的屬性且它是一個布爾值,我可以使用 Filter 參數將過濾器直接傳遞給 WMI 提供程序,只返回具有 Compressed 屬性為 True 的實例。
如果您了解 WQL,還可以選擇類別並自行指定“過濾器”,通過製作自己的 WQL 查詢來進行過濾。
調用 WMI 方法
Get-WmiObject
不僅可以從 WMI 讀取信息,還可以方便地調用 WMI 方法。一個常見的 WMI 方法是在 Win32_Process
類上調用 Create
方法。有幾種不同的方式可以調用 WMI 方法,例如使用 Invoke-WmiMethod
,但也可以使用 Get-WmiObject
。我們只需要捕獲一個 WMI 實例,然後在該對象上調用該方法。
這是一個遠程在遠程計算機上啟動 notepad.exe 的示例。作為一個額外的獎勵,我們還使用了一個替代認證來實現這一點!
WMI、DCOM 和 PowerShell 遠程管理
最後要指出的是,這個 cmdlet 的後繼者是:Get-CimInstance
。雖然 Get-CimInstance
在使用 PowerShell 遠程管理 作為默認的遠程連接協議方面提供了一些優勢,但使用 Get-WmiObject
有時更容易。
Get-WmiObject
使用 DCOM 與遠程計算機通信,通常也是可用的。否則,當希望使用 WSMAN 通過 Get-CimInstance
時,您需要在遠程端點啟用 PowerShell 遠程管理。
有關詳細信息,請查閱 Microsoft 文檔。