Eine PID unter Windows vorausgesetzt - wie finde ich die Befehlszeilenanweisung, die sie ausgeführt hat?

26

In einer Datenbank kann ich eine Liste aller derzeit ausgeführten Prozesse und den SQL-Befehl abrufen, der sie ausgelöst hat.

Ähnliches möchte ich an einer Windows-Box tun.

Ich kann die Liste der Prozesse abrufen, aber nicht die Befehlszeile, die sie ausgelöst hat.

Meine Frage ist: Angesichts einer PID unter Windows - wie finde ich die Befehlszeilenanweisung, die sie ausgeführt hat?

Annahmen:

  • Windows 7 und gleichwertige Server
Falkenauge
quelle

Antworten:

35

PowerShell und WMI.

Get-WmiObject Win32_Process | Select ProcessId,CommandLine

Oder

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

Beachten Sie, dass Sie über Berechtigungen verfügen müssen, um auf diese Informationen zu einem Prozess zugreifen zu können. Daher müssen Sie den Befehl möglicherweise als Administrator ausführen, wenn der gewünschte Prozess in einem privilegierten Kontext ausgeführt wird.

Ryan Ries
quelle
Ich finde, es schneidet den Weg ab - gibt es einen Weg, um das zu umgehen?
Hawkeye
1
@ Hawkeye Versuchen Sie | FL, am Ende des Befehls etwas hinzuzufügen . Das erweitert die gesamte Befehlszeile für mich. Könnte auch mit spielen wollen| Select -ExpandProperty CommandLine
Ryan Ries
Interessanterweise können Sie diese Informationen nicht aus dem nativen Cmdlet Get-Process abrufen.
Davidw
3
Get-process verwendet die Klasse system.diagnostics.process, die diese Eigenschaft nicht besitzt. Die Hilfe für get-process enthält auch ein Beispiel für die Verwendung von wmi zum Abrufen des Prozessobjekts
Jim B,
2
Es ist erwähnenswert, dass es keine offiziell unterstützte Methode gibt, um die Befehlszeile eines anderen Prozesses abzurufen. Es gibt zwar Möglichkeiten , eine Zeichenfolge abzurufen, bei der es sich möglicherweise um die Befehlszeile handelt, diese wird jedoch vom Betriebssystem nicht garantiert, und das Ergebnis könnte nach allem, was Sie wissen, "chicken chicken chicken" sein.
Nick
21

Sie können das WMI-Subsystem mit WMIC.EXE verwenden, um an diese Informationen zu gelangen. Angenommen eine PID von 600:

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

Sie können auch nach Namen oder anderen Merkmalen des Prozesses suchen. Verwenden Sie diesen Befehl, um alle Attribute aufzulisten:

wmic.exe path Win32_Process get  /format:list
RobW
quelle
1
Das ist praktisch; Sie können es mit dem processAlias etwas kürzen, anstatt path Win32_Process; zB wmic.exe process get
mklement
15

Die anderen Antworten sind sicherlich gute Optionen, die Ihnen in einem automatisierten System aufgrund ihrer Befehlszeilennatur gute Dienste leisten (und ich sehe anhand des Tags, dass Sie genau das wollten). Natürlich möchten einige Leute diese Art von Informationen mit einer grafischen Benutzeroberfläche erkunden. Hier ist also eine Alternative in dieser Richtung.

Process Explorer ist ein von Microsoft verwaltetes Sysinternals-Tool. Es kann die Befehlszeile des Prozesses im Eigenschaftendialogfeld des Prozesses sowie das übergeordnete Element anzeigen, das den Prozess gestartet hat, obwohl der Name dieses Prozesses möglicherweise nicht mehr verfügbar ist. Hier ist das Dialogfeld mit den Prozesseigenschaften:

Dialogfeld "Prozesseigenschaften"

Wenn Sie eine detailliertere Übersicht darüber wünschen, wann und unter welchen Bedingungen ein Prozess gestartet wurde, können Sie sich an ein anderes Sysinternals-Tool mit dem Namen Process Monitor wenden. Hier können Sie nach "Prozess gestartet" -Ereignissen filtern, Informationen über die Umgebung erhalten, in der der Prozess gestartet wurde, und nachsehen, welche anderen Ereignisse zu dieser Zeit aufgetreten sind. Es ist ein ziemlich mächtiges Programm. Hier ist das Dialogfeld mit den Ereigniseigenschaften:

Ereignis Eigenschaften Dialog

Corrodias
quelle
10
Oder ändern Sie einfach die Spalten im Task-Manager, um die PID und die "Befehlszeile" anzuzeigen. Und fertig.
Ismael Miguel
@IsmaelMiguel Die Befehlszeilenspalte im Task-Manager schneidet sehr lange Argumentzeichenfolgen ab. Sie wissen nicht, ob dies der Prozess-Explorer tut
JG in SD
@JGinSD Ich habe noch nie ein abgeschnittenes Argument gesehen.
Ismael Miguel
1
@IsmaelMiguel Es sieht so aus, als ob das Limit für die Befehlszeilenspalte bei 200 Zeichen liegt
JG in SD
1
Das tatsächliche Limit im Task-Manager beträgt 259 Zeichen. (Geprüft unter Windows 10). Der Task-Manager hat jedoch einen Vorteil: Er zeigt Ihnen Befehlszeilen der Prozesse anderer Benutzer / mit erhöhten Rechten, auch wenn er selbst ohne Erhöhung ausgeführt wird (nicht als Administrator). Process Explorer und Process Monitor haben zwar nicht die Beschränkung auf 259 Zeichen, können jedoch ab Version 16.22 mit übermäßig langen Befehlszeilen hängen bleiben , wenn die Command LineSpalte hinzugefügt wurde, wenn Sie mit der Maus über diese Spalte fahren.
mklement
1

Ergänzen Sie die hilfreiche PowerShell-Antwort von Ryan Ries durch eine kürzere Alternative über den -FilterParameter , derGet-CimInstance anstelle des Cmdlets " deprecated-since-v3" auch Get-WmiObjectverwendet wird .

# 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

Mit dem -FilterParameter können Sie im Wesentlichen die WHEREKlausel einer WQL- Anweisung übergeben, anstatt eine vollständige Abfrageanweisung über zu übergeben -Query.

mklement
quelle