Comment trouver les arguments de ligne de commande d'un programme en cours d'exécution?

84

Je cherche un outil ou une méthode pour savoir quels paramètres de ligne de commande ont été passés à un programme, par exemple lorsqu'il a été exécuté par un autre programme (scénario lanceur-application).

Gepard
la source

Réponses:

71

Vous pouvez le faire en utilisant Process Explorer .

Passez simplement votre souris sur un processus pour voir les arguments de la ligne de commande utilisés pour le démarrer:
entrez la description de l'image ici

Sinon, vous pouvez ouvrir les propriétés du processus et inspecter la ligne de commande à cet endroit:
entrez la description de l'image ici

Der Hochstapler
la source
2
C'est vraiment cool.
cutrightjm
2
Malheureusement, cela ne semble pas fonctionner avec les applications protégées avec WinLicense / Themida: oreans.com/winlicense.php Avez -vous d'autres idées?
Gepard
@Gepard: Comment savez-vous que cela ne fonctionne pas? Êtes-vous sûr que l'application a été appelée avec des arguments de ligne de commande? Quoi qu'il en soit, PE utilise la méthode Windows pour déterminer ces informations. Je suppose que tout le reste devrait être personnalisé pour une application spécifique.
Der Hochstapler
6
Mon mauvais, il n'a pas couru PE élevé. Cela fonctionne comme prévu.
Gepard
@OliverSalzburg, comment ce programme a-t-il fonctionné? Tout programme C normal peut-il atteindre cet objectif?
Pacerier
88

Vous pouvez également le faire sans Process Explorer, à l'aide du service WMI de Windows. Exécutez ce qui suit à partir de l'invite de commande:

WMIC path win32_process get Caption,Processid,Commandline

Si vous voulez dump la sortie dans un fichier (cela facilite la lecture), utilisez le commutateur / OUTPUT:

WMIC /OUTPUT:C:\Process.txt path win32_process get Caption,Processid,Commandline
Andy E
la source
4
Nice, comment tu as su ça?
Pacerier
4
@ Pacerier: Je ne suis pas sûr d'être honnête ;-) Je pense que cela vient de fouiller dans la documentation WMI et de jouer parce que je devais utiliser WMI pour quelque chose à l'époque.
Andy E
3
De quels documents WMI parlez-vous?
Pacerier
3
Il s'agissait d'une méthode de ligne de commande très utile pour obtenir la ligne de commande d'un processus en cours d'exécution. Dans mon cas, j’ai pu modifier légèrement ce paramètre pour obtenir une sortie correspondant à un processus spécifique: chemin WMIC win32_process où "caption = 'cmd.exe'" obtient Commandline
chriv
1
Bien, et la clause where supporte en fait certaines fonctionnalités SQL, par exemple, où "name like 'cmd.%'
zhaorufei
39

On peut également y parvenir en utilisant le Gestionnaire des tâches .

Ouvrez le gestionnaire de tâches (par CTRL-SHIFT-ESC, CTRL-ALT-DELETE ou toute autre méthode).

Pour Windows 7 (et probablement Windows XP):

  • Allez dans l'onglet "Processus". Dans le menu "Affichage", sélectionnez "Sélectionner les colonnes ...".
  • Cochez la case "Ligne de commande" et cliquez sur OK. (Vous devrez peut-être faire défiler vers le bas pour le trouver)

Pour Windows 8:

  • Allez dans l'onglet "Détails". Cliquez avec le bouton droit de la souris sur l'une des colonnes (par exemple, Noms, PID, etc.) et sélectionnez "Sélectionner les colonnes".
  • Cochez la case "Ligne de commande" et cliquez sur OK. (Vous devrez peut-être faire défiler vers le bas pour le trouver)

Une colonne de lignes de commande de sera ajoutée aux colonnes actuellement affichées.

Jeromy Adofo
la source
1
Je ne vous ai pas vraiment @JesseBarnum, on peut toujours redimensionner la colonne pour avoir une vue complète, peu importe la longueur de la ligne de commande, n'est-ce pas?
Jeromy Adofo
1
Seulement si la fenêtre est suffisamment large pour la taille de la commande. Si la commande ressemble à un processus Java avec un long chemin de classe, cela n'entre pas dans la largeur de la fenêtre.
Jesse Barnum
1
Très bien merci, a noté. Je n’ai pas eu ce problème cependant et en passant mon gestionnaire de tâches est scrollable - je ne sais pas pour le vôtre :-). Je pense que si vous pouvez m'envoyer un exemple de programme à essayer, cela pourrait régler le problème.
Jeromy Adofo
6
C'est une réponse très sous-estimée, je ne savais pas que c'était possible.
Hashim
4
Je vois ci-dessus quelques commentaires sur le gestionnaire de tâches Windows. Même si vous définissez la colonne 'Ligne de commande' pour afficher un processus Java avec une ligne de commande très longue, elle sera tronquée. MAIS, vous pouvez cliquer sur la ligne dans le Gestionnaire des tâches et "copier" (Ctrl-c) la ligne entière et la coller dans un éditeur de texte pour afficher la ligne de commande complète, quelle que soit sa durée.
JohnD
6

PowerShell à la rescousse.

Trouver:

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

Et tuez en 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 }

Vous pouvez l'exécuter directement depuis powershell ou depuis un ps1 si votre système est configuré. Je détaille la configuration de script sans restriction sur i kill kombies avec powershell ainsi que d'autres astuces de powershell ...

Dave Horner
la source
1
Whoa ... la partie kill est assez dangereuse, étant donné le titre de la question;) Otheriwse une réponse très soignée;)
Tom
5

Les réponses précédentes sont excellentes dans le cas où le processus est déjà en cours et ne se terminera pas de si tôt. Cependant, si vous avez besoin (comme je l'ai fait) de le faire peut-être avec des processus démarrant plusieurs fois et / ou se terminant rapidement, ou peut-être enregistrez des événements sur une période plus longue, il existe un moyen de le faire à l'aide de Process Monitor .

Fondamentalement, il enregistre divers événements dans le système. Dans ce cas, nous pouvons simplement filtrer l'événement "Process Start" et le nom du processus à surveiller, comme indiqué ci-dessous:

entrez la description de l'image ici

Ensuite, laissez simplement le moniteur de processus en marche et faites ce que vous faites pour que le processus que vous souhaitez journaliser soit en cours. Vous pouvez voir dans la colonne "Détail" ou la colonne "Ligne de commande" (dépend de la façon dont vous les configurez) les arguments de la ligne de commande. Par exemple:

entrez la description de l'image ici

Bien entendu, vous pouvez extraire beaucoup plus d'informations connexes telles que le répertoire de travail, les variables d'environnement transmises au processus, etc. Il est également facile d'exporter les résultats dans un fichier.

Sil
la source
1

Lors de l'utilisation de CygWin , si je lance un processus Python , voici un exemple de ligne de commande:

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

Mais Process Explorer ne voit que l'exe principal:

Process Explorer ne détecte pas la ligne de commande complète du processus Python

(notez le "chemin: [message d'ouverture du processus d'erreur]" (voir EDIT-1)). Même résultat pour tasklist:

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

Donc, le seul truc que je connaisse jusqu'à maintenant, c'est de le trouver via le shell CygWin Bash pgrep :

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

Il est utile de le savoir, tant que CygWin cohabite sans problème dans Windows et que vous pouvez l’utiliser pour exécuter de nombreux programmes POSIX et Python.

EDIT: Sous Windows, vous ne semblez pas avoir besoin des privilèges d’administrateur pour la liste de tâches. Dans CygWin, vous en aurez besoin pour pouvoir visualiser le processus d'un administrateur (ce qui me semble plus logique: la ligne de commande complète peut contenir des paramètres tels que les mots de passe ), nous devons donc exécuter CygWin Bash en mode administrateur élevé .

EDIT-1: Ce problème ne se produira pas si vous exécutez Process Explorer en tant qu'administrateur. Merci de nous avoir signalé, @Pacerier.

Sopalajo de Arrierez
la source
2
Si vous vous présentez en tant qu'administrateur, vous ne [Error opening process message]
verrez
Tu avais raison, Pacerier. Trop évident à retenir :-). Merci. J'ai édité mon message pour le refléter.
Sopalajo de Arrierez
-3

aller à runou aller à startet chercher:

tasklist -m

tasklist -svc
Zanardan
la source
5
Cela ne montre pas la ligne de commande appelante. /maffiche les modules chargés (DLL, etc.) et /svcprésente les services hébergés dans chaque processus.
Bob