今回は、前回紹介したPsToolsスイートの中からPsExecユーティリティを紹介します。PsExecを使用すると、1台または複数のリモートコンピューター上で任意のプロセスを実行することができます。PsExecはコンソールアプリケーションの入出力ストリームをリダイレクトするため、Telnetセッションのように、ローカルで実行する感覚でプロセスを実行できます。これにより、標準ではローカルコンピューターの操作しかできないコンソールユーティリティであっても、リモート対応になります。

 この機能の特に効果的な使い方は、リモートシステムのコマンドプロンプト(Cmd.exe)を実行することです。そうすることで、あたかもローカルコンピューターで実行されているかのように、リモートシステムのコマンドプロンプトと対話できます。他の多くのリモート制御ユーティリティとは異なり、PsExecは、操作対象のコンピューターにエージェントやその他のクライアントソフトウェアを事前にインストールしておく必要がありません。もちろん、コンピューターのリモート管理を行うには、権限のあるアカウントが必要になります。

リモート上の任意のプログラムをシステムアカウントで実行可能

 PsExecを使用すると、システムアカウント権限でプログラムをローカルまたはリモートで対話的または非対話的に実行することもできます。例えば、レジストリエディター(Regedit.exe)をシステムアカウントで実行すると、HKLM¥SAMやHKLM¥Securityなど、システムアカウントだけがアクセスできるレジストリキー階層を参照することができます。また、PsExecを使用して非対話型セッション内でプログラムを実行し、ユーザーログオフ後もそのプログラムを実行し続けることができます。PsExecには、ユーザーアカウント、特権レベル、優先度レベル、CPUの割り当てなど、他にも多くのオプションが用意されており、ローカルまたはリモートで実行するプロセスを制御する手段を提供します。

 リモートコンピューター上でプロセスを実行する場合のコマンドライン構文は次のようになります。

psexec ¥¥<コンピューター名> [<オプション>] <プログラム> [<引数>]

 次の例は、リモートシステム上でipconfig /allを実行し、結果の出力をローカルに表示します。

psexec ¥¥server1 ipconfig /all

 プロセスをローカルコンピューター上で実行するには、単純に¥¥<コンピューター名>パラメーターを省略します。

psexec [<オプション>] <プログラム> [<引数>]

 コマンドラインの<プログラム>の部分に空白が含まれる場合、プログラムパスを引用符(‘)で囲んでください。また、リモートで実行するコマンドラインにパイプやリダイレクト記号のような特殊文字が含まれる場合、コマンドシェル(Cmd.exe)のエスケープ文字(^)を使用して、ローカルのコマンドシェルによって特殊文字として扱われないように回避します。次の例は、server1上でipconfig /allを実行し、その標準出力をserver1上のC:\ipconfig.outにリダイレクトします。

psexec ¥¥server1 cmd.exe /c ipconfig /all ^> c:¥ipconfig.out

 上記のコマンドラインでエスケープ文字(^)を付けなかった場合、PsExecコマンドの標準出力(ipconfigのリダイレクトされたコンソール出力を含む)が、ローカルコンピューターのC:¥ipconfig.outに書き込まれることになります(なお、PsExecの診断出力は、PsExecの標準出力ではなく、標準エラー出力に書き込まれるため、ローカルにリダイレクトされるのはリモートプロセスの出力だけになります)。

 コマンドラインの<プログラム>の部分にファイル名だけが指定されている場合、そのファイルがリモートシステムのPATH環境変数内で見つかる必要があります。システム環境変数のPATH変数に対する変更は、次の再起動後に反映され、PsToolsのサービスに認識されます)。<プログラム>の部分に絶対パスを指定する場合は、ドライブ文字をリモートシステムの環境に合わせてください。例えば、「C:」はリモートシステムのC:ドライブを指しています。ローカルコンピューターに割り当てられたネットワーク共有のドライブ文字や、ユーザーのログオン時に割り当てられるネットワーク共有のドライブ文字は、認識されません。ただし、プログラムがリモートシステムに存在しない場合、PsExecはプログラムファイルをローカルコンピューターからリモートシステムにコピーすることができます。