Windowsコンピュータおよびそのコンポーネントに関する情報を取得する必要がある場合、Get-WmiObject
を使用することができます。
WMIのメソッドを活用することで、Get-WmiObject
はローカルまたはリモートシステム上でアクションを実行することもできます。このコマンドレットは、WMIリポジトリと連携して多数のシステムを管理する際に非常に便利です。
Get-WmiObjectを使用してクラスを検出する
基本的にこのコマンドレットは、ローカルコンピュータから情報をクエリすることができます。必要なのは、情報が格納されているWMIクラスと、そのクラスが存在する名前空間(おそらくデフォルトのroot\cimv2
)を知っていることです。
クラスは数千あり、どのクラスを使用したいかはおそらくわかりません。 Get-WmiObject
を使用すると、名前空間内のすべての利用可能なクラスをクエリできます。Get-WmiObject -List
を使用すると、root\cimv2
名前空間内のすべてのクラスを表示することができます。他の名前空間のクラスをチェックする必要がある場合は、Namespace
パラメータを使用することもできます。
WMIプロパティの取得
クラスを取得したら、そのクラスに含まれるプロパティを調査して確認する必要があります。たとえば、コンピュータが実行しているオペレーティングシステムを確認したい場合があります。レポートを作成し、リモートマシンの実行状態を確認したい場合もあります。 Get-WmiObject
には、ComputerName
パラメータがあり、ローカルではなく1台以上のリモートコンピュータを指定することができます。
私のリモートコンピュータは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メソッドの1つは、Win32_Process
クラスのCreate
メソッドです。Invoke-WmiMethod
を使用するなど、いくつかの異なる方法でWMIメソッドを呼び出すことができますが、Get-WmiObject
でも同様に行うことができます。単にWMIインスタンスを取得し、そのオブジェクト上でメソッドを呼び出す必要があります。
以下は、リモートコンピューター上でnotepad.exeを起動する例です。さらに、別の資格情報を使用して行っています!
WMI、DCOM、およびPowerShellリモーティング
最後に指摘することは、このコマンドレットの後継者であるGet-CimInstance
です。PowerShellリモーティングをデフォルトのリモート接続プロトコルとして使用するなど、Get-CimInstance
にはいくつかの利点がありますが、Get-WmiObject
の方が使いやすい場合もあります。
Get-WmiObject
は、リモートコンピューターとの通信にDCOMを使用し、通常利用できる場合もあります。それ以外の場合は、WSMANを介してGet-CimInstance
を使用するために、リモートエンドポイントでPowerShellリモーティングを有効にする必要があります。
詳細については、Microsoftのドキュメントを参照してください。