Frage Gegeben eine PID unter Windows - wie finde ich die Befehlszeile, die sie ausgeführt hat?


In einer Datenbank kann ich eine Liste aller aktuell laufenden Prozesse und des SQL-Befehls erhalten, der sie ausgelöst hat.

Ich würde gerne eine ähnliche Sache auf einer Windows-Box machen.

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

Meine Frage ist: Gegeben eine PID unter Windows - wie finde ich die Befehlszeile, die sie ausgeführt hat?

Annahmen:

  • Windows 7 und gleichwertige Server

24
2018-06-03 22:55


Ursprung




Antworten:


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 Berechtigungen haben müssen, um auf diese Informationen zu einem Prozess zugreifen zu können. Daher müssen Sie den Befehl möglicherweise als admin ausführen, wenn der Prozess, den Sie kennen möchten, in einem privilegierten Kontext ausgeführt wird.


33
2018-06-03 23:20



Ich finde es schneidet den Pfad ab - gibt es einen Weg dahin? - Hawkeye
@Hawkeye Versuchen Sie, hinzuzufügen | FL bis zum Ende des Befehls. Das erweitert die gesamte Befehlszeile für mich. Möchte auch mit spielen | Select -ExpandProperty CommandLine - Ryan Ries
Interessanterweise können Sie diese Informationen nicht vom nativen Get-Process-Cmdlet abrufen. - Davidw
Get-process verwendet die Klasse system.diagnostics.process, die diese Eigenschaft nicht besitzt. Die Hilfe für get-process enthält außerdem ein Beispiel für die Verwendung von wmi zum Abrufen des Prozessobjekts - Jim B
Es ist erwähnenswert, dass es da ist nein offiziell unterstützt Möglichkeit, die Befehlszeile eines anderen Prozesses zu erhalten. Während Es gibt Wege um eine Zeichenfolge zu bekommen könnte Die Befehlszeile wird vom Betriebssystem nicht garantiert und das Ergebnis könnte "Hühnchen Hühnchen Hühnchen" für alles sein, was Sie wissen. - Nick


Sie können das WMI-Subsystem mit WMIC.EXE verwenden, um zu diesen Informationen zu gelangen. Annahme einer 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

20
2018-06-03 23:39



Upvoting, weil wir alle mehr über SF abstimmen müssen! - Ryan Ries


Die anderen Antworten sind sicherlich gute Optionen, die Ihnen in einem automatisierten System aufgrund ihrer Befehlszeilen-Natur (und ich sehe vom Tag, dass Sie das wollten) gut dienen. Natürlich möchten einige Leute diese Art von Informationen mit einer GUI erkunden, also ist hier eine Alternative in dieser Richtung.

Process Explorer ist ein Sysinternals-Tool, das von Microsoft verwaltet wird. Es kann die Befehlszeile des Prozesses im Eigenschaftendialog des Prozesses sowie das übergeordnete Element, das es gestartet hat, anzeigen, obwohl der Name dieses Prozesses möglicherweise nicht mehr verfügbar ist. Hier ist der Prozesseigenschaften-Dialog:

process properties dialog

Wenn Sie einen detaillierteren Audit-Trail darüber benötigen, wann ein Prozess gestartet wurde und unter welchen Bedingungen, können Sie sich an ein anderes Sysinternals-Tool namens Process Monitor wenden. Hier können Sie nach "Process started" -Ereignissen filtern, etwas über die Umgebung erfahren, in der der Prozess gestartet wurde, und sehen, welche anderen Ereignisse zu dieser Zeit stattfanden. Es ist ein ziemlich mächtiges Programm. Hier ist der Dialog für die Ereigniseigenschaften:

event properties dialog


14
2018-06-04 07:26



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 wirklich lange Argument-Strings ab und weiß nicht, ob Process Explorer dies tut - JG in SD
@JGinSD Ich habe noch nie ein abgeschnittenes Argument gesehen. - Ismael Miguel
@IsmaelMiguel Das Limit für die Befehlszeilenspalte beträgt ungefähr 200 Zeichen - JG in SD
@JGinSD Sie haben Recht. Ich habe den folgenden Befehl verwendet, um es zu versuchen: start cmd.exe /C pause "12345467890abcdefghijklmnopqrstuvwxyz12345467890abcdefghijklmnopqrstuvwxyz12345467890abcdefghijklmnopqrstuvwxyz12345467890abcdefghijklmnopqrstuvwxyz12345467890abcdefghijklmnopqrstuvwxyz12345467890abcdefghijklmnopqrstuvwxyz12345467890abcdefghijklmnopqrstuvwxyz12345467890abcdefghijklmnopqrstuvwxyz12345467890abcdefghijklmnopqrstuvwxyz12345467890abcdefghijklmnopqrstuvwxyz12345467890abcdefghijklmnopqrstuvwxyz12345467890abcdefghijklmnopqrstuvwxyz12345467890abcdefghijklmnopqrstuvwxyz" - Ismael Miguel