Dato un PID su Windows: come posso trovare l'istruzione della riga di comando che l'ha eseguito?


26

Su un database, posso ottenere un elenco di tutti i processi attualmente in esecuzione e il comando sql che li ha avviati.

Vorrei fare una cosa simile su una finestra di Windows.

Posso ottenere l'elenco dei processi, ma non la riga di comando che li ha avviati.

La mia domanda è: dato un PID su Windows: come posso trovare le istruzioni da riga di comando che lo hanno eseguito?

ipotesi:

  • Windows 7 e server equivalenti

Risposte:


35

Powershell e WMI.

Get-WmiObject Win32_Process | Select ProcessId,CommandLine

O

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

Si noti che è necessario disporre delle autorizzazioni per accedere a queste informazioni su un processo. Quindi potrebbe essere necessario eseguire il comando come amministratore se il processo che si desidera conoscere è in esecuzione in un contesto privilegiato.


Trovo che tronca il percorso - c'è un modo per aggirare questo?
Hawkeye,

1
@Hawkeye Prova ad aggiungere | FLalla fine del comando. Questo espande tutta la riga di comando per me. Potrebbe anche voler giocare con| Select -ExpandProperty CommandLine
Ryan Ries,

È interessante notare che non è possibile ottenere queste informazioni dal cmdlet Get-Process nativo.
Davidw,

3
Get-process utilizza la classe system.diagnostics.process che non ha quella proprietà. La guida per get-process ha anche un esempio dell'uso di wmi per ottenere l'oggetto process
Jim B

2
Vale la pena notare che non esiste un modo ufficialmente supportato per ottenere la riga di comando di un altro processo. Mentre ci sono modi per ottenere una stringa che potrebbe essere la riga di comando, non è garantita dal sistema operativo e il risultato potrebbe essere "pollo pollo pollo" per quello che sai.
Nick,

21

È possibile utilizzare il sottosistema WMI, utilizzando WMIC.EXE per ottenere queste informazioni. Supponendo un PID di 600:

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

Puoi anche cercare il nome o altre caratteristiche del processo. Utilizzare questo comando per elencare tutti gli attributi:

wmic.exe path Win32_Process get  /format:list

1
È utile; puoi accorciarlo un po 'con l' processalias invece di path Win32_Process; ad es. wmic.exe process get
mklement

15

Le altre risposte sono certamente buone opzioni che ti serviranno bene in un sistema automatizzato a causa della loro natura da riga di comando (e vedo dal tag che è quello che volevi). Certo, alcune persone potrebbero voler esplorare questo tipo di informazioni con una GUI, quindi ecco un'alternativa in tal senso.

Process Explorer è uno strumento Sysinternals gestito da Microsoft. Può visualizzare la riga di comando del processo nella finestra di dialogo delle proprietà del processo, nonché il genitore che lo ha avviato, sebbene il nome di quel processo potrebbe non essere più disponibile. Ecco la finestra di dialogo delle proprietà del processo:

finestra di dialogo delle proprietà del processo

Se si desidera una traccia di controllo più dettagliata di quando è stato avviato un processo e in quali condizioni, è possibile passare a un altro strumento Sysinternals chiamato Process Monitor. Qui puoi filtrare gli eventi "Processo avviato", conoscere l'ambiente in cui è stato avviato il processo e vedere quali altri eventi si stavano verificando in quel periodo. È un programma abbastanza potente. Ecco la finestra di dialogo delle proprietà dell'evento:

finestra di dialogo delle proprietà dell'evento


10
O semplicemente cambia le colonne su Task Manager per mostrare il PID e la "Riga di comando". E fatto.
Ismael Miguel,

@IsmaelMiguel La colonna della riga di comando in Task Manager tronca stringhe di argomenti molto lunghe, non so se Process Explorer lo fa
JG in SD il

@JGinSD Non ho mai visto un argomento troncato.
Ismael Miguel,

1
@IsmaelMiguel Sembra che il limite sia di circa 200 caratteri per la colonna della riga di comando
JG in SD il

1
Il limite effettivo in Task Manager è 259 caratteri. (verificato su Windows 10). Task Manager ha un vantaggio, tuttavia: mostra le linee di comando di altri utenti / processi elevati anche quando viene eseguito senza elevazione (non come amministratore). Mentre Process Explorer e Process Monitor non hanno il limite di 259 caratteri, a partire dalla v16.22 possono bloccarsi con righe di comando eccessivamente lunghe se la Command Linecolonna è stata aggiunta se si passa il mouse su quella colonna.
mklement

1

Per integrare l'utile risposta PowerShell di Ryan Ries con un'alternativa più breve tramite il -Filterparametro che utilizzaGet-CimInstance anche al posto del cmdlet deprecated-since-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

Il -Filterparametro consente essenzialmente di passare la WHEREclausola di un'istruzione WQL anziché passare un'istruzione di query completa tramite -Query.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.