デスクトップ ファイルPsTools 入門

Wes Miller

この記事で使用しているコードのダウンロード: MillerTheDesktopFiles2007_03.exe (150KB)

昨年まで、Winternals Software に勤務していました。Winternals Software は、マイクロソフトにより 2006 年 7 月 に買収されました。Winternals の市販用ソフトウェアは売却されましたが、創業者である Mark Russinovich と Bryce Cogswell は、多数のツールをフリーウェアとして提供している Sysinternals という別の会社も経営していました。これらのフリーウェア アプリケーションには、

Winternals Administrator's Pak のコンポーネントになっているものもあります。Mark と Bryce は、通常のフリーウェア ライセンス条件の範囲外でこれらのツールを使おうとしている企業に対してライセンスの供与も行っていました。

Sysinternals ライブラリにある多数のツールの中で、PsTools スイートは私のお気に入りのツールの 1 つです。現在、このツールは microsoft.com/technet/sysinternals/utilities/pstools.mspx にあります。このツール名は、UNIX のプロセス リスト ユーティリティ (ps) にちなんで Mark が付けた名前です。ツールのダウンロード サイトに記載されているように、組み込みの Windows® コマンドライン ユーティリティには、これらのツールと同じ機能を実行できるものもあります。ただし、PsTools スイートは、非常に独特な機能であることに加え、ローカルでもリモートでも使用できる点に大きな違いがあります (ただし、リモート システムが適切に構成されている必要があります)。さらに、リモートでもローカルの場合と同じくらい簡単に実行できるというメリットがあります。

PsTools スイートには、図 1 に示すように、複数の個別のアプリケーションが含まれています。他の Sysinternals ユーティリティと同様、インストーラはなく、アプリケーションのみです。これらのアプリケーションをパス上の任意のフォルダに置き、実行するだけです。

Figure 1 PsTools のユーティリティ

ツール 説明
PsExec 任意のユーザー コンテキストでプロセスを実行できます。
PsFile システムで開いているファイルをリモートで表示します。
PsGetSid コンピュータまたはユーザーの Windows セキュリティ識別子 (SID) を表示します。
PsInfo Windows システムの情報を表示します。
PsKill 指定したプロセス名またはプロセス ID によりプロセスを終了します。
PsList 実行中のプロセスの詳細情報を表示します。
PsLoggedOn ローカルのログオン ユーザーおよびリソースを共有しているリモート ユーザーをすべて表示します。
PsLogList Windows イベント ログのレコードをダンプします。
PsPasswd ユーザー アカウントのパスワードを変更します。
PsService Windows サービスを表示および管理します。
PsShutdown コンピュータをシャットダウン、再起動、休止状態に設定、または中断します。
PsSuspend 実行中のプロセスを中断します。

お気付きのとおり、一部の機能 (特に PsLogList) は、Windows Management Instrumentation (WMI) や複雑なスクリプトによって実行することも可能です。ただし、PsTools スイートのメリットは、簡単かつわかりやすい方法で、各ユーティリティが特定のタスクを実行するように設計されていることです。

以下では、各ツールについて説明し、簡単な例を挙げて各ツールの使用目的と使用方法を示します。まず最初に、これらのツールがどのように動作し、動作のために必要な前提条件を簡単に説明します。

ツールの動作

通常、すべてのツールは同じように動作します。ホスト システムで、目的の PsTool を起動します。多くのツールは、ローカルでも実行できますが、リモート システムに対して実行するか、一度に複数のシステムに対して実行した場合に、最大の効果を得ることができます (以下の例で示すように、PsExec は特に優れた効果を発揮します)。ユーティリティは、指定したコマンドライン引数を使用して、リモート システムの管理共有、つまり、リモート システムの %SystemRoot% (Windows ディレクトリ) にコピーされます。

リモート ディレクトリにコピーされると、アプリケーションが起動し、Windows サービスがインストールされます。この Windows サービスは、起動時にユーザーが指定した資格情報を使用して、ユーザーが要求したタスクを実行します。特定のツールでクライアント システム上のエンドユーザー UI が必要な場合、このサービスはユーザーのコンテキストで追加のバイナリを起動します (サービスは直接の対話型 UI を投入できないことに留意してください)。必要な情報は、サービスの起動元のコンソールに返送されます。最後に、サービスは自動的にアンインストールされます。

ご覧のように、これらは強力な自己完結型のツールです。ツールには多数のバイナリおよびプロセスが含まれますが、ユーザーはこれらを気にせずに、目的のツールを実行するだけで動作します。

ツールを使用するには、次の前提条件を満たしている必要があります。Windows NT®、Windows 2000、Windows XP、または Windows Server® 2003 (x86 版と x64 版の Windows はサポートされますが、Itanium 版はサポートされません) のいずれかを使用していること。ツールを実行するリモート システム上で、既定の管理用ネットワーク共有 (admin$) が有効であること。また、Windows ファイアウォール、インターネット接続ファイアウォール、または他のファイアウォール製品を使用するかどうかにかかわらず、リモート システム上のファイルとプリンタの共有のためのポートが開いていること。

PsExec

PsExec は、私のお気に入りのツールの 1 つですが、これは大方の予想とは異なる理由によります。この 2 年間ほとんど、システム上で「管理者以外」で実行しています。管理者ではなく、ユーザーとして実行しています。管理者として実行するのではなく、run.vbs という短いスクリプトを使用することでローカル管理者としてアプリケーションを実行できます (どのようなユーザーとしても実行できます)。図 2 に、スクリプトの内容を示します。このスクリプトは、TechNet Magazine のサイト (technetmagazine.com/code07.aspx) でも入手できます。**このスクリプトでは、Path システム変数に PsTools が格納されていることを前提とします。

Figure 2 Run.vbs

SET WshShell = WScript.CreateObject("WScript.Shell")
SET WshSysEnv = WshShell.Environment("SYSTEM")
SET FSO = CreateObject("Scripting.FileSystemObject")
IF WScript.Arguments.Count <> 0 Then
    FOR EACH arg IN WScript.Arguments
        iArgCount = iArgCount + 1
        strCmdArg = (arg)
        strCmdArray = Split(strCmdArg, " ", 2, 1)
        IF iArgCount = 1 THEN
        strExe = strCmdArray(0)
        ELSEIF iArgCount = 2 THEN
        strRun = strCmdArray(0)
        ELSE
        strParams = strParams&" "&strCmdArray(0)
        END IF
    NEXT
END IF
'/t:0A && title ***** Admin ***** 
        strExt = LCase(Right(strExe, 3))

IF strExt <> "exe" AND strExt <> "bat" AND strExt <> "cmd" THEN
WshShell.Run "psexec.exe -d -i -e -u COMPUTERNAME\USER -p PASSWORD  cmd /c start "&strExe&"
    "&strRun&" "&strParams, 0, FALSE
ELSE
WshShell.Run "psexec.exe -d -i -e -u COMPUTERNAME\USER -p PASSWORD "&strExe&" "&strRun&"
    "&strParams, 0, FALSE
END IF

    SET WshShell = NOTHING
    SET WshSysEnv = NOTHING
    SET FSO = NOTHING

この簡単なスクリプトは、PsExec を使用する際に利用できる機能の 1 つの例であり、これは Winternals で Protection Manager 製品の作業をしていたときに Mark が追加したものです。この機能を使用すると、制限付きユーザーがより高い特権を持つ資格情報を指定して PsExec をローカルで起動できます。当然ですが、PsExec は、一般にリモートでの実行によく使われています。たとえば、独自のリモート機能、スクリプト、または自動化のフレームワークを持たないユーティリティを実行するために使用されます。PsExec のいくつかの重要な機能には、実行の対象となるリモート システムにバイナリをコピーする機能、プロセッサの関係を指定する機能などがあります。PsExec のもう一つの便利な機能は、スクリプト ファイルを指定して、同時に多数のマシンに対するスクリプト化が可能なことです。

PsExec の簡単な使用方法を次に示します。

PsExec \\computer -u username -p password command

図 3 に示すスイッチを使用して、これを拡張することもできます。

Figure 3 PsExec のスイッチ

スイッチ 説明
-a プロセッサの関係を指定します。
-c アプリケーションをリモート システムにコピーするかどうかを指定します。
-d プロセスの終了を待たずに終了します (成功または失敗のメッセージを待ちません)。
-e 指定したアカウントのプロファイルを使用して読み込みます。
-f アプリケーションがリモート システムに存在する場合もアプリケーションをコピーします。最新 (または特定の) バージョンを実行中であることを確認します。
-i リモート システムでアプリケーションを対話形式で実行します (アプリケーションでユーザー インターフェイスをエンド ユーザーに表示する場合に必要です)。
-l アプリケーションを制限付きユーザーとして実行します。Administrators グループ トークンを削除し、プロセスの特権を制限して Users グループのメンバと同じレベルにします。リスクの高いインターネットに接続されたアプリケーションを最小限の特権で実行する場合に便利です。
-n リモート コンピュータとの接続に失敗するまでの待ち時間のタイムアウトを指定します。
-priority 指定した優先順位でプロセスを実行します。つまり、特定のタスクに関する処理の優先順位を Windows でどのように設定するかを指定します (-low、-belownormal、-abovenormal、-high、または -realtime )。
-s システム アカウントを使用してプロセスを実行します (Regedit を実行して特権が設定されたレジストリ キーにアクセスする場合に便利です)。
-v コピー先よりも最新のアプリケーションである場合のみアプリケーションをコピーします。
-x セキュリティで保護された Winlogon デスクトップに UI を表示します (ローカル システムのみ)
@file テキスト ファイルに指定されたすべてのコンピュータでコマンドを実行します。

PsFile

PsFile は、PsExec よりも限定的なツールです。具体的には、リモート システム上で開いているファイル、およびファイルを開いたユーザーを確認するのに使用します。この機能は、サーバーを再起動する前に、開いているファイルを把握する場合に役立ちます。いずれかのユーザーによってファイルがロックされ、ファイルの編集や削除ができないとき、そのユーザーを特定する必要がある場合は、手動で通知するか、PsFile でファイルを閉じることができます。PsFile の使用方法を次に示します。

PsFile \\computer -u username -p password 

上記は、リモート システムで開いているファイル ハンドルの一覧を返します。標準の使用以外にも、ID パラメータを追加して、情報を取得するファイルや閉じるファイルの名前を指定できます。また、-c スイッチを追加して ID パラメータで指定したファイルを閉じることもできます。

PsGetSid

PsGetSid も、非常に限定的なツールです。このツールは、コンピュータ、ユーザー、またはグループのセキュリティ識別子 (SID) を取得します。このツールは、ドメイン内のシステムの SID が重複していないことを確認する場合や、単純にシステム上のすべてのユーザーまたはグループの SID を確認する場合に役立ちます。PsGetSid の使用方法を次に示します。

PsGetSid \\computer -u username -p password account

account には、ユーザー、コンピュータ、またはグループを指定できます。PSGetSid の構文は単純ですが、指定可能ないくつかの追加のパラメータがあります。SID パラメータは、指定した SID を持つアカウント (グループまたはコンピュータ) を指定し、@file は、指定したテキスト ファイルに示されたすべてのコンピュータでコマンドを実行します。

PsInfo

PsInfo を使用すると、詳細なシステム情報を取得できます。言うまでもなく、このツールが最も有益となるのは、複数のリモート システムに対してスクリプト化され、出力先のファイル (Excel® およびデータベース フレンドリな CSV ファイル) が指定されている場合です。このユーティリティは、他の多くのツールとは異なった重要なコンセプトで動作します。したがって、コンピュータ名を指定しないと、PsInfo は既定により、ドメイン内のすべてのコンピュータに問い合わせを試みます。PsInfo の使用方法を次に示します。

PsInfo  \\computer -u username -p password 

構文は単純ですが、図 4 に示すように、追加のスイッチやパラメータを指定できます。

Figure 4 PsInfo のスイッチ

スイッチ 説明
-h Windows の更新プログラムをすべて表示します。
-s システムにインストールされたすべてのアプリケーションを表示します。
-d システムのディスク情報またはボリューム情報を表示します。
-c 結果を CSV 形式で出力します。
-t 既定値の \t 以外に、CSV ファイルの区切り文字をもう 1 つ指定します。
Filter 指定したフィルタに一致するデータのみを表示します。
@file 指定したテキスト ファイルに示されたすべてのコンピュータでコマンドを実行します。

PsKill

PsKill は、ローカル システムまたはリモート システムのプロセスを終了するための優れたユーティリティです。使用方法はごく簡単であり、プロセスとそのすべての子プロセスをすばやく終了することができます。PsKill の使用方法は、上記の他のツールとほとんど同じです。

PsKill -t \\computer -u username -p password process id | process name

終了するプロセスの ID またはプロセス名のいずれかを指定できます。

PsList

私は Process Explorer (詳細は microsoft.com/technet/sysinternals/ProcessesAndThreads/ProcessExplorer.mspx を参照) が非常に気に入っているため、PsList はあまり使用していません。ただし、リモートで実行可能な Process Explorer がないため、Process Explorer のいくつかの重要な機能を合理的に模写したものが PsList になります。実際に、PsList では、リモート システムで実行中の 1 つ以上のプロセスをリモートで表示できます。

PsList の使用方法はごく簡単です。

PsList \\computer -u username -p password account

他のツールの場合と同様、account パラメータにはユーザー、コンピュータ、またはグループを指定できます。図 5 に、追加のパラメータを示しています。

Figure 5 PsList のスイッチ

スイッチ 説明
-t スレッド レベルの情報を表示します。
-m 各プロセスのメモリの詳細を提供します。
-x プロセス、メモリ、およびスレッドの情報を表示します。
-t 情報をプロセス ツリーとして表示します (Process Explorer のツリー ビューを思い出してください)。
-s [n] 指定した秒数だけタスク マネージャ モードで実行します。リモート プロセスの情報を相対的にリアルタイムで表示できます。
-r [n] タスク マネージャ モードで実行するときの更新間隔を指定します (秒単位)。
name 指定した値で始まる名前のプロセスに関する情報を表示します。
-e 完全に一致する名前のプロセスだけが表示されます。
pid 特定のプロセスの情報を表示します。

PsList は強力であると同時に使いやすく、リモート デスクトップを使用せずにリモート プロセスを極めて詳細に表示できます。たとえば、プロセスを制限する必要がある場合は、この情報を使用して PsKill または PsSuspend に進むことが可能です。

PsLoggedOn

PsLoggedOn の背後にある前提条件は一目瞭然です。このユーティリティは、システムにログオンしているユーザーを表示します。ローカル (対話型) ログオンまたはネットワーク共有のログオンを表示できます。PsFile と同様、この機能を使用すると、サーバーのメンテナンスを行う必要があるとき、そのサーバーを使用しているユーザーを調べるのに役立ちます。使用方法は非常に簡単です。

PsLoggedOn \\computer

PsLoggedOn のオプション パラメータは 2 つだけです。-l はローカル ログオンのみ (ネットワーク ログオン以外) を表示し、-x はログオン時刻を除きます。

単純でありながら、PsLoggedOn を使用すると、通常では数箇所の Windows を詳細に調べなければ入手できない情報を簡単に表示できます。

PsLogList

PsLogList は、最も広く使われている実用的なユーティリティの 1 つです。このツールでは、Windows イベント ログのダンプがテキスト形式で出力されるので、ログ リーダー、データベース、その他お好きなものでログ データを使用できます。主な利点は、イベント ログのエントリがバイナリ形式から、さらなる変換や自動化がしやすい形式に変換されることです (Windows Vista™ では、イベント ログを XML として取得できますが、このトピックは別の機会に譲ることにします)。

PsLogList の使用方法は次のとおりです。

PsLogList \\computer -u username -p password

図 6 に示すように、指定できる追加のスイッチやパラメータが多数あります。

Figure 6 PsLogList のスイッチ

スイッチ 説明
-a 指定した日付より後に発生したイベントのみダンプします。
-b 指定した日付より前に発生したイベントのみダンプします。
-c 目的の出力をダンプした後、イベント ログを完全に削除します。
-d 指定した日数の情報のみ表示します。
-e 指定したイベント ID のイベントを除外します (10 個まで指定可能)。
-f イベントの種類をフィルタします (警告、エラーなど)。
-g イベント ログを EVT ファイルとしてエクスポートします (-c スイッチが必要)。
-h 指定した数時間の情報のみ表示します。
-l 指定した EVT ファイルからダンプします。
-m 指定した数分間の情報のみ表示します。
-n 最新のイベントを指定した数だけ表示します。
-o 指定したソースのイベントのみ表示します (Windows System Restore Service の場合は -o SRService など)。
-q 指定したソースのイベントを除外します (-o の逆です)。
-r 順序を逆にします (最も古いものから順番にログ イベントをダンプします)。
-s 区切り文字で囲まれたフィールド内に各行のレコードを並べます。
-t -s の出力に使用するコンマ以外の区切り文字を指定します。
-w 新しいイベントが挿入されるのを待機し、リアルタイムでダンプします。ローカル システムにのみ適用されます。
-x イベント ログから拡張データをダンプします。
eventlog ダンプするイベント ログを指定します。既定値は System です。
@file テキスト ファイルに指定されたすべてのコンピュータでコマンドを実行します。

Windows イベント ログは非常に有効な診断ツールです。重要なことは、操作や統合が可能な形式でデータを出力することです。PsLogList は、この重要な処理を実行します。

PsPasswd

PsPasswd は、単純であると同時に非常に有効なユーティリティです。Net.exe と同様の機能の一部を持つように設計されていますが、リモートでの実行と自動化に対する配慮が付加されています。

PsPasswd  \\computer -u username -p password Username Newpassword

コンピュータの指定、コンピュータの指定なし (ローカル システム)、または \\* と指定して現在のドメイン内のすべてのコンピュータに対してユーティリティを実行することが可能です。PsPasswd には、指定可能な追加のパラメータが 1 つだけあります。@file を指定すると、テキスト ファイルに指定されたすべてのコンピュータに対してコマンドが実行されます。他のユーティリティと同様、非常に多数のシステムに対して機能する基本的なユーティリティです。

PsService

PsService を使用すると、ネットワーク上の 1 つ以上のシステムのサービス コントロール マネージャ (SCM) 情報を表示および編集できます。さらに、ネットワーク上のシステムで特定のサービス名を検索することも可能です。

PsService \\computer -u username -p password command options

PsService を実行するとき、command には図 7 に示されたいずれかのコマンドを指定し、options には特定のコマンドに適用する属性を指定します。追加のコマンド スイッチを指定しない場合、PsService は SCM の全情報をダンプします。

Figure 7 PsService のコマンド

コマンド 説明
query 特定のサービスに対するクエリを実行します。
config 特定のサービスの構成情報を問い合わせます。
setconfig 特定のサービスの構成情報を設定します。
start サービスを起動します。
stop サービスを停止します。
restart サービスを再起動 (停止して起動) します。
pause サービスを一時停止します。
cont 一時停止したサービスを再開します。
depend 特定のサービスに依存するサービスを表示します。
find サービスの特定のインスタンスをネットワークで検索します。
security 特定のサービスのセキュリティ情報を提供します。

PsService は、強力かつリモート実行が可能なコマンドライン版の Services.msc であると考えることができます。ただし、PsService では、ネットワーク中のサービス (危険を伴う可能性があるサービスなど) を検索し、構成情報を設定することも可能です。

PsShutdown

PsShutdown は、私のもう 1 つのお気に入りです。このタスクは組み込みのツール (shutdown.exe) で処理されるとも言われていますが、実際には異なります。主な違いは、PsShutdown の機能にあります。具体的には、リモート システムのシャットダウンと再起動が可能なことです。また、シャットダウンと再起動だけでなく、システムをスタンバイ モードまたは休止状態に設定でき、システムをロックし、一定時間ユーザーにメッセージを表示した後にシステムを再起動できます。

PsShutdown \\computer -u username -p password

図 8 に示すように、PsShutdown で使用できる追加のパラメータは多数あります。

Figure 8 PsShutdown のスイッチ

スイッチ 説明
-a PsShutdown によって開始された既に進行中のシャットダウンを中止します。
-c 対話ユーザーによるシャットダウンの中止を許可します。
-d コンピュータを中断します (スタンバイ)。
-e シャットダウンの理由コード。理由コードについては、PsShutdown と組み込みの shutdown.exe の両方で使用すると問題が発生する可能性があるため、Microsoft Web サイトを参照することをお勧めします。詳細については、msdn2.microsoft.com/en-us/library/aa376885.aspx を参照してください。
-f 実行中のすべてのアプリケーションを強制終了します。
-h コンピュータを休止状態にします。
-k コンピュータの電源を切ります (電源の切断がサポートされない場合は再起動します)。
-l コンピュータをロックします。
-m 対話ユーザーに表示するメッセージを指定します。
-n リモート コンピュータとの接続に失敗するまでの待ち時間のタイムアウトを指定します。
-o コンソール ユーザーをログオフします。
-r コンピュータを再起動します。
-s シャットダウンし、電源を切りません。
-t シャットダウン コマンドを実行するまでの時間、または電源を切断するまでの特定の時間。
-v シャットダウンするまでユーザーにメッセージを表示します。
@file テキスト ファイルに指定されたすべてのコンピュータでコマンドを実行します。

PsShutdown は、非常に有効な、広範囲にわたる構成が可能なシステム電源管理ユーティリティです。このように多機能でありながら、比較的使いやすいツールです。

PsSuspend

PsSuspend は、不正なプロセスを一時的に制御する場合、またはデータやアプリケーション コンテキストを失うことなく CPU 使用率の高いプロセスを一時的に停止する場合に便利なユーティリティです。

PsSuspend \\computer -u username -p password process ID

プロセス ID は、PsList を使用して取得できます。中断されたプロセスは、-r スイッチを使用して再開できます。プロセスの中断と再開のコンセプトは、Process Explorer でも実装されますが、Process Explorer の場合はローカルでのみ動作します。PsSuspend は、リモートでもローカルでもプロセスの中断と再開が可能であるという点で、組み込みの Process Explorer の実装よりも優れています。

まとめ

PsTools スイートは、私にとって極めて重要なユーティリティ セットです。いずれかのシステムで Windows の再インストールを行った場合、他の Sysinternals ユーティリティ (具体的には、Regmon、Filemon、Process Explorer、および Process Monitor) と共に、最初にパスに保存するのは PsTools のプログラムです。PsTools を既にご存じの読者、またはそうでない読者も、このコラムがツールに関する理解を深め、新しい情報の収集に役立つことを期待しています。長年にわたってツールを無償で提供し、このコラムの執筆に当たってご助力いただいた Mark Russinovich に感謝します。

Wes Miller は、テキサス州オースティンにある Pluck 社 (www.pluck.com) の開発マネージャです。以前は、オースティンにある Winternals Software に勤務しており、その前はマイクロソフトで Windows のプログラム マネージャとプロダクト マネージャを兼任していました。Wes の連絡先は、technet@getwired.com です。

© 2008 Microsoft Corporation and CMP Media, LLC. All rights reserved; 許可なしに一部または全体を複製することは禁止されています.