Wie finde ich Befehlszeilenargumente eines laufenden Programms heraus?

84

Ich suche nach einem Tool oder einer Methode, um herauszufinden, welche Befehlszeilenparameter an ein Programm übergeben wurden, zum Beispiel, als es von einem anderen Programm ausgeführt wurde (Launcher-Anwendungsszenario).

Gepard
quelle

Antworten:

71

Sie können dies mit dem Process Explorer tun .

Bewegen Sie den Mauszeiger einfach über einen Prozess, um die zum Starten verwendeten Befehlszeilenargumente anzuzeigen:
Bildbeschreibung hier eingeben

Alternativ können Sie die Eigenschaften des Prozesses öffnen und die Befehlszeile genau dort überprüfen:
Bildbeschreibung hier eingeben

Der Hochstapler
quelle
2
Das ist wirklich cool.
Cutrightjm
2
Leider scheint es nicht mit Anwendungen zu funktionieren, die mit WinLicense / Themida geschützt sind: oreans.com/winlicense.php Haben Sie noch weitere Ideen?
Gepard
@Gepard: Woher weißt du, dass es nicht funktioniert? Sind Sie sicher, dass die Anwendung tatsächlich mit Befehlszeilenargumenten aufgerufen wurde? In beiden Fällen verwendet PE die Windows-Methode, um diese Informationen zu ermitteln. Alles andere müsste auf eine bestimmte Anwendung zugeschnitten sein, nehme ich an.
Der Hochstapler
6
Meine schlechte, es lief nicht PE erhöht. Es funktioniert wie beabsichtigt.
Gepard
@OliverSalzburg, Wie hat dieses Programm funktioniert? Kann ein normales C-Programm dies erreichen?
Pacerier
88

Sie können dies auch ohne Process Explorer mit dem WMI-Dienst von Windows tun. Führen Sie an der Eingabeaufforderung Folgendes aus:

WMIC path win32_process get Caption,Processid,Commandline

Wenn Sie die Ausgabe in eine Datei sichern möchten (um das Lesen zu erleichtern), verwenden Sie die Option / OUTPUT:

WMIC /OUTPUT:C:\Process.txt path win32_process get Caption,Processid,Commandline
Andy E
quelle
4
Schön, woher wusstest du das?
Pacerier
4
@Pacerier: Ich bin mir nicht sicher, ob ich ehrlich bin ;-) Ich denke, es kam vom Herumstöbern der WMI-Dokumente und Herumspielen, weil ich WMI für etwas zu der Zeit verwenden musste.
Andy E
3
Auf welche WMI-Dokumente beziehen Sie sich?
Pacerier
3
Dies war eine sehr hilfreiche Befehlszeilenmethode, um die Befehlszeile eines laufenden Prozesses abzurufen. In meinem Fall konnte ich dies leicht anpassen, um die Ausgabe nur für einen bestimmten Prozess zu erhalten: WMIC-Pfad win32_process wobei "caption = 'cmd.exe'" Commandline
chriv 30.03.16
1
Großartig, und die where-Klausel unterstützt tatsächlich einige SQL-Funktionen, z. B. "name like 'cmd.%'
zhaorufei
39

Dies kann auch mit dem Task-Manager erreicht werden .

Öffnen Sie den Task-Manager (mit STRG-UMSCHALT-ESC, STRG-ALT-ENTF oder einer anderen Methode).

Für Windows 7 (und wahrscheinlich Windows XP):

  • Gehen Sie zur Registerkarte "Prozesse". Wählen Sie im Menü "Ansicht" die Option "Spalten auswählen ...".
  • Aktivieren Sie das Kontrollkästchen "Befehlszeile" und klicken Sie auf OK. (Möglicherweise müssen Sie nach unten scrollen, um es zu finden.)

Für Windows 8:

  • Gehen Sie zur Registerkarte "Details". Klicken Sie mit der rechten Maustaste auf eine der Spalten (z. B. Namen, PID usw.) und wählen Sie "Spalten auswählen".
  • Aktivieren Sie das Kontrollkästchen "Befehlszeile" und klicken Sie auf OK. (Möglicherweise müssen Sie nach unten scrollen, um es zu finden.)

Eine Spalte mit Befehlszeilen von wird zu den aktuell angezeigten Spalten hinzugefügt.

Jeromy Adofo
quelle
1
Ich verstehe dich nicht wirklich @JesseBarnum, man kann immer die Größe der Spalte ändern, um eine vollständige Ansicht zu erhalten, egal wie lang die Befehlszeile ist, oder?
Jeromy Adofo
1
Nur wenn das Fenster breit genug für die Größe des Befehls ist. Wenn der Befehl so etwas wie ein Java-Prozess mit einem langen Klassenpfad ist, passt das nicht in die Fensterbreite.
Jesse Barnum
1
Okay, danke, bemerkt. Ich hatte dieses Problem jedoch nicht und übrigens ist mein Task-Manager scrollbar - weiß nicht, wie es bei Ihnen aussieht :-). Ich denke, wenn du mir ein Beispielprogramm schicken kannst, um es zu versuchen, könnte es das regeln.
Jeromy Adofo
6
Dies ist eine weit unterschätzte Antwort, hatte keine Ahnung, dass dies möglich war.
Hashim
4
Ich sehe oben einige Kommentare zum Windows Task-Manager. Auch wenn Sie die Spalte 'Befehlszeile' so einstellen, dass ein Java-Prozess mit einer sehr langen Befehlszeile angezeigt wird, wird dieser abgeschnitten. ABER Sie können auf die Zeile im Task-Manager klicken und die gesamte Zeile 'kopieren' (Strg-C) und in einen Texteditor einfügen, um die gesamte Befehlszeile anzuzeigen, egal wie lange.
JohnD
6

PowerShell zur Rettung.

Finden:

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

Und töte als 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 }

Sie können es von Powershell direkt oder von einem PS1 ausführen, wenn Sie Ihr System-Setup haben. Ich beschreibe die uneingeschränkte Skript-Einrichtung, wie ich Zombies mit Powershell und anderen Powershell-Tricks töte ...

Dave Horner
quelle
1
Whoa ... der Kill-Teil ist ziemlich gefährlich, angesichts des Titels der Frage;) Sonst eine sehr gute Antwort;)
Tom
5

Vorherige Antworten sind für den Fall hilfreich, dass der Prozess bereits ausgeführt wird und nicht bald abgebrochen wird. Wenn Sie dies jedoch tun müssen (wie ich), beispielsweise, wenn Prozesse mehrmals gestartet und / oder schnell beendet werden oder wenn Ereignisse über einen längeren Zeitraum protokolliert werden, gibt es eine Möglichkeit, dies mithilfe des Prozessmonitors zu tun .

Grundsätzlich werden verschiedene Ereignisse im System protokolliert. In diesem Fall können Sie einfach das Ereignis "Prozessstart" und den Namen des zu überwachenden Prozesses filtern, wie unten gezeigt:

Bildbeschreibung hier eingeben

Lassen Sie dann einfach den Prozessmonitor laufen und tun Sie alles, um den Prozess, den Sie protokollieren möchten, zum Laufen zu bringen. Sie können entweder in der Spalte "Detail" oder in der Spalte "Befehlszeile" (abhängig davon, wie Sie diese konfigurieren) die Befehlszeilenargumente sehen. Zum Beispiel:

Bildbeschreibung hier eingeben

Natürlich können Sie auf diese Weise viel mehr verwandte Informationen wie das Arbeitsverzeichnis, die übergebenen Umgebungsvariablen usw. extrahieren. Außerdem ist es einfach, die Ergebnisse in eine Datei zu exportieren.

Sil
quelle
1

Wenn ich mit CygWin einen Python- Prozess starte , ist dies ein Beispiel für eine Befehlszeile:

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

Im Process Explorer wird jedoch nur die Haupt-Exe angezeigt:

Der Prozess-Explorer erkennt die vollständige Befehlszeile des Python-Prozesses nicht

(Beachten Sie den "Pfad: [Fehler beim Öffnen der Prozessmeldung]" (siehe EDIT-1)). Gleiche Ergebnisse für tasklist:

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

Der einzige Trick, den ich bisher kenne, ist, ihn über die CygWin Bash-Shell zu finden pgrep :

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

Es ist nützlich, dies zu wissen, solange CygWin unter Windows problemlos funktioniert und Sie damit viele POSIX- und Python-Programme ausführen können.

BEARBEITEN: In Windows scheinen Sie keine Administratorrechte für die Jobliste zu benötigen. In CygWin müssen Sie sie ein Administrator Prozess in der Lage sein zu sehen (was mir mehr logisch erscheint: die vollständige Befehlszeile haben könnten einige Parameter wie Passwörter innen), so müssen wir die laufen CygWin Bash in erhöhten Administrator - Modus .

EDIT-1: Dieses Problem tritt nicht auf, wenn Sie Process Explorer als Administrator ausführen. Vielen Dank für den Hinweis, @Pacerier.

Sopalajo de Arrierez
quelle
2
Wenn Sie als Administrator laufen, würden Sie nicht sehen[Error opening process message]
Pacerier
Sie hatten recht, @Pacerier. Zu offensichtlich, um sich zu erinnern :-). Danke. Ich habe meinen Beitrag bearbeitet, um ihn wiederzugeben.
Sopalajo de Arrierez,
-3

gehe zu runoder gehe zu startund suche:

tasklist -m

tasklist -svc
Zanardan
quelle
5
Das zeigt nicht die aufrufende Befehlszeile. /mZeigt geladene Module (DLLs usw.) und /svcin jedem Prozess gehostete Dienste an.
Bob