Dado un PID en Windows, ¿cómo encuentro la instrucción de línea de comando que lo ejecutó?

26

En una base de datos, puedo obtener una lista de todos los procesos actualmente en ejecución y el comando sql que los inició.

Me gustaría hacer algo similar en una ventana de Windows.

Puedo obtener la lista de procesos, pero no la línea de comando que los inició.

Mi pregunta es: dado un PID en Windows, ¿cómo encuentro la instrucción de línea de comando que lo ejecutó?

Suposiciones

  • Windows 7 y servidores equivalentes
Hawkeye
fuente

Respuestas:

35

Powershell y WMI.

Get-WmiObject Win32_Process | Select ProcessId,CommandLine

O

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

Tenga en cuenta que debe tener permisos para acceder a esta información sobre un proceso. Por lo tanto, es posible que deba ejecutar el comando como administrador si el proceso que desea conocer se ejecuta en un contexto privilegiado.

Ryan Ries
fuente
Me parece que trunca el camino, ¿hay alguna forma de evitarlo?
Hawkeye
1
@Hawkeye Intenta agregar | FLal final del comando. Eso expande toda la línea de comando para mí. También podría querer jugar con| Select -ExpandProperty CommandLine
Ryan Ries
Curiosamente, no puede obtener esta información del cmdlet nativo Get-Process.
Davidw
3
Get-process usa la clase system.diagnostics.process que no tiene esa propiedad. La ayuda para get-process también tiene un ejemplo del uso de wmi para obtener el objeto de proceso
Jim B
2
Vale la pena señalar que no hay una forma oficialmente compatible de obtener la línea de comando de otro proceso. Si bien hay formas de obtener una cadena que podría ser la línea de comando, no está garantizada por el sistema operativo y el resultado podría ser "pollo pollo pollo" por todo lo que sabe.
Nick
21

Puede usar el subsistema WMI, usando WMIC.EXE para obtener esta información. Suponiendo un PID de 600:

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

También puede buscar el nombre u otra característica del proceso. Use este comando para enumerar todos los atributos:

wmic.exe path Win32_Process get  /format:list
RobW
fuente
1
Eso es útil; puedes acortarlo un poco con el processalias en lugar de path Win32_Process; por ejemplo, wmic.exe process get
mklement
15

Las otras respuestas son ciertamente buenas opciones que le servirán en un sistema automatizado debido a su naturaleza de línea de comando (y veo en la etiqueta que eso es lo que quería). Por supuesto, algunas personas pueden querer explorar este tipo de información con una GUI, así que aquí hay una alternativa en ese sentido.

Process Explorer es una herramienta Sysinternals mantenida por Microsoft. Puede mostrar la línea de comando del proceso en el cuadro de diálogo de propiedades del proceso, así como el padre que lo inició, aunque el nombre de ese proceso ya no esté disponible. Aquí está el diálogo de propiedades del proceso:

diálogo de propiedades de proceso

Si desea una pista de auditoría más detallada de cuándo se inició un proceso y en qué condiciones, puede recurrir a otra herramienta de Sysinternals llamada Monitor de proceso. Aquí puede filtrar los eventos de "Proceso iniciado", conocer el entorno en el que se inició el proceso y ver qué otros eventos ocurrieron en ese momento. Es un programa bastante poderoso. Aquí está el diálogo de propiedades del evento:

diálogo de propiedades del evento

Corrodias
fuente
10
O simplemente cambie las columnas en el Administrador de tareas para mostrar el PID y la "Línea de comandos". Y hecho.
Ismael Miguel
@IsmaelMiguel La columna de la línea de comandos en el Administrador de tareas trunca cadenas de argumentos muy largas, no sé si Process Explorer sí
JG en SD
@JGinSD Nunca he visto un argumento truncado.
Ismael Miguel
1
@IsmaelMiguel Parece que el límite es de alrededor de 200 caracteres para la columna Línea de comando
JG en SD
1
El límite real en el Administrador de tareas es de 259 caracteres. (verificado en Windows 10). Sin embargo, el Administrador de tareas tiene una ventaja: muestra las líneas de comando de los procesos elevados / de otros usuarios incluso cuando se ejecuta sin elevación (no como administrador). Si bien Process Explorer y Process Monitor no tienen el límite de 259 caracteres, a partir de la versión 16.22 pueden colgarse con líneas de comando demasiado largas si la Command Linecolumna se ha agregado si pasa el mouse sobre esa columna.
mklement
1

Para complementar la útil respuesta PowerShell de Ryan Ries con una alternativa más corta a través del -Filterparámetro que también usa enGet-CimInstance lugar del cmdlet obsoleto-desde-v3Get-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

El -Filterparámetro esencialmente le permite pasar la WHEREcláusula de una declaración WQL en lugar de pasar una declaración de consulta completa a través de -Query.

mklement
fuente