読者です 読者をやめる 読者になる 読者になる

Windowsでリモートコマンド実行 PsExec

Windows Serverでリモートコマンドを実行する必要があって、「サーバなんだから簡単にできるだろう」と思っていたら、結構手こずりました。

忘れない内に、簡単にメモ。

今回、実現したかったのは、以下の条件を満たすリモート処理。

  1. WindowsServer間で実行
  2. リモートのマシンで実行ユーザを指定可能
  3. ASP.NETから実行
  4. 同期実行

検討 or 検証したのは、以下の方法。

AT or SCHTASKS コマンド

  • 概要
    • タスクスケジューラに登録して、コマンドを実行する。
  • 結果:×
    • 非同期にしかできないため、不採用。

WinRM 2.0 + PowerShell 2.0

  • 概要
    • SOAPベースの通信で、リモートでコマンドを実行する。
    • Windows2008には標準でインストールされているが、Windows2003Serverの場合は、以下からダウンロードしてインストールすれば利用できる。
  • 結果:×
    • コマンドプロンプトから実行した場合はうまく動作したが、ASP.NETから実行すると、コマンドが起動時に停止したままになる(権限の問題か?)。

PsExec

  • 概要
    • PsToolsというプロセス関連のユーティリティのひとつ。プロセスをリモートで実行できる。
    • リモートで実行するコマンド(batファイルなど)を、リモートにコピーすることもできる。
  • 結果:△
    • コマンドプロンプトから実行した場合はうまく動作したが、ASP.NETから実行すると、以下の問題あり。
      • リモートのコマンドで、標準エラー出力をリダイレクトしておかないと、一部動作しない処理がある。
      • 上記リダイレクトを行うと、コマンドは正常に実行されるが、呼び出し元の方で、PsExecのプロセスが終了しない。これは、非同期(PsExecは、同期/非同期の呼び出しをオプションの有無で切り替えられる)にすると、動作する。
    • リダイレクト+非同期という制限付きならば、うまく動作した。


PsExecの制限は、解決できず・・・
誰か、解決方法知りませんか?


その他、WSH(+WMI)で自前で実装することも考えたが、開発の時間もないため、PsExecを採用することにした。


(2010/06/18 追記)

PsExec

  • 概要
    • PsToolsというプロセス関連のユーティリティのひとつ。プロセスをリモートで実行できる。
    • リモートで実行するコマンド(batファイルなど)を、リモートにコピーすることもできる。
  • 結果:○
    • 「-i」というオプション*1を指定すると、コマンドラインから実行した場合でも、ASP.NETから実行した場合でも、正常に処理が終了した。
    • リモートコマンドで、リダイレクトしていなくても、問題なし。


PsExecを利用すると、やりたい処理が実現できました!

*1:「プログラムを実行して、リモート システムの指定したセッションのデスクトップと対話するようにします。セッションを指定しないと、プロセスはコンソール セッションで実行されます。」はじめ、ヘルプを読んだだけでは、分からなかったけど、試してみたらうまくいった