Biorąc pod uwagę PID w systemie Windows - jak znaleźć instrukcję z linii poleceń, która ją wykonała?

26

W bazie danych mogę uzyskać listę wszystkich aktualnie uruchomionych procesów oraz polecenie sql, które je uruchomiło.

Chciałbym zrobić podobną rzecz na oknie systemu Windows.

Mogę uzyskać listę procesów, ale nie wiersz poleceń, który je rozpoczął.

Moje pytanie brzmi: biorąc pod uwagę PID w systemie Windows - jak znaleźć instrukcję wiersza poleceń, która ją wykonała?

Założenia:

  • Windows 7 i równoważne serwery
Sokole Oko
źródło

Odpowiedzi:

35

PowerShell i WMI.

Get-WmiObject Win32_Process | Select ProcessId,CommandLine

Lub

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

Pamiętaj, że musisz mieć uprawnienia dostępu do tych informacji o procesie. Może więc być konieczne uruchomienie polecenia jako administrator, jeśli proces, o którym chcesz wiedzieć, działa w uprzywilejowanym kontekście.

Ryan Ries
źródło
Uważam, że skraca ścieżkę - czy jest na to sposób?
Hawkeye
1
@Hawkeye Spróbuj dodać | FLna końcu polecenia. To rozszerza całą linię poleceń dla mnie. Może także chcesz zagrać z| Select -ExpandProperty CommandLine
Ryanem Ries
Co ciekawe, nie można uzyskać tych informacji z natywnego polecenia cmdlet Get-Process.
Davidw
3
Get-process korzysta z klasy system.diagnostics.process, która nie ma tej właściwości. Pomoc dla get-process zawiera także przykład użycia wmi do uzyskania obiektu procesu
Jim B
2
Warto zauważyć, że nie ma oficjalnie obsługiwanego sposobu uzyskania wiersza polecenia innego procesu. Chociaż istnieją sposoby na uzyskanie ciągu, który może być wierszem poleceń, nie jest to gwarantowane przez system operacyjny, a wynikiem może być „kurczak kurczak kurczak” dla wszystkich, których znasz.
Nick
21

Aby uzyskać dostęp do tych informacji, możesz skorzystać z podsystemu WMI, używając WMIC.EXE. Zakładając, że PID wynosi 600:

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

Możesz także wyszukać nazwę lub inną cechę procesu. Użyj tego polecenia, aby wyświetlić listę wszystkich atrybutów:

wmic.exe path Win32_Process get  /format:list
RobW
źródło
1
To się przydaje; możesz go nieco skrócić za pomocą processaliasu zamiast path Win32_Process; np. wmic.exe process get
mklement
15

Inne odpowiedzi to z pewnością dobre opcje, które będą dobrze służyć w zautomatyzowanym systemie ze względu na ich charakter linii poleceń (i widzę po tagu, że tego właśnie chciałeś). Oczywiście niektórzy ludzie mogą chcieć odkryć tego rodzaju informacje za pomocą GUI, więc oto alternatywa w tym zakresie.

Process Explorer to narzędzie Sysinternals obsługiwane przez Microsoft. Może wyświetlać wiersz polecenia procesu w oknie dialogowym właściwości procesu, a także element nadrzędny, który go uruchomił, chociaż nazwa tego procesu może nie być już dostępna. Oto okno dialogowe właściwości procesu:

okno dialogowe właściwości procesu

Jeśli potrzebujesz bardziej szczegółowej ścieżki audytu, kiedy proces został uruchomiony i na jakich warunkach, możesz przejść do innego narzędzia Sysinternals o nazwie Process Monitor. Tutaj możesz filtrować zdarzenia „Rozpoczęty proces”, dowiedzieć się o środowisku, w którym proces został uruchomiony, i zobaczyć, jakie inne zdarzenia miały miejsce w tym czasie. To dość potężny program. Oto okno dialogowe właściwości zdarzenia:

okno dialogowe właściwości zdarzenia

Corrodias
źródło
10
Lub po prostu zmień kolumny w Menedżerze zadań, aby wyświetlić PID i „Wiersz poleceń”. I zrobione.
Ismael Miguel
@ IsmaelMiguel Kolumna wiersza poleceń w Menedżerze zadań obcina naprawdę długie łańcuchy argumentów, nie wiem, czy Process Explorer tak
JG w SD
@JGinSD Nigdy nie widziałem skróconego argumentu.
Ismael Miguel
1
@ IsmaelMiguel Wygląda na to, że limit wynosi około 200 znaków w kolumnie Wiersza poleceń
JG w SD
1
Rzeczywisty limit w Menedżerze zadań wynosi 259 znaków. (zweryfikowane w systemie Windows 10). Menedżer zadań ma jednak jedną zaletę: pokazuje wiersze poleceń procesów innych użytkowników / podniesionych uprawnień, nawet jeśli sam działa bez podniesienia uprawnień (nie jako administrator). Podczas gdy Process Explorer i Process Monitor nie mają limitu 259 znaków, od wersji 16.22 mogą się zawiesić z nadmiernie długimi wierszami poleceń, jeśli Command Linekolumna została dodana, jeśli najedziesz myszką na tę kolumnę.
mklement
1

W celu uzupełnienia użytecznej odpowiedzi PowerShell Ryan Ries' z krótszym alternatywa poprzez -Filterparametr , który również wykorzystujeGet-CimInstance zamiast przestarzałe-od-v3 Get-WmiObjectcmdlet .

# 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

Ten -Filterparametr zasadniczo umożliwia przekazanie WHEREklauzuli instrukcji WQL zamiast przekazywania pełnej instrukcji zapytania -Query.

mklement
źródło