Windows管理インストゥルメンテーション(WMI)は、Windowsで長い間使われてきました。多くのITプロは、直接WMIを使用するか、WMIから情報を読み取るツールを使用しています。PowerShellのWMIコマンドレットが組み込まれていることをご存知でしょうか?
WMIは、Windowsマシンの情報を収集し、Windows内部のさまざまなサービスを操作するための事実上の場所です。WMIの幅広い情報にアクセスできるため、PowerShellを使用してWMIを問い合わせることができます。PowerShellを使用してWMIを照会することで、Windowsコンピュータ上で数千のタスクを自動化することができます。
幸いなことに、PowerShellの最初のシステムの1つはWMI用のコマンドでした。ネイティブのPowerShell WMIコマンドレットがあるため、IT管理者はPowerShellの分かりやすい動詞/名詞の構文を活用してWMIと対話することができます。また、パワーユーザーは標準のPowerShellコマンドを使用するだけで、WMIのイベントやクラスを直接呼び出すこともできます。
PowerShell WMIコマンドレットとCIM
PowerShellでWMIを使用する場合、2つの「セット」のコマンドがあります。これらの「セット」は、WMIとの対話の「古い」方法とCIMコマンドレットとして言及されることもあります。WMIから情報をクエリする際、どちらも同じ情報を返しますが、少し異なる方法でアプローチします。「古い」方法は、Get-WmiObject
コマンドを使用してWMIから情報を読み取ることです。その他のWMIコマンドレットには、Invoke-WmiMethod
、Register-WMIEvent
などがありますが、この記事ではこれらをカバーしません。
PowerShellのWMIコマンドレットGet-WmiObject
は機能しますが、重大な欠点があります。リモートコンピュータのクエリには、DCOMを使用しており、DCOMは過去における攻撃手段とされています。DCOMは通常、さまざまなファイアウォールでブロックされています。これが「古い」方法であるため、この方法については詳しく説明しません。代わりに、CIMコマンドレットに焦点を当てます:主に、Get-CimInstance
です。

Get-WmiObject
とGet-CimInstance
の大きな違いは、Get-CimInstance
がリモートコンピュータにアクセスするためにDCOMを使用せず、Get-CimInstance
はなじみのあるPowerShellリモーティング機能のための輸送手段であるWSMANプロトコルを使用していることです。
PowerShell CIMコマンドレット
たとえば、リモートコンピュータのWindowsのバージョンに関する情報を取得したい場合、DCというコンピュータから情報を取得したいとします。情報を含むWMIクラスとクエリしたいコンピュータ名を指定することで、これを実行することができます。
Get-CimInstance
はデフォルトではクラス内のすべての属性を表示しないため、出力をSelect-Object
コマンドにパイプしてすべてのプロパティを返す必要があります。
プロパティを使用して情報を収集するだけでなく、クラス上でWMI/CIMメソッドも呼び出すことができます。これの良い例は、リモートコンピュータ上のプロセスを停止することです。ネイティブでは、PowerShellのStop-Process
コマンドではこれを行う方法はありません。ただし、WMIクエリを使用する方法があります。リモートプロセスを終了するためには、まず終了したいプロセスを特定する必要があります。これは、Win32_Process
クラスを参照することでリモートコンピュータ上のすべての実行中のプロセスを列挙することができます。
終了したいプロセスを特定したら、そのプロセスのインスタンスをキャプチャする必要があります。
以下の例では、Filter
パラメータを使用してccmexec.exe
プロセスのみを受け取るようにしています。これが重要です!
インスタンスをキャプチャしたら、以下に示すようにInvoke-CimMethod
コマンドを使用してTerminate()
メソッドを呼び出してプロセスを終了することができます。
概要
ここではカバーしていない、特にPowerShellのWMIコマンドレットGet-WmiObject
の使用についてさらに学びたい場合は、Get-WmiObject: ローカルおよびリモートコンピュータ上のWMIのクエリを参照することをお勧めします。そこでは、WMIについてより詳しく説明し、Get-WmiObject
コマンドレットを使用します。
PowerShellでのCIM cmdletの詳細な説明については、Technetの「CIM Cmdletsの紹介」記事を参照してください。そこでは、さまざまなCIM cmdletとそれらがスクリプトでどのように使用されるかが示されています。