PsExecを使ってリモートのWindows PC上のプログラムを実行するTech TIPS

Windowsにはリモート・コンピュータ上でプログラムを実行するための標準機能がいくつかあるが、意外と冗長だったり事前の設定が面倒だったりする。Windows Sysinternalsの「PsExec」コマンドを使えば、コマンドライン・プログラムを手軽にリモート実行できる。

» 2012年05月11日 00時00分 公開
[島田広道デジタルアドバンテージ]
「Tech TIPS」のインデックス

連載目次

対象OS:Windows XP/Windows Vista/Windows 7/Windows Server 2003/Windows Server 2008/Windows Server 2008 R2



解説

 コンピュータを管理・運用していると、管理対象コンピュータの設定を確認したり、設定を変更したりするのに、ちょっとしたプログラムをリモートで実行したくなることがある。

 例えば、コンピュータのIPアドレスを確認したい場合、いちいちコンソールまで赴いてログオンしてipconfigコマンドを実行するのはあまりにも面倒だ。

 ネットワークを介してリモート・コンピュータに接続してから、そこで直接ipconfigコマンドを実行し、その結果を管理用コンピュータに集めるところまで自動的に実行したい。

 このような場合、UNIXやLinuxではrshやrexecなどのリモート実行コマンドがよく利用される。だが、Windows OSにはこれらと同じ機能の標準コマンドは用意されていない。

 Windows OSには標準で、リモート・コンピュータ上でプログラムを実行する手段がいくつか備えられている。

 例えばリモート・デスクトップは、リモート・コンピュータで有効化しておけば、容易にそのデスクトップをローカル・コンピュータから利用できる便利な機能だ。

 しかし、前述の例のようにipconfigコマンドの出力が欲しいといった場合、リモート・デスクトップの機能は少々冗長で、処理の自動化も面倒だ。コマンドの実行結果が欲しいだけなのに、いちいちログオンして操作しなければならない。

 RemoteAppやタスク・スケジューラという手段もあるが、事前に設定やタスク作成などが必要なので、あまり手軽とはいえない(RemoteAppについては関連記事「ターミナル・サービスの利用形態」参照)。

 こうした場合に役立つツールとして、本稿では、Windows Sysinternalsで配布されている「PsExec」を使って、リモート・コンピュータ上でプログラムを容易に実行する手順を説明する(Sysinternalsについては関連記事「Sysinternalsツールをオンラインで使う」参照)。

 PsExecはWindows標準ではないがマイクロソフト純正の無償ツールであり、インストールの手間もほとんど要らず、事前の設定も最小限で済む。GUIベースのプログラムには適さないが、コマンドライン・プログラムであれば、ローカルで実行するのとほとんど変わらない感覚で利用できる。

操作方法

●PsExecの入手

 PsExecは次のWebページからダウンロードできる。

 このページの真ん中の段の上部にある「PsToolsのダウンロード」というリンクをクリックすると、PSTools.zipというZIPファイルがダウンロードされる。PsExecを実行したい管理用コンピュータで、このZIPファイルからPsExec.exeというファイルを展開・保存する。

 この際、ウイルス対策ソフトウェアによっては、ウイルスの感染を警告することがある。これは、PsToolsを悪用したウイルスがあるためだ。警告が出た際は、十分に内容を確認したうえで、展開してほしい。

 これでPsExecを実行できるようになる(インストーラはない)。なお、PsExecの初回起動時のみ、使用許諾(PsExec License Agreement)のダイアログが表示されるので、内容を読んで[Agree]ボタンをクリックする。

●リモート・コンピュータの準備

 PsExecを起動する管理用コンピュータ(ローカル・コンピュータ)と、プログラムを実行したいリモート・コンピュータとの間にファイアウォールがある場合、リモート・コンピュータの受信において、次の通信ポートを開放する必要がある。

  • 135/tcp(RPCエンドポイント・マッパー)
  • 445/tcp(ダイレクト・ホスティングSMB)
  • 1025〜65535/tcp(RPC動的ポート)

 このうちRPC動的ポートは、%SystemRoot%\system32\services.exeに対して開放する必要がある。

 Windows XP/Windows Server 2003のWindowsファイアウォールの場合は、例外ルールの「ファイルとプリンタの共有」を許可する設定をすればよい。Windows 7/Windows Server 2008 R2などの「セキュリティが強化された Windows ファイアウォール」の場合は、[受信の規則]で[グループ]が「リモート サービス管理」である項目をすべて有効化する。

 また筆者が試した限りでは、リモート・コンピュータでユーザー・アカウント制御(UAC)が有効な場合、psexec実行時にアクセス拒否エラーが発生することがあった。その場合はUACを無効化する必要がある。

 上記のほかには、例えばpsexec用サービスを用意するといったリモート・コンピュータ側での準備は必要ない。

●PsExecの基本的な使い方

 詳しくは後述するが、PsExecを使うには、リモート・コンピュータの管理者権限が必要になる。ここでは話を簡単にするために、リモート・コンピュータにて管理者権限を持つアカウントでローカル・コンピュータにログオンしてPsExecを起動するものとする。

 PsExecはコマンドライン・プログラムなので、コマンド・プロンプトを開いて、次のようにコマンドラインを入力・実行する。

psexec \\<コンピュータ名> <リモートでのコマンドライン>



 <コンピュータ名>で指定したリモート・コンピュータ上で、<リモートでのコマンドライン>が実行される。このとき、<リモートでのコマンドライン>には、リモート・コンピュータ上に存在するプログラム(実行ファイル)を指定する。検索パス(PATH環境変数)に含まれるプログラムの場合は、単に実行ファイル名を指定するだけで実行できる。検索パスに含まれない場合は、リモート・コンピュータ上でのプログラムの場所をフル・パスで指定する必要がある。

 例えば、server1というリモート・コンピュータでipconfigコマンドを実行したい場合は、次のようにPsExecを実行する。

C:\work>psexec \\server1 ipconfig ……(1)

PsExec v1.98 - Execute processes remotely
Copyright (C) 2001-2010 Mark Russinovich
Sysinternals - www.sysinternals.com

Windows IP Configuration ……(2)

Ethernet adapter ローカル エリア接続:

        Connection-specific DNS Suffix  . : example.co.jp
        IP Address. . . . . . . . . . . . : 192.168.1.11
        Subnet Mask . . . . . . . . . . . : 255.255.255.0
        Default Gateway . . . . . . . . . : 192.168.1.1
ipconfig exited on server1 with error code 0. ……(3)

C:\work>

リモート・コンピュータ「server1」でipconfigコマンドを実行した例
PsExecによって、server1上でipconfigコマンドが実行され、その結果がローカル・コンピュータに表示されたところ。
  (1)PsExecのコマンドライン。
  (2)server1で実行されたipconfigコマンドの出力(「Default Gateway」の行まで)。PsExecを起動したローカル・コンピュータの標準出力に出力される。
  (3)PsExecによって表示されたipconfigコマンドの戻り値。リモートで実行したプログラムでエラーが発生したかどうか、といった確認ができる。

 PsExecによって実行されたコマンドの出力は、リモート・コンピュータからローカル・コンピュータに転送され、標準出力にリダイレクトされる(上記の(2))。一方、バージョンやコピーライトといったPsExec自身によるメッセージは標準エラー出力に出力される。そのため、PsExecの標準出力をリダイレクトすると、リモートで実行したプログラムの出力だけをファイルに保存できる。

 なお、PsExecはグラフィカルな出力をローカルに転送できないため、GUIベースのプログラムをPsExecで起動すると、入力待ちの状態で操作不能になり、リモート・コンピュータのタスク・マネージャなどで強制終了せざるを得なくなる。リモート・コンピュータで実行する場合は、コマンドライン・プログラム専用と考えるべきだ。

●リモートで実行するときのアカウントを指定する

 前述のipconfigの実行例では、リモート・コンピュータ上のipconfigコマンドは、ローカル・コンピュータでPsExecを実行したときと同等のアカウント(資格情報)で実行される。PsExecでは、このリモートでの実行アカウントを-uオプションで明示的に指定できる。

psexec -u server1\administrator -p <パスワード> \\server1 ipconfig



 -pオプションを指定しない場合、PsExec実行直後に「Password:」というプロンプトが表示されるので、指定したアカウントに対応するパスワードを入力する。

 特定のアカウントを指定しなければならない状況としては、まずローカル・コンピュータでPsExecを実行するときのアカウントが、リモート・コンピュータの管理者権限を持っていない場合が挙げられる。リモートで管理者権限のないアカウントでPsExecを実行すると「アクセスが拒否されました」というエラーが表示されて、実行に失敗する。

 そのため、ローカル・コンピュータとリモート・コンピュータが異なるドメインに所属している(かつ信頼関係がない)場合や、少なくとも一方がワークグループ構成の場合は、-uオプションによるアカウント指定が必須となるだろう。

 また、リモート・コンピュータで実行されるプログラムが共有フォルダなどのネットワーク・リソースをアクセスする場合も、アカウントの明示的な指定が必要だ。アカウントを明示しない場合、リモート・コンピュータでのプログラム実行には、PsExecを実行したときのアカウントに「偽装」したアカウントが利用される。この偽装アカウントはネットワーク・リソースにアクセスする権限がないので、やはりアクセス拒否エラーで実行に失敗してしまうのだ。

 そのほか、ローカル・コンピュータではログオンできない特定アカウントでプログラムを実行しなければならない場合も、-uオプションでそのアカウントを指定する必要がある。

 セキュリティ上、注意が必要なのは、-uオプションでアカウントを指定した場合、そのパスワードが平文でネットワークに流れてしまう、という点だ。パケット・モニタリングが仕掛けられている可能性があるような信頼できないネットワークでは、-uオプションは使うべきではない。

●リモート・コンピュータ上でコマンド・プロンプトを起動する

 例えば障害解析のために、リモート・コンピュータ上でいくつかのプログラムを実行してステータスを集めたい、といった場合は、リモート・コンピュータ上でコマンド・プロンプトを起動すると便利だ。

psexec \\server1 cmd



 このコマンドラインを実行すると、「C:\Windows\system32>」というプロンプトが表示され、リモート・コンピュータ上で起動されたコマンド・プロンプトの入力待ち状態になる。あとは、普段と同じくコマンドラインを入力すればリモート・コンピュータ上で実行され、結果がローカル・コンピュータに表示される。コマンド・プロンプトを終了するには、exitコマンドを実行する。

 コマンド・プロンプトの内部コマンドを利用したい場合、コマンド・プロンプトを/cオプション付きで起動する必要がある(この意味はcmd /?のヘルプで確認できる)。以下は特定フォルダのファイル/サブ・フォルダ一覧を取得するためのコマンドラインである。/cに続いて、実行したいコマンドの文字列を指定する。

psexec \\server1 cmd /c "dir /a /s c:\work"



 dirコマンドは内部コマンドなので、このようにcmdのオプションとして指定する必要がある。

●複数のリモート・コンピュータで同じプログラムを実行する

 PsExecは単体で、複数のリモート・コンピュータに対して同じプログラムを実行させることができる。それには、単純にリモート・コンピュータ名をカンマで区切って指定すればよい。

C:\work>psexec \\server1,\\server2,\\mailsvr cmd /c set PROCESSOR_ARCHITECTURE ……(1)

PsExec v1.98 - Execute processes remotely
Copyright (C) 2001-2010 Mark Russinovich
Sysinternals - www.sysinternals.com

\\server1:

PROCESSOR_ARCHITECTURE=x86 ……(2)
cmd exited on server1 with error code 0.
\\server2:

PROCESSOR_ARCHITECTURE=AMD64 ……(3)
cmd exited on server2 with error code 0.
\\mailsvr:

PROCESSOR_ARCHITECTURE=x86 ……(4)
cmd exited on mailsvr with error code 0.

C:\work>

複数のリモート・コンピュータに同じプログラムを実行させる
このように複数のリモート・コンピュータ名を指定すると、1台ずつ順次実行される。
  (1)server1とserver2、mailsvrという3台のサーバに、プロセッサのアーキテクチャ(32bitか64bitか)を表示するプログラムを実行させるように指定している。
  (2)server1におけるプログラムの実行結果。
  (3)server2におけるプログラムの実行結果。
  (4)mailsvrにおけるプログラムの実行結果。

 あるいは、対象コンピュータ名を一行ずつ記したテキスト・ファイルを用意し、@<テキスト・ファイル名>というオプションを指定してPsExecを実行してもよい。

psexec @list.txt cmd /c set PROCESSOR_ARCHITECTURE



 この場合、list.txtに記されたリモート・コンピュータに対して、プロセッサ・アーキテクチャを表示させるプログラムが順次実行される。

●Systemアカウントでプログラムを実行する

 PsExecでは、-sオプションを指定することで、Systemアカウントの権限でプログラムを実行できる。これにより、例えばレジストリ・キーのHKLM\SAM\SAMのように、Systemアカウントだけにアクセスが許されているオブジェクトにもアクセスできるようになる。以下の例は、regコマンドでリモート・コンピュータserver1のレジストリHKLM\SAM\SAMキー以下を表示するものだ。

psexec -s \\server1 reg query HKLM\SAM\SAM /s



 もしPsExecの実行アカウントがリモート・コンピュータ(server1)の管理者権限を持っていない場合は、前述の-uオプションを併用する。

psexec -u example\administrator -s \\server1 reg query HKLM\SAM\SAM /s



●実行したいプログラムがリモート・コンピュータにない場合は?

 例えばリモート・コンピュータにまだ展開していない独自プログラムを実行したい、といった場合には、-cオプションを指定する。

psexec -c \\server1 <ローカル・コンピュータ上のプログラムのパス>



 ローカル・コンピュータにあるプログラムが、リモート・コンピュータの%SystemRoot%\system32フォルダにコピーされてから実行される。実行が完了すると、そのプログラムは自動的にリモート・コンピュータから削除される。

 -cオプションを指定したとき、リモート・コンピュータの%SystemRoot%\system32フォルダに同じ名前のプログラムが存在すると、「ファイルがあります。」というエラーでコピーにも実行にも失敗する。ローカルのプログラムで上書きして実行したい場合は、-cオプションと一緒に-fオプションを指定する。リモートよりローカルのプログラムのバージョンや日付が新しい場合のみ上書きするには、-cオプションと一緒に-vオプションを指定する。


 このほかにもPsExecは各種オプションを装備している。その詳細については、次のTechNetのページにあるオプション説明を参照していただきたい。

「Tech TIPS」のインデックス

Tech TIPS

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。