Come posso trovare gli argomenti della riga di comando di un programma in esecuzione?


84

Sto cercando uno strumento o un metodo per scoprire quali parametri della riga di comando sono stati passati a un programma, ad esempio quando è stato eseguito da un altro programma (scenario dell'applicazione di avvio).

Risposte:


71

Puoi farlo usando Process Explorer .

Passa il mouse sopra un processo per visualizzare gli argomenti della riga di comando utilizzati per avviarlo:
inserisci qui la descrizione dell'immagine

In alternativa, puoi aprire le proprietà del processo e ispezionare la riga di comando proprio lì:
inserisci qui la descrizione dell'immagine


2
È davvero fantastico.
cutrightjm,

2
Sfortunatamente, non sembra funzionare con applicazioni protette con WinLicense / Themida: oreans.com/winlicense.php Altre idee?
Gepard,

@Gepard: come fai a sapere che non funziona? Sei sicuro che l'applicazione sia stata effettivamente chiamata con argomenti da riga di comando? In entrambi i casi, PE utilizza il modo Windows per determinare tali informazioni. Qualsiasi altra cosa dovrebbe essere personalizzata per un'applicazione specifica, presumo.
Der Hochstapler,

6
Mio male, non ha funzionato PE elevato. Funziona come previsto.
Gepard,

@OliverSalzburg, Come ha funzionato questo programma? Un normale programma C può raggiungere questo obiettivo?
Pacerier,

88

Puoi farlo anche senza Process Explorer, usando il servizio WMI di Windows. Eseguire quanto segue dal prompt dei comandi:

WMIC path win32_process get Caption,Processid,Commandline

Se si desidera scaricare l'output su un file (facilita la lettura), utilizzare l'opzione / OUTPUT:

WMIC /OUTPUT:C:\Process.txt path win32_process get Caption,Processid,Commandline

4
Bello, come lo sai?
Pacerier,

4
@Pacerier: non sono sicuro di essere onesto ;-) Penso che sia venuto dallo scavare nei documenti WMI e dai da fare perché avevo bisogno di usare WMI per qualcosa al momento.
Andy E,

3
A quali documenti WMI ti riferisci?
Pacerier,

3
Questo è stato un metodo di riga di comando molto utile per ottenere la riga di comando di un processo in esecuzione. Nel mio caso, sono stato in grado di modificarlo leggermente per ottenere l'output solo per un processo specifico: percorso WMIC win32_process dove "caption = 'cmd.exe'" get Commandline
chriv

1
Fantastico, e la clausola where in realtà supporta alcune funzionalità SQL, ad esempio, dove "name like 'cmd.%'
zhaorufei

39

Si può anche ottenere ciò utilizzando Task Manager .

Apri task manager (da CTRL-SHIFT-ESC, CTRL-ALT-CANC o qualsiasi altro metodo).

Per Windows 7 (e probabilmente Windows XP):

  • Vai alla scheda "Processi". Nel menu "Visualizza", seleziona "Seleziona colonne ...".
  • Seleziona la casella di controllo "Riga di comando" e fai clic su OK. (Potrebbe essere necessario scorrere verso il basso per trovarlo)

Per Windows 8:

  • Vai alla scheda "Dettagli". Fare clic con il tasto destro su una delle colonne (ad es. Nomi, PID, ecc.) E selezionare "Seleziona colonne".
  • Seleziona la casella di controllo "Riga di comando" e fai clic su OK. (Potrebbe essere necessario scorrere verso il basso per trovarlo)

Una colonna di righe di comando verrà aggiunta alle colonne attualmente visualizzate.


1
Non ti capisco davvero @JesseBarnum, si può sempre ridimensionare la colonna per avere una visione completa, non importa quanto sia lunga la riga di comando, giusto?
Jeromy Adofo,

1
Solo se la finestra è abbastanza larga per la dimensione del comando. Se il comando è simile a un processo Java con un percorso di classe lungo, questo non si adatta alla larghezza della finestra.
Jesse Barnum,

1
Va bene grazie, notato. Non ho avuto questo problema però e dal modo in cui il mio task manager è scorrevole - non so del tuo :-). Penso che se mi puoi inviare un programma di esempio per provare, questo potrebbe risolverlo.
Jeromy Adofo,

6
Questa è una risposta ampiamente sottovalutata, non avevo idea che fosse possibile.
Hashim,

4
Vedo un paio di commenti sopra sul Task Manager di Windows. Anche se si imposta la colonna "Riga di comando" per mostrare un processo Java con una riga di comando molto lunga verrà troncato. MA, puoi fare clic sulla riga in Task Manager e 'copiare' (Ctrl-c) l'intera riga e incollarla in un editor di testo per vedere l'intera riga di comando, non importa per quanto tempo.
JohnD,

6

PowerShell in soccorso.

Trova:

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

E uccidi come bonus:

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 }

Puoi eseguirlo direttamente da PowerShell o da una PS1 se hai la configurazione del tuo sistema. Descrivo in dettaglio la configurazione degli script senza restrizioni su I kill zombies con PowerShell e altri trucchi PowerShell ...


1
Whoa ... la parte dell'uccisione è abbastanza pericolosa, dato il titolo della domanda;) Altrimenti, rispondi molto bene;)
Tom,

5

Le risposte precedenti sono ottime nel caso in cui il processo sia già in esecuzione e non terminerà presto. Tuttavia, se è necessario (come ho fatto io) farlo forse con l'avvio dei processi più volte e / o la chiusura rapida, o forse la registrazione delle ricorrenze in un periodo di tempo più lungo, è possibile utilizzare Process Monitor .

Fondamentalmente registra vari eventi nel sistema, in questo caso possiamo semplicemente filtrare l'evento "Avvio processo" e il nome del processo che vogliamo monitorare, come mostrato di seguito:

inserisci qui la descrizione dell'immagine

Quindi mantieni il monitor di processo in esecuzione e fai tutto ciò che fai per ottenere il processo che desideri eseguire. Puoi vedere nella colonna "Dettaglio" o nella colonna "Riga di comando" (dipende da come configurarli) gli argomenti della riga di comando. Per esempio:

inserisci qui la descrizione dell'immagine

Ovviamente in questo modo è possibile estrarre molte più informazioni correlate come la directory di lavoro, quali variabili d'ambiente sono state passate sul processo, ecc ... Inoltre è facile esportare i risultati in un file.


1

Quando utilizzo CygWin , se avvio un processo Python , questo è un esempio di riga di comando:

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

Ma Process Explorer vede solo l'exe principale:

Process Explorer non rileva la riga di comando completa del processo Python

(notare il "percorso: [Errore durante l'apertura del messaggio di processo]" (vedere EDIT-1)). Stessi risultati per tasklist:

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

Quindi, l'unico trucco che conosco fino ad ora, è trovarlo tramite la shell CygWin Bash pgrep :

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

È utile saperlo, purché CygWin conviva senza problemi in Windows e sia possibile utilizzarlo per eseguire molti programmi POSIX e Python.

EDIT: in Windows non sembra che tu abbia bisogno dei privilegi di amministratore per l'elenco delle attività. In CygWin avrai bisogno che siano in grado di visualizzare il processo di un amministratore (ciò che mi sembra più logico: l'intera riga di comando potrebbe avere alcuni parametri come le password all'interno), quindi dobbiamo eseguire CygWin Bash in modalità amministratore elevata .

EDIT-1: questo problema non si verifica se si esegue Process Explorer come amministratore. Grazie per il puntamento, @Pacerier.


2
Se corri come amministratore non [Error opening process message]
vedresti

Avevi ragione, @Pacerier. Troppo ovvio da ricordare :-). Grazie. Ho modificato il mio post per rifletterlo.
Sopalajo de Arrierez,

-3

vai runo vai a starte cerca:

tasklist -m

tasklist -svc

5
Ciò non mostra la riga di comando chiamante. /mmostra i moduli caricati (DLL, ecc.) e /svcmostra i servizi ospitati in ciascun processo.
Bob
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.