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

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

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

我想在 Windows 盒子上做类似的事情。

我可以获得进程列表,但无法获得启动这些进程的命令行。

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

假设:

  • Windows 7 及同等服务器

答案1

Powershell 和 WMI。

Get-WmiObject Win32_Process | Select ProcessId,CommandLine

或者

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

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

答案2

您可以使用 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

答案3

其他答案当然是不错的选择,因为它们具有命令行特性,因此在自动化系统中可以很好地为您服务(我从标签中看到这就是您想要的)。当然,有些人可能想用 GUI 探索这类信息,所以这里有一个类似的替代方案。

Process Explorer 是 Microsoft 维护的 Sysinternals 工具。它可以在进程的属性对话框中显示进程的命令行以及启动该进程的父进程,尽管该进程的名称可能不再可用。以下是进程属性对话框:

流程属性对话框

如果您想要更详细的审计跟踪,了解进程何时启动以及在什么条件下启动,您可以使用另一个 Sysinternals 工具,即进程监视器。在这里,您可以过滤“进程启动”事件,了解进程启动的环境,并查看当时发生的其他事件。这是一个非常强大的程序。以下是事件属性对话框:

事件属性对话框

答案4

补充Ryan Ries 的有用的 PowerShell 答案通过-Filter参数更短的替代方案这也用途Get-CimInstance而不是自 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传递WHERE查询语言语句,而不是通过传递完整的查询语句-Query

相关内容