リモート処理出力とローカル出力を比較する
ローカル コンピューターで Get-Process などのコマンドを実行すると、コマンドから System.Diagnostics.Process 型のオブジェクトが返され、Windows PowerShell パイプラインに追加されます。 これらのオブジェクトには、プロパティ、メソッド、および多くの場合イベントがあります。 メソッドにより、タスクを実行できます。 たとえば、Process オブジェクトの Kill() メソッドは、このオブジェクトが表すプロセスを終了します。
注意
すぐに転送できる形式にオブジェクトを変換するプロセスのことを "シリアル化" といいます。 シリアル化では、オブジェクトの状態を受け取り、XML やバイナリ形式などのシリアル データ形式に変換します。 "逆シリアル化" は、フォーマットされた XML またはバイナリ データをオブジェクト型に変換します。
リモート コンピューターでコマンドが実行されると、そのコンピューターは結果を XML にシリアル化し、その XML テキストをユーザーのコンピューターに送信します。 これを行って、オブジェクトの情報をネットワーク経由で送信できる形式に設定します。 ただし、複合オブジェクトの場合、シリアル化プロセスでは、オブジェクトに関する静的な情報 (つまり、そのプロパティ) のみを使用できます。
ユーザーのコンピューターが XML を受信すると、オブジェクトに逆シリアル化され、Windows PowerShell パイプラインに配置されます。 Process オブジェクトがある場合、Get-Member にパイプ処理することで、関連するが、異なる種類のオブジェクトである Deserialized.System.Diagnostics.Process 型になります。 逆シリアル化されたオブジェクトにはメソッドもイベントもありません。
PowerShell リモート処理の一部であるシリアル化と逆シリアル化を考えると、この方法で取得されたすべてのオブジェクトは静的スナップショットと見なす必要があります。 オブジェクト プロパティの値は更新できません。また、オブジェクトを使用してアクションを実行することもできません。 そのため、リモート オブジェクトとの対話を必要とするタスクは、PowerShell リモート処理セッションの一部としてリモート コンピューター上で実行する必要があります。
たとえば、目的の結果が得られないコマンドの例を次に示します。
Invoke-Command –Computer LON-DC1 –ScriptBlock { Get-Process –Name Note* } |
Stop-Process
この例では、Process オブジェクトを取得していますが、プロセスを停止するタスクは、リモート コンピューターではなくローカル コンピューターで実行されています。 これにより、リモート プロセスと偶然名前が一致するローカル プロセスがすべて停止されます。
目的の結果を達成するための適切な方法は、次のように実行することです。
Invoke-Command –Computer LON-DC1 –ScriptBlock { Get-Process –Name Note* |
Stop-Process }
この場合、処理は完全にリモート コンピューター上で発生し、最終的な結果のみがシリアル化されて返されます。 これら 2 つのコマンドの違いは軽微ですが、理解することが重要です。