Get-WmiObject: コンピュータ情報を問い合わせる

Windowsコンピュータおよびそのコンポーネントに関する情報を取得する必要がある場合、Get-WmiObjectを使用することができます。

WMIのメソッドを活用することで、Get-WmiObjectはローカルまたはリモートシステム上でアクションを実行することもできます。このコマンドレットは、WMIリポジトリと連携して多数のシステムを管理する際に非常に便利です。

Get-WmiObjectを使用してクラスを検出する

基本的にこのコマンドレットは、ローカルコンピュータから情報をクエリすることができます。必要なのは、情報が格納されているWMIクラスと、そのクラスが存在する名前空間(おそらくデフォルトのroot\cimv2)を知っていることです。

クラスは数千あり、どのクラスを使用したいかはおそらくわかりません。 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パラメータがあり、ローカルではなく1台以上のリモートコンピュータを指定することができます。

私のリモートコンピュータは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メソッドの1つは、Win32_ProcessクラスのCreateメソッドです。Invoke-WmiMethodを使用するなど、いくつかの異なる方法でWMIメソッドを呼び出すことができますが、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リモーティング

最後に指摘することは、このコマンドレットの後継者であるGet-CimInstanceです。PowerShellリモーティングをデフォルトのリモート接続プロトコルとして使用するなど、Get-CimInstanceにはいくつかの利点がありますが、Get-WmiObjectの方が使いやすい場合もあります。

Get-WmiObjectは、リモートコンピューターとの通信にDCOMを使用し、通常利用できる場合もあります。それ以外の場合は、WSMANを介してGet-CimInstanceを使用するために、リモートエンドポイントでPowerShellリモーティングを有効にする必要があります。

詳細については、Microsoftのドキュメントを参照してください。

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