WindowsでPIDが指定されている場合-PIDを実行したコマンドライン命令を見つけるにはどうすればよいですか?


26

データベースでは、現在実行中のすべてのプロセスのリストと、それらを開始したsqlコマンドを取得できます。

Windowsボックスでも同様のことをしたいと思います。

プロセスのリストは取得できますが、それらを開始したコマンドラインは取得できません。

私の質問は次のとおりです。WindowsでPIDが指定されている場合、それを実行したコマンドライン命令を見つけるにはどうすればよいですか。

仮定:

  • Windows 7および同等のサーバー

回答:


35

PowershellおよびWMI。

Get-WmiObject Win32_Process | Select ProcessId,CommandLine

または

Get-WmiObject -Query "SELECT CommandLine FROM Win32_Process WHERE ProcessID = 3352"

プロセスに関するこの情報にアクセスするには、許可が必要であることに注意してください。そのため、知りたいプロセスが特権コンテキストで実行されている場合は、管理者としてコマンドを実行する必要があります。


私はそれが道を切り捨てていることに気付きました-それを回避する方法はありますか?
ホークアイ

1
@Hawkeye | FLコマンドの最後に追加してみてください。これにより、すべてのコマンドラインが拡張されます。遊びたいかもしれない| Select -ExpandProperty CommandLine
ライアンリース

興味深いことに、ネイティブのGet-Processコマンドレットからこの情報を取得することはできません。
-Davidw

3
Get-processは、そのプロパティを持たないsystem.diagnostics.processクラスを使用します。取得プロセスのためのヘルプもプロセスオブジェクトを取得するために、WMIを使用する例がある
ジム・B

2
別のプロセスのコマンドラインを取得する公式にサポートされた方法がないことに注意してください。一方で方法があります文字列を取得することができ、コマンドラインことは、それは、オペレーティング・システムによって保証されていないと、結果は、あなたが知っているすべてのための「チキンチキンチキン」である可能性があります。
ニック

21

この情報を取得するには、WMIC.EXEを使用してWMIサブシステムを使用できます。PIDが600の場合:

wmic.exe path Win32_Process where handle='600' get name, commandline  /format:list

また、名前、またはプロセスの他の特性を検索することもできます。このコマンドを使用して、すべての属性をリストします。

wmic.exe path Win32_Process get  /format:list

1
それは便利です。processエイリアスの代わりにそれを少し短くすることができpath Win32_Processます; 例: wmic.exe process get
mklement

15

他の答えは確かに良いオプションであり、コマンドラインの性質のために自動化されたシステムでうまく機能します(そして、私はそれがあなたが望んでいたものだとタグからわかります)。もちろん、GUIを使用してこの種の情報を調べたいと思う人もいるかもしれません。そこで、これらのラインに沿った代替案を紹介します。

Process Explorerは、Microsoftが管理するSysinternalsツールです。プロセスのプロパティダイアログにプロセスのコマンドラインと、それを起動した親を表示できますが、そのプロセスの名前は使用できない場合があります。プロセスプロパティダイアログは次のとおりです。

プロセスプロパティダイアログ

プロセスがいつ、どのような条件下で起動されたかの詳細な監査証跡が必要な場合は、プロセスモニターと呼ばれる別のSysinternalsツールを使用できます。ここでは、「プロセス開始」イベントをフィルタリングし、プロセスが起動された環境について学習し、その頃に発生した他のイベントを確認できます。それは非常に強力なプログラムです。イベントプロパティダイアログは次のとおりです。

イベントプロパティダイアログ


10
または、タスクマネージャの列を変更して、PIDと「コマンドライン」を表示します。できました。
イスマエルミゲル

タスクマネージャーで@IsmaelMiguelザ・コマンドラインの列が切り捨て本当に長い引数文字列を行うプロセスエクスプローラがない場合は、知らない
SDでJG

@JGinSD切り捨てられた引数を見たことはありません。
イスマエルミゲル

1
制限などの@IsmaelMiguelのルックスは、コマンドラインの列の周りに200文字
SDでJG

1
タスクマネージャーの実際の制限は259文字です。(Windows 10で検証済み)。ただし、タスクマネージャーには1つの利点があります。管理者としてではなく、昇格なしで実行される場合でも、他のユーザー/昇格プロセスのコマンドラインを表示します。Process ExplorerとProcess Monitorには259文字の制限はありませんが、v16.22の時点で、その列の上にマウスを置いたときに列が追加されていると、コマンドラインが長すぎてハングする可能性Command Lineがあります。
mklement

1

Ryan Riesの役立つPowerShellの回答を補完するために、deprecated-since-v3 コマンドレットの代わりに使用する-Filterパラメーター介し短い代替手段を使用しGet-CimInstanceますGet-WmiObject

# Target a process by its PID (process ID) and report its command line, 
# using the PowerShell session's own PID as an example ($PID).
(Get-CimInstance Win32_Process -Filter "ProcessId=$PID").CommandLine

# Alternatively, target process(es) by name (may return multiple processes), 
# using Notepad.exe as an example.
# Select-Object is used to report both the PID and the command line.
Get-CimInstance Win32_Process -Filter "Name='Notepad.exe'" |
  Select-Object ProcessId, CommandLine

この-Filterパラメーターを使用すると、を介して完全なクエリステートメントを渡すのではなくWHEREWQLステートメントの句を渡すことができます-Query

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.