[PS]PowerShellリモーティング

PowerShell2.0CTPでは、PowerShellリモーティングなるものが提供されています。リモーティングの言葉通り、リモートコンピュータのPowerShellを手元のPowerShellから操作する機能です。このPowerShellリモーティングを使用するには、以下のような前提条件があります。

  1. Windows XP/Windows Server 2003
    Windows Remote Managementが必要になります。
  2. Windows Vista
    SP1が必要になります。現在公開されているRCで問題はありません。
  3. Windows Server 2008
    特に必要なものはありません。

Windows Remote Management(WinRM)の最新版があれば、PowerShellリモーティングを動作させることができます。WinRMとは、WS-ManagementというSOAPベースのプロトコルを使った管理用プロトコルのWindows実装です。WinRMは、Windows Vistaには標準で含まれているのですが、PowerShell2.0で使用するには更新されたバージョンが必要になるのです。
 この準備ができたらPowerShell2.0CTPをインストールしてから、WinRMの設定を行います。設定方法は、PowerShell2.0CTPのリリースノートに記載されている通りで、1)WinRMサービスの起動、2)$PSHome\Configure-Wsman.ps1スクリプトの実行の2つです。

 実際の使い方は、2種類あります。1つ目は、以下の通りです。

 PS (1) >Invoke-Exparession hostname -ComputerName コンピュータ名

Invoke-ExpressionにComputerNameパラメータを指定することで、指定したコンピュータ上のPowerShell2.0でhostnameコマンドを実行して、結果をコンソールに表示します。2つ目の方法は、Runspaceオブジェクトを指定します。

 PS (2) >$remote = New-Runspace -ComputerName コンピュータ名
PS (3) >Invoke-Exparession hostname -Runspace $remote

New-Runspaceを使ってコンピュータ名に対応したRunspaceオブジェクトを作成します。このRunspaceオブジェクトを指定してコマンドレットを実行するだけです。
つまりPowerShellリモーティングに対応したコマンドレットとは、ComputerNameパラメータとRunspaceパラメータを指定できるように拡張されたコマンドレットであると言えます。この意味で、前回にご紹介したバックグラウンドジョブ(Start-PSJob)などもリモーティングで使用することができます。
 このPowerShellリモーティングは、WinRMのエンドポイントとしてPowerShell.exeを登録しています(この設定が、Configure-Wsman.ps1で行っています)。ですので、IISのようなHTTPサーバーを必要としないのです。また、ComputerNameパラメータには、コンピュータ名を配列で指定することができます。つまり1:Nの通信を行うことができるのです。よって、リモートコンピュータの管理という面では便利かなと私は思っています。
 内部的な動作としては、RemoteRunspaceオブジェクトを作成して、このRemoteRunspaceの中でコマンドレットを実行しています。そしてComputerNameパラメータを指定した場合は、一時的なRemoteRunspaceオブジェクトを作成してコマンドを実行するようになっています。