Jaa


[PS] 2.0におけるWMIの機能強化

 PowerShell 2.0では、WMI関係の機能強化が行われています。どのような機能強化かと云えば、以下のようなものがあります。

  • Get-WmiObject:Impersonation(偽装)などのパラメータが追加された。
  • Invoke-WmiMethod:WMIクラスのメソッドを呼び出す機能。
  • Remove-WmiObject:WMIオブジェクトの削除。
  • Set-WmiInstance: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で解決されています。