给定Windows上的PID-如何找到执行它的命令行指令?


26

在数据库上,我可以获得所有当前正在运行的进程的列表,以及启动它们的sql命令。

我想在窗户盒上做类似的事情。

我可以获取进程列表,但不能获取启动它们的命令行。

我的问题是:给定Windows上的PID-如何找到执行它的命令行指令?

假设:

  • Windows 7和等效服务器

Answers:


35

Powershell和WMI。

Get-WmiObject Win32_Process | Select ProcessId,CommandLine

要么

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

请注意,您必须具有访问此进程信息的权限。因此,如果要了解的进程在特权上下文中运行,则可能必须以admin身份运行命令。


我发现它截断了路径-有办法解决吗?
鹰眼2015年

1
@Hawkeye尝试添加| FL到命令末尾。这为我扩展了所有命令行。可能还想和| Select -ExpandProperty CommandLine
Ryan Ries'15

有趣的是,您无法从本地Get-Process cmdlet获取此信息。
Davidw

3
Get-process使用没有该属性的system.diagnostics.process类。对于GET-过程中的帮助也有使用WMI获取进程对象的例子
吉姆乙

2
值得注意的是,尚无正式支持的获取其他进程命令行的方法。虽然有很多方法来获得一个字符串可能是命令行,它不是由操作系统保证其结果可能为所有你知道是“小鸡鸡鸡”。
尼克

21

您可以使用WMI子系统,并使用WMIC.EXE来获取此信息。假设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工具。尽管该进程的名称可能不再可用,但它可以在该进程的属性对话框中显示该进程的命令行以及启动该进程的父级。这是过程属性对话框:

过程属性对话框

如果您想更详细地了解何时启动流程以及在什么条件下启动审核,可以使用另一个名为Process Monitor的Sysinternals工具。在这里,您可以筛选“流程已开始”事件,了解流程在其中启动的环境,并查看该时间段还发生了其他事件。这是一个功能强大的程序。这是事件属性对话框:

事件属性对话框


10
或者只是更改任务管理器上的列以显示PID和“命令行”。并做了。
Ismael Miguel 2015年

@IsmaelMiguel“任务管理器”中的“命令行”列确实截断了很长的参数字符串,不知道Process Explorer是否这样做
SD的JG,2015年

@JGinSD我从未见过截断的参数。
Ismael Miguel 2015年

1
@IsmaelMiguel看起来命令行列的限制是大约200个字符
SD的JG,

1
任务管理器中的实际限制是259个字符。(已在Windows 10上验证)。但是,任务管理器有一个优势:即使它本身没有提升(以管理员身份),它也可以向您显示其他用户/提升进程的命令行。尽管Process Explorer和Process Monitor没有259个字符的限制,但是从v16.22 开始,如果将鼠标悬停在该列上,则它们可能因命令行太长而挂起Command Line
mklement

1

为了补充Ryan Ries有用的PowerShell答案通过-Filter使用Get-CimInstance而不是deprecated-since-v3 Get-WmiObjectcmdlet 参数使用更短的替代方法

# 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参数实质上允许您传递WQL语句的WHERE子句,而不是通过传递完整的查询语句。-Query

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.