PsExec を使うと SYSTEM ユーザ権限でプログラムを実行できる

Windows Server において、ローカルアカウントを使用する決まりになっている運用管理者は意外といると思う。

そんな人が、Java アプリの様子を見たくて、まずはプロセス ID を調べようと jps.exe を叩いて、対象の Java アプリが見つからない、といった事態が起こったりする。

これは対象の Java アプリが SYSTEM ユーザで起動されているために、ローカルアカウントからは見えなくなっているため。

ではどうするかというと、SYSTEM アカウントの権限を得てプログラムを実行できるPsExec」という Microsoft 製のツールを使うと、ローカルアカウントからでも SYSTEM アカウントが実行している Java アプリの様子を見たりできる。

PsExec のダウンロードとインストール

PsExec.exe は Microsoft の以下のサイトからダウンロードできる。

ダウンロードしたら、特にインストール作業は不要。適当にパスを通したり、パスを通さないのであれば PsExec.exe までのフルパスを指定して使ってあげれば良い。

PsExec 自体について

PsExec は、Sysinternals と呼ばれる Microsoft が提供している Windows 用のトラブルシューティングツール集のうちの1つである。もともと Sysinternals 社が開発していたものを、Microsoft が買収したようである。

Sysinternals として提供されるツール群の中に、PsTools と呼ばれる Windows 管理用のユーティリティ集のくくりがあり、PsExec はその中の1つ、という位置付けである。

無償だし、Microsoft が提供している公式ツールなので、安心して使ってほしい。Sysinternals には他にも色々な便利ツールが沢山入っているので、システムの運用・保守・管理者であれば入れておきたい。

PsExec を使い SYSTEM 権限でプログラムを実行する

では、実際に PsExec を使ってみる。

SYSTEM 権限で任意のプログラムを実行するには、-s オプションを指定する。

Rem PsExec、Jps ともにパスが通っているテイだとこんな感じ
PsExec -s Jps

Rem パスを通していなければ以下のようにフルパスを指定すれば良い
Rem 以下は JStat で PID:9999 を5秒間隔で監視するサンプル
C:\Sysinternals\PsExec.exe -s C:\Java\bin\JStat.exe -gc 9999 5s

こんな風に使ってあげれば良い。

毎回指定するのが面倒なら、コマンドプロンプトを SYSTEM 権限で起動しちゃう

毎回 PsExec -s App.exe などと書くのが面倒なのであれば、コマンドプロンプト自体を SYSTEM 権限で起動してやれば良い。

> PsExec -i -s Cmd

PsExec はリモートでも使える

自分は使ったことがないので参考記事の紹介まで。PsExec はリモート接続にも利用できる。

取扱には注意

平たく言ってしまえば「管理者アカウントになりすまして、リモートで色んな操作ができる」のが PsExec なので、取扱には注意したい。

権限さえあれば何でも実行できてしまうので、場合によってはセキュリティホールにすらなり得ます。

PsExec の細かい仕組みについては以下が参考になる。