Get-WmiObject:查詢電腦資訊的 WMI

每當我們需要查找有關 Windows 電腦及其組件的任何信息時,我們可以使用 Get-WmiObject

通過利用 WMI 方法,Get-WmiObject 也可以在本地或遠程系統上運行操作。這個 cmdlet 是 PowerShell 中可以使用 WMI 存儲庫來更輕鬆管理大量系統的幾個 cmdlet 之一。

使用 Get-WmiObject 發現類別

在最基本的情況下,這個 cmdlet 可以從本地計算機查詢信息。您只需要知道命名空間(可能是默認的 root\cimv2)和包含您要查找信息的 WMI 類別即可。

有數千個類別,您可能還不知道要使用哪個類別。使用 Get-WmiObject,我們可以查詢命名空間中的所有可用類別。使用 Get-WmiObject -List,您將能夠查看 root\cimv2 命名空間中的所有類別。如果您需要檢查其他命名空間中的類別,也可以使用 Namespace 參數。

PS> Get-WmiObject -List

NameSpace: ROOT\cimv2

Name				Methods	Properties
CIM_Indication		{}		{CorrelatedIndications, IndicationFilterName, IndicationIde...
CIM_ClassIndication	{}    	{ClassDefinition, CorrelatedIndications, IndicationFilterNa........

獲取 WMI 屬性

一旦獲得了類別,就可以進一步調查並查看該類別中的屬性。也許我想查看計算機運行的操作系統。我可能正在生成一份報告,並想查看一台遠程機器的運行情況。Get-WmiObject 有一個 ComputerName 參數,您可以在其中指定一台或多台遠程計算機,而不僅僅是本地計算機。

我的遠程電腦是一個域控制器,名為 DC。我將查看 Win32_OperatingSystem 類別,以查看其中包含的屬性。

PS> Get-WmiObject -ComputerName DC -Class Win32_OperatingSystem

SystemDirectory : C:\Windows\system32
Organization    :
BuildNumber     : 9600
RegisteredUser  : Windows User
SerialNumber    : 00252-00108-14656-AA864
Version         : 6.3.9600

這是有用的信息,但我沒有看到操作系統名稱。與許多其他 PowerShell 輸出一樣,您不會看到所有屬性。為此,我們需要使用 Select-Object 來返回所有屬性。

Get-WmiObject -ComputerName DC -Class Win32_OperatingSystem | Select-Object -Property *

I can now see a property called Caption that lets me know the version of Windows.

PS> (Get-WmiObject -ComputerName DC -Class Win32_OperatingSystem | Select-Object -Property *).Caption Microsoft Windows Server 2012 R2 Standard

查找 WMI 屬性

如果您不是在尋找特定的屬性,而是尋找與特定值匹配的屬性該怎麼辦?例如,我們可以查詢 CIM_DataFile 類別中的所有實例,但這將返回系統上的每個文件!相反,我們可以使用 Filter 或 Query 參數按值篩選實例。讓我們一起討論這兩種方法。

以 CIM_DataFile 為例,也許我只想找到表示壓縮文件的實例。由於 Compressed 屬性是每個實例上的屬性且它是一個布爾值,我可以使用 Filter 參數將過濾器直接傳遞給 WMI 提供程序,只返回具有 Compressed 屬性為 True 的實例。

Get-WmiObject -Class CIM_DataFile -Filter "Compressed = 'True'"

如果您了解 WQL,還可以選擇類別並自行指定“過濾器”,通過製作自己的 WQL 查詢來進行過濾。

Get-WmiObject -Query "SELECT * FROM CIM_DataFile WHERE Compressed = 'True'"

調用 WMI 方法

Get-WmiObject 不僅可以從 WMI 讀取信息,還可以方便地調用 WMI 方法。一個常見的 WMI 方法是在 Win32_Process 類上調用 Create 方法。有幾種不同的方式可以調用 WMI 方法,例如使用 Invoke-WmiMethod,但也可以使用 Get-WmiObject。我們只需要捕獲一個 WMI 實例,然後在該對象上調用該方法。

這是一個遠程在遠程計算機上啟動 notepad.exe 的示例。作為一個額外的獎勵,我們還使用了一個替代認證來實現這一點!

$cred = get-credential
$process = Get-WmiObject -Query "SELECT * FROM Meta_Class WHERE __Class = 'Win32_Process'" -namespace "root\cimv2" -computername 'FOO' -credential $cred $process.Create( "notepad.exe" )

WMI、DCOM 和 PowerShell 遠程管理

最後要指出的是,這個 cmdlet 的後繼者是:Get-CimInstance。雖然 Get-CimInstance 在使用 PowerShell 遠程管理 作為默認的遠程連接協議方面提供了一些優勢,但使用 Get-WmiObject 有時更容易。

Get-WmiObject 使用 DCOM 與遠程計算機通信,通常也是可用的。否則,當希望使用 WSMAN 通過 Get-CimInstance 時,您需要在遠程端點啟用 PowerShell 遠程管理。

有關詳細信息,請查閱 Microsoft 文檔

Source:
https://adamtheautomator.com/get-wmiobject/