PowerShell 2.0では、WMI関係の機能強化が行われています。どのような機能強化かと云えば、以下のようなものがあります。
この中から、Invoke-WmiMethodとRemove-WmiObjectをご紹介します。最初にサンプルのコードを以下に記述します。
PS (1) >$note = Invoke-WMIMethod -Path Win32_Process -Name create -Argumentlist notepad.exe PS (2) >$note __GENUS : 2 __CLASS : __PARAMETERS __SUPERCLASS : __DYNASTY : __PARAMETERS __RELPATH : __PROPERTY_COUNT : 2 __DERIVATION : {} __SERVER : __NAMESPACE : __PATH : ProcessId : 4720 ReturnValue : 0 PS (3) >$ps = Get-WMIObject Win32_Process PS (4) >$ret = $ps | Where-Object { $_.ProcessId -eq $note.ProcessId } PS (5) >Remove-WMIObject -InputObject $ret
1行目のInvoke-WmiMethodでは、WMIのWin32_ProcessクラスのCreateメソッドに引数として「notepad.exe」を指定しています。これで何が行われるかと云えば、メモ帳の起動(インスタンスの作成)が行われます。そして、戻り値からプロセスIDを取得することができます。 3行目でWin_Processクラスのインスタンスのコレクションを取得します。そして4行目で、1行目で起動したメモ帳のWMIオブジェクトを取得します(もちろん、3行目でWMIクエリーで取得する方法もあります)。 5行目のRemove-WmiObjectでメモ帳のWMIオブジェクトのインスタンスを削除します。つまり、プロセスを終了させるのです。
このように作成したWMIオブジェクトのインスタンスを自由に削除することができるように拡張がなされています。#この例を実行するには管理者権限が必要になります(Remove-WmiObjectが管理者権限を必要とします)」。#以前のエントリで説明したWin32_ProductクラスはVista SP1で解決されています。