¿Cómo puedo encontrar argumentos de línea de comando de un programa en ejecución?

84

Estoy buscando una herramienta o método para averiguar qué parámetros de línea de comandos se han pasado a un programa, por ejemplo, cuando fue ejecutado por otro programa (escenario de aplicación de inicio).

Gepard
fuente

Respuestas:

71

Puede hacerlo utilizando Process Explorer .

Simplemente desplace el mouse sobre un proceso para ver los argumentos de la línea de comando utilizados para iniciarlo:
ingrese la descripción de la imagen aquí

Alternativamente, puede abrir las propiedades del proceso e inspeccionar la línea de comando allí mismo:
ingrese la descripción de la imagen aquí

Der Hochstapler
fuente
2
Eso es realmente genial.
cutrightjm
2
Desafortunadamente, no parece funcionar con aplicaciones protegidas con WinLicense / Themida: oreans.com/winlicense.php ¿ Alguna otra idea?
Gepard
@Gepard: ¿Cómo sabes que no funciona? ¿Está seguro de que, de hecho, se llamó a la aplicación con argumentos de línea de comando? De cualquier manera, PE usa la forma de Windows para determinar esa información. Supongo que cualquier otra cosa tendría que personalizarse para una aplicación específica.
Der Hochstapler
66
Mi mal, no corría PE elevado. Funciona según lo previsto.
Gepard
@OliverSalzburg, ¿Cómo funcionó este programa? ¿Puede cualquier programa normal de C lograr esto?
Pacerier
88

También puede hacerlo sin Process Explorer, utilizando el servicio WMI de Windows. Ejecute lo siguiente desde el símbolo del sistema:

WMIC path win32_process get Caption,Processid,Commandline

Si desea volcar la salida a un archivo (hace que sea un poco más fácil de leer), use el modificador / OUTPUT:

WMIC /OUTPUT:C:\Process.txt path win32_process get Caption,Processid,Commandline
Andy E
fuente
44
Bien, ¿cómo supiste esto?
Pacerier
44
@Pacerier: No estoy seguro de ser honesto ;-) Creo que vino de cavar alrededor de los documentos de WMI y jugar porque necesitaba usar WMI para algo en ese momento.
Andy E
3
¿A qué documentos de WMI te refieres?
Pacerier
3
Este fue un método de línea de comando muy útil para obtener la línea de comando de un proceso en ejecución. En mi caso, pude ajustar esto ligeramente para obtener resultados solo para un proceso específico: ruta WMIC win32_process donde "caption = 'cmd.exe'" obtiene Commandline
chriv
1
Genial, y la cláusula where realmente admite algunas características de SQL, por ejemplo, where "nombre como 'cmd.%'
zhaorufei
39

También se puede lograr eso mediante el Administrador de tareas .

Administrador de tareas abierto (por CTRL-SHIFT-ESC, CTRL-ALT-DELETE o cualquier otro método).

Para Windows 7 (y probablemente Windows XP):

  • Vaya a la pestaña "Procesos". En el menú "Ver", seleccione "Seleccionar columnas ...".
  • Marque la casilla de verificación de "Línea de comando" y haga clic en Aceptar. (Puede que tenga que desplazarse hacia abajo para encontrarlo)

Para Windows 8:

  • Vaya a la pestaña "Detalles". Haga clic derecho en cualquiera de las columnas (por ejemplo, nombres, PID, etc.) y seleccione "Seleccionar columnas".
  • Marque la casilla de verificación de "Línea de comando" y haga clic en Aceptar. (Puede que tenga que desplazarse hacia abajo para encontrarlo)

Se agregará una columna de líneas de comando a las columnas que se muestran actualmente.

Jeromy Adofo
fuente
1
Realmente no te entiendo @JesseBarnum, siempre se puede cambiar el tamaño de la columna para tener una vista completa, sin importar la longitud de la línea de comando, ¿verdad?
Jeromy Adofo
1
Solo si la ventana es lo suficientemente ancha para el tamaño del comando. Si el comando es algo así como un proceso Java con una ruta de clase larga, eso no cabe en el ancho de la ventana.
Jesse Barnum
1
Muy bien, gracias, señaló. Sin embargo, no he tenido ese problema y, por cierto, mi administrador de tareas es desplazable, no sé sobre el tuyo :-). Creo que si me puede enviar un programa de muestra para probar, eso podría resolverlo.
Jeromy Adofo
66
Esta es una respuesta muy subestimada, no tenía idea de que esto fuera posible.
Hashim
44
Veo un par de comentarios arriba sobre el Administrador de tareas de Windows. Incluso si configura la columna 'Línea de comando' para mostrar un proceso Java con una línea de comando realmente larga, se truncará. PERO, puede hacer clic en la fila en el Administrador de tareas y 'copiar' (Ctrl-c) toda la fila y pegarla en un editor de texto para ver la línea de comando completa, sin importar cuánto tiempo.
JohnD
6

PowerShell al rescate.

Encontrar:

Get-WmiObject Win32_Process -Filter "name = 'perl.exe'" | where {$_.CommandLine -eq '"C:\strawberry\perl\bin\perl.exe" t/Server_PreFork.t'}

Y matar como bonificación:

Get-WmiObject Win32_Process -Filter "name = 'perl.exe'" | where {$_.CommandLine -eq '"C:\strawberry\perl\bin\perl.exe" t/Server_PreFork.t'} | ForEach-Object { Invoke-WmiMethod -Path $_.__Path –Name Terminate }

Puede ejecutarlo desde powershell directamente o desde una ps1 si tiene la configuración de su sistema. Detallo la configuración de script sin restricciones en i kill zombies con powershell , así como otros trucos de powershell ...

Dave Horner
fuente
1
Whoa ... la parte de matar es bastante peligrosa, dado el título de la pregunta;) Otheriwse una respuesta muy ordenada;)
Tom
5

Las respuestas anteriores son excelentes en caso de que el proceso ya se esté ejecutando y no termine pronto. Sin embargo, si necesita (como lo hice) hacer esto, tal vez con los procesos que se inician varias veces y / o finalizan rápidamente, o tal vez se registran las ocurrencias en un período de tiempo más largo, hay una manera de hacerlo usando Process Monitor .

Básicamente, registra varios eventos en el sistema, en este caso podemos simplemente filtrar el evento "Inicio del proceso" y el nombre del proceso que queremos monitorear, como se muestra a continuación:

ingrese la descripción de la imagen aquí

Luego, simplemente mantenga el monitor de proceso en ejecución y haga lo que haga para que se ejecute el proceso que desea iniciar sesión. Puede ver en la columna "Detalle" o en la columna "Línea de comando" (depende de cómo los configure) los argumentos de la línea de comando. Por ejemplo:

ingrese la descripción de la imagen aquí

Por supuesto, de esta manera puede extraer mucha más información relacionada, como qué es el directorio de trabajo, qué variables de entorno se han pasado en el proceso, etc. También es fácil exportar los resultados a un archivo.

Sil
fuente
1

Cuando uso CygWin , si inicio un proceso de Python , este es un ejemplo de línea de comando:

c:\CygWin\bin\python2.7.exe /usr/local/bin/sudoserver.py

Pero Process Explorer solo ve el exe principal:

Process Explorer no detecta la línea de comando completa del proceso de Python

(tenga en cuenta la "ruta: [Error al abrir el mensaje del proceso]" (ver EDIT-1)). Los mismos resultados para tasklist:

C:\>tasklist | find "python" /i
python2.7.exe                 5740 Console                    1    15.312 KB

Entonces, el único truco que conozco hasta ahora es encontrarlo a través del shell CygWin Bash pgrep :

Luis@Kenobi /cygdrive/c/
$ pgrep -f -l server.py
5740 /usr/bin/python2.7 /usr/local/bin/sudoserver.py

Es útil saber esto, siempre que CygWin cohabite sin problemas en Windows, y puede usarlo para ejecutar muchos programas POSIX y Python.

EDITAR: en Windows no parece necesitar privilegios de administrador para la lista de tareas. En CygWin los necesitará para poder ver el proceso de un administrador (lo que me parece más lógico: la línea de comandos completa podría tener algunos parámetros como contraseñas dentro), por lo que debemos ejecutar CygWin Bash en modo Administrador elevado .

EDITAR-1: Este problema no sucederá si ejecuta Process Explorer como administrador. Gracias por señalar, @Pacerier.

Sopalajo de Arrierez
fuente
2
Si se ejecuta como administrador no estaría viendo[Error opening process message]
Pacerier
Tenías razón, @Pacerier. Demasiado obvio para recordar :-). Gracias. He editado mi publicación para reflejarlo.
Sopalajo de Arrierez
-3

ir runo ir starty buscar:

tasklist -m

tasklist -svc
Zanardan
fuente
55
Eso no muestra la línea de comando de llamada. /mmuestra los módulos cargados (DLL, etc.) y /svcmuestra los servicios alojados en cada proceso.
Bob