Diberikan PID di Windows - bagaimana cara menemukan instruksi baris perintah yang mengeksekusinya?

26

Pada database, saya bisa mendapatkan daftar semua proses yang sedang berjalan, dan perintah sql yang menendang mereka.

Saya ingin melakukan hal serupa pada kotak windows.

Saya bisa mendapatkan daftar proses, tetapi bukan baris perintah yang menendang mereka.

Pertanyaan saya adalah: Diberikan PID pada Windows - bagaimana cara menemukan instruksi baris perintah yang mengeksekusinya?

Asumsi:

  • Windows 7 dan server yang setara
Hawkeye
sumber

Jawaban:

35

Powershell dan WMI.

Get-WmiObject Win32_Process | Select ProcessId,CommandLine

Atau

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

Perhatikan bahwa Anda harus memiliki izin untuk mengakses informasi ini tentang suatu proses. Jadi, Anda mungkin harus menjalankan perintah sebagai admin jika proses yang ingin Anda ketahui berjalan dalam konteks istimewa.

Ryan Ries
sumber
Saya menemukan itu memotong jalan - apakah ada jalan lain?
Hawkeye
1
@ Hawkeye Coba tambahkan | FLke akhir perintah. Itu memperluas semua baris perintah untuk saya. Mungkin juga ingin bermain dengan| Select -ExpandProperty CommandLine
Ryan Ries
Menariknya, Anda tidak bisa mendapatkan informasi ini dari cmdlet Get-Process asli.
Davidw
3
Dapatkan-proses menggunakan kelas system.diagnostics.process yang tidak memiliki properti itu. Bantuan untuk mendapatkan-proses juga memiliki contoh menggunakan wmi untuk mendapatkan objek proses
Jim B
2
Perlu dicatat bahwa tidak ada cara yang didukung secara resmi untuk mendapatkan baris perintah dari proses lain. Meskipun ada cara untuk mendapatkan string yang bisa menjadi baris perintah, itu tidak dijamin oleh sistem operasi dan hasilnya bisa "ayam ayam ayam" untuk semua yang Anda tahu.
Nick
21

Anda dapat menggunakan subsistem WMI, menggunakan WMIC.EXE untuk mendapatkan informasi ini. Dengan asumsi PID 600:

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

Anda juga dapat mencari nama, atau karakteristik lain dari proses tersebut. Gunakan perintah ini untuk mendaftar semua atribut:

wmic.exe path Win32_Process get  /format:list
RobW
sumber
1
Itu berguna; Anda dapat mempersingkat sedikit dengan processalias alih-alih path Win32_Process; misalnya, wmic.exe process get
penyelesaian
15

Jawaban lain tentu saja adalah pilihan yang baik yang akan melayani Anda dengan baik dalam sistem otomatis karena sifat baris perintah mereka (dan saya melihat dari tag bahwa itulah yang Anda inginkan). Tentu saja, beberapa orang mungkin ingin menjelajahi info semacam ini dengan GUI, jadi inilah alternatifnya.

Process Explorer adalah alat Sysinternals yang dikelola oleh Microsoft. Itu dapat menampilkan baris perintah proses dalam dialog properti proses serta orang tua yang meluncurkannya, meskipun nama proses itu mungkin tidak lagi tersedia. Berikut dialog properti proses:

dialog properti proses

Jika Anda ingin jejak audit yang lebih rinci tentang kapan suatu proses diluncurkan dan dalam kondisi apa, Anda dapat beralih ke alat Sysinternals lain yang disebut Process Monitor. Di sini Anda dapat memfilter untuk acara "Proses dimulai", belajar tentang lingkungan tempat proses diluncurkan, dan melihat peristiwa apa yang terjadi sekitar waktu itu. Ini program yang sangat kuat. Berikut dialog properti acara:

dialog properti acara

Korosi
sumber
10
Atau cukup ubah kolom pada Task Manager untuk menampilkan PID dan "Command Line". Dan selesai.
Ismael Miguel
@IsmaelMiguel Kolom Baris Perintah di Task Manager memotong string argumen yang sangat panjang, tidak tahu apakah Process Explorer melakukannya
JG di SD
@ JGinSD Saya belum pernah melihat argumen yang terpotong.
Ismael Miguel
1
@IsmaelMiguel Sepertinya batasnya adalah sekitar 200 karakter untuk kolom Baris Perintah
JG di SD
1
Batas aktual dalam Task Manager adalah 259 karakter. (diverifikasi pada Windows 10). Namun, Task Manager memiliki satu keuntungan: ia memperlihatkan kepada Anda baris perintah dari proses lain / proses yang ditinggikan pengguna lain meskipun itu sendiri berjalan tanpa elevasi (bukan sebagai administrator). Sementara Process Explorer dan Monitor Proses tidak memiliki batas 259-karakter, pada v16.22 mereka dapat menggantung dengan baris perintah yang terlalu panjang jika Command Linekolom telah ditambahkan jika Anda mengarahkan mouse ke kolom itu.
mklement
1

Untuk melengkapi jawaban PowerShell yang membantu Ryan Ries dengan alternatif yang lebih pendek melalui -Filterparameter yang juga menggunakanGet-CimInstance alih-alih cmdlet usang sejak v3Get-WmiObject .

# 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

The -Filterparameter dasarnya memungkinkan Anda untuk lulus WHEREklausul dari WQL pernyataan bukan lewat pernyataan permintaan penuh melalui -Query.

mklement
sumber