รับ PID บน Windows - ฉันจะหาคำสั่งบรรทัดคำสั่งที่ดำเนินการได้อย่างไร


26

บนฐานข้อมูลฉันสามารถรับรายการของกระบวนการที่กำลังทำงานอยู่ทั้งหมดและคำสั่ง sql ที่เตะมันออก

ฉันต้องการทำสิ่งที่คล้ายกันในกล่องหน้าต่าง

ฉันสามารถรับรายการกระบวนการได้ แต่ไม่ใช่บรรทัดคำสั่งที่จะเปิดใช้งาน

คำถามของฉันคือ: กำหนด PID บน Windows - ฉันจะหาคำสั่งบรรทัดคำสั่งที่ดำเนินการได้อย่างไร

สมมติฐาน:

  • Windows 7 และเซิร์ฟเวอร์ที่เทียบเท่า

คำตอบ:


35

Powershell และ WMI

Get-WmiObject Win32_Process | Select ProcessId,CommandLine

หรือ

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

โปรดทราบว่าคุณต้องมีสิทธิ์ในการเข้าถึงข้อมูลเกี่ยวกับกระบวนการนี้ ดังนั้นคุณอาจต้องเรียกใช้คำสั่งในฐานะผู้ดูแลระบบหากกระบวนการที่คุณต้องการทราบกำลังทำงานในบริบทที่ได้รับการยกเว้น


ฉันพบว่ามันตัดทอนเส้นทาง - มีวิธีแก้ไขไหม?
Hawkeye

1
@Hawkeye ลองเพิ่ม| FLที่ส่วนท้ายของคำสั่ง นั่นเป็นการขยายบรรทัดคำสั่งทั้งหมดสำหรับฉัน อาจต้องการเล่นกับ| Select -ExpandProperty CommandLine
Ryan Ries

น่าสนใจคุณไม่สามารถรับข้อมูลนี้จาก cmdlet Get-Process ดั้งเดิม
Davidw

3
Get-process ใช้คลาส system.diagnostics.process ซึ่งไม่มีคุณสมบัตินั้น ความช่วยเหลือสำหรับการประมวลผลยังมีตัวอย่างของการใช้ wmi เพื่อรับวัตถุกระบวนการ
Jim B

2
เป็นที่น่าสังเกตว่าไม่มีวิธีที่เป็นทางการในการรับบรรทัดคำสั่งของกระบวนการอื่น ในขณะที่มีวิธีรับสตริงที่อาจเป็นบรรทัดคำสั่งก็ไม่รับประกันโดยระบบปฏิบัติการและผลลัพธ์อาจเป็น "ไก่ไก่ไก่" สำหรับทุกสิ่งที่คุณรู้
Nick

21

คุณสามารถใช้ระบบย่อย WMI โดยใช้ WMIC.EXE เพื่อรับข้อมูลนี้ สมมติว่า PID 600:

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

คุณยังสามารถค้นหาชื่อหรือคุณสมบัติอื่น ๆ ของกระบวนการ ใช้คำสั่งนี้เพื่อแสดงรายการคุณสมบัติทั้งหมด:

wmic.exe path Win32_Process get  /format:list

1
สะดวกมาก คุณสามารถย่อให้สั้นลงเล็กน้อยกับprocessนามแฝงแทนpath Win32_Process; เช่น, wmic.exe process get
mklement

15

คำตอบอื่น ๆ เป็นตัวเลือกที่ดีอย่างแน่นอนที่จะให้บริการคุณได้ดีในระบบอัตโนมัติเนื่องจากลักษณะบรรทัดคำสั่งของพวกเขา (และฉันเห็นจากแท็กที่เป็นสิ่งที่คุณต้องการ) แน่นอนว่าผู้ใช้บางคนอาจต้องการสำรวจข้อมูลประเภทนี้ด้วย GUI ดังนั้นจึงเป็นทางเลือกสำหรับคนเหล่านี้

Process Explorer เป็นเครื่องมือ Sysinternals ดูแลโดย Microsoft มันสามารถแสดงบรรทัดคำสั่งของกระบวนการในกล่องโต้ตอบคุณสมบัติของกระบวนการเช่นเดียวกับผู้ปกครองที่เปิดตัวแม้ว่าชื่อของกระบวนการนั้นอาจไม่สามารถใช้ได้อีกต่อไป นี่คือกล่องโต้ตอบคุณสมบัติกระบวนการ:

ไดอะล็อกคุณสมบัติกระบวนการ

หากคุณต้องการหลักฐานการตรวจสอบโดยละเอียดมากขึ้นว่ากระบวนการถูกเปิดใช้เมื่อใดและอยู่ภายใต้เงื่อนไขใดคุณสามารถเปิดใช้เครื่องมือ Sysinternals อื่นที่เรียกว่า Process Monitor ที่นี่คุณสามารถกรองเหตุการณ์ "เริ่มกระบวนการ" เรียนรู้เกี่ยวกับสภาพแวดล้อมที่กระบวนการเปิดตัวและดูเหตุการณ์อื่น ๆ ที่เกิดขึ้นในช่วงเวลานั้น มันค่อนข้างเป็นโปรแกรมที่ทรงพลัง นี่คือกล่องโต้ตอบคุณสมบัติเหตุการณ์:

กล่องโต้ตอบคุณสมบัติเหตุการณ์


10
หรือเพียงแค่เปลี่ยนคอลัมน์ในตัวจัดการงานเพื่อแสดง PID และ "บรรทัดคำสั่ง" และเสร็จแล้ว
Ismael Miguel

@IsmaelMiguel คอลัมน์บรรทัดคำสั่งในตัวจัดการงานจะตัดทอนสตริงอาร์กิวเมนต์ที่ยาวมาก ๆ ไม่รู้ว่า Process Explorer ทำอะไร
JG ใน SD

@JGinSD ฉันไม่เคยเห็นอาร์กิวเมนต์ที่ถูกตัดทอน
Ismael Miguel

1
@IsmaelMiguel ดูเหมือนว่าขีด จำกัด จะอยู่ที่ประมาณ 200 ตัวอักษรสำหรับคอลัมน์ Command Line
JG ใน SD

1
ขีด จำกัด ที่แท้จริงในตัวจัดการงานคือ 259 ตัวอักษร (ตรวจสอบแล้วบน Windows 10) ตัวจัดการงานมีข้อดีอย่างหนึ่งคือมันจะแสดงบรรทัดคำสั่งของกระบวนการของผู้ใช้ / ผู้ใช้อื่นแม้ว่ามันจะทำงานโดยไม่มีการยกระดับ (ไม่ใช่ในฐานะผู้ดูแลระบบ) ในขณะที่ Process Explorer และ Process Monitor ไม่มีขีด จำกัด 259 อักขระในขณะที่ v16.22 พวกเขาสามารถวางสายบรรทัดคำสั่งที่ยาวเกินไปหากCommand Lineมีการเพิ่มคอลัมน์หากคุณวางเมาส์เหนือคอลัมน์นั้น
mklement

1

เพื่อเสริมไรอัน Ries' คำตอบ PowerShell ที่เป็นประโยชน์กับทางเลือกที่สั้นผ่าน-Filterพารามิเตอร์ที่ยังใช้Get-CimInstanceแทนการเลิกใช้ตั้งแต่-v3Get-WmiObject cmdlet

# 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

-Filterพารามิเตอร์หลักช่วยให้คุณสามารถที่จะผ่านWHEREข้อของWQL-Queryคำสั่งแทนการส่งผ่านคำสั่งแบบสอบถามเต็มผ่านทางสื่อ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.