リモートのWindows PCで実行中のプロセスのコマンドラインパラメーターを調査するTech TIPS

リモートのWindows PC上で実行中のプロセスの状態を調べる場合、そのコマンドラインパラメーターまでチェックしないと、何を実行しているか特定できないことが多い。WMIやPowerShellでリモートプロセスのコマンドラインパラメーターを調査する方法をまとめておく。

» 2018年08月16日 05時00分 公開
[打越浩幸デジタルアドバンテージ]
「Tech TIPS」のインデックス

連載目次

対象OS:Windows 7/Windows 8.1/Windows 10/Windows Server 2008 R2/Windows Server 2012/Windows Server 2012 R2/Windows Server 2016


リモートPCのプロセスの状態を調査するには?

 システムで実行中のプロセスの状態を調べたり、設定しておいたタスクやサービスが現在実行中かどうかを調べたりするには、そのシステムにサインインしてタスクマネージャを実行したり、タスクスケジューラやサービス管理ツールの画面を調査したりすればよい。だが調査対象がローカルのPCではなくリモートのWindowsシステムで、しかも多数ある場合はどうしたらよいだろうか?

 タスクマネージャはリモートのPCには接続できず、ローカルのシステムの状態しか表示できない。タスクスケジューラはリモートのPCに接続して管理できるものの、GUIのツールなので、対象が多数ある場合は接続設定操作などが面倒で、すぐに確認するというわけにもいかない。

 こんな場合は、リモートPC上で実行されているプロセスの一覧を取得して表示できるCUIのツールを使うと便利である。

 このような目的に使えるWindows OSの標準的なCUIツールとしては、例えばtasklist.exeコマンドやPowerShellのGet-Processコマンドレットなどがある。「tasklist /s <リモートPC>」や「Get-Process -ComputerName <リモートPC>」とすれば、リモートのシステム上で動作しているプロセスの情報を取得できる(対象PCは同じActive Directoryドメインに属しているものとする。ワークグループ構成の場合はいろいろと制約があったり、事前設定が必要だったりするので、ここでは触れない)。

tasklistコマンドで実行中のプロセスの一覧を取得する tasklistコマンドで実行中のプロセスの一覧を取得する
tasklistを使えばリモートPC上のプロセスの一覧を簡単に取得できる。しかし、コマンドラインパラメーター情報は取得できない。

 だがこれらのコマンドでは、実行しているプロセスの「コマンドライン」情報を取得することができない。コマンドライン情報とは、タスクマネージャの[詳細]タブ(次の画面参照)に表示される、プロセスの実行ファイル名と、それに対して与えられたコマンドラインのパラメーターのことである。

タスクマネージャでコマンドライン情報を確認する タスクマネージャでコマンドライン情報を確認する
タスクマネージャで[詳細]タブを選び、表示項目として[コマンドライン]を追加すると、プロセスのコマンドラインパラメーターを見ることができる。スクリプト言語やサービス(svchost.exe)などは、ここまで調べて初めて、何を実行しているのかが分かる。

 あるプロセスやタスク、サービスなどが正しく動作しているかどうかや、実行が終了して、すでにプロセスの一覧から消えているかどうかなどを確認するなら、コマンド名(.exeファイル名)だけではなく、このコマンドラインパラメーターまでチェックしないと、どのプロセスか特定できない(ことが多い)。

 特に、サービスやスクリプト系の言語(バッチやWSH、PowerShell、Python、Perl、Rubyなど)では、引数としてサービス名やスクリプトファイル名などを付けて起動していることが多いので、コマンドライン全体を見ないと、何を実行しているのか判断しづらい(Windows OSの「サービス」の仕組みについては、TIPS「svchost.exeプロセスとは何か?」参照)。

 本TIPSでは、リモートからプロセスの一覧やそのコマンドラインの情報を取得する方法を紹介する。

WMI(wmic)でリモートプロセスのコマンドライン情報を取得する

 リモートで実行中のプロセスの一覧だけでなく、そのコマンドライン情報まで確認するには、WMI(wmic)が利用できる。WMIについては、以下の記事を参照していただきたい。

 WMIでProcessを表示させると、その中に「CommandLine」というプロパティがあり、これでコマンドラインパラメーターの情報を確認できる。

 WMI(wmic)でProcess(のCommandLine)を表示させるには、「wmic process」や「wmic process list full」、「wmic process get processid,name,commandline」などを実行すればよい。ただしいずれも非常に多くの情報が表示されて見づらいので、moreコマンドで止めて確認するか、末尾に「/format:csv」のようにフォーマット指定を付けて表示させ、他のアプリで整形して利用するとよいだろう(フォーマット指定については、先のTIPS参照)。

 リモートのPCを調査するなら、「/node:<リモートPC>」というパラメーターを付加して、以下のように実行する。

※PC1というホストのプロセスの一覧を取得する(デフォルトの表形式)
wmic /node:pc1 process

※PC1というホストのプロセスの一覧を取得する(完全リスト形式)
wmic /node:pc1 process list full



wmicでリモートPCのプロセスを調査する wmicでリモートPCのプロセスを調査する
wmicに「/node:〜」を付けると、リモートのPCの状態をモニタできる。

PowerShellでリモートプロセスのコマンドライン情報を取得する

 PowerShellの場合、PowerShellからWMIを呼び出せば、前述のwmicコマンドと同様にコマンドライン情報を取得できる。wmicと比べると、PowerShellの方が表示する項目の選択機能や整形機能などが豊富なので、こちらの方が便利かもしれない。

 PowerShellでWMIのProcessオブジェクトを取得するには「Get-WmiObject Win32_Process」を実行する。表示項目を限定させたければ、selectや、format-listなどで項目を列挙しておけばよい。リモートのPCを調査するなら、以下のように「-ComputerName <リモートPC>」を付けて実行する。

※プロセス情報のうち、pidとプロセス名、コマンドラインのみを表示する
Get-WmiObject Win32_Process -computername server1 | select processid,name,commandline


PowerShellでリモートPCのプロセスを調査する PowerShellでリモートPCのプロセスを調査する
PowerShellだと、出力形式を整えたり、特定の項目だけをフィルタしたりするのが容易に行える。

 特定のプロセスだけを調査したければ、以下のようにWQL(WMI Query Language)を使うとよいだろう。

※svchost.exeプロセスだけを列挙する
Get-WmiObject -ComputerName server1 -query "select * from win32_process where (name = 'svchost.exe')"

※名前にsqlを含むプロセスを列挙する
Get-WmiObject -ComputerName server1 -query "select * from win32_process where (name like '%sql%')"


 WQLについては以下のサイトを参照していただきたい。

「Tech TIPS」のインデックス

Tech TIPS

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

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

メールマガジン登録

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