ฉันจะหาข้อโต้แย้งบรรทัดคำสั่งของโปรแกรมที่ทำงานอยู่ได้อย่างไร


83

ฉันกำลังมองหาเครื่องมือหรือวิธีการเพื่อค้นหาว่าพารามิเตอร์บรรทัดคำสั่งใดถูกส่งผ่านไปยังโปรแกรมตัวอย่างเช่นเมื่อมีการเรียกใช้โดยโปรแกรมอื่น

คำตอบ:


71

คุณสามารถทำได้โดยใช้Process Explorer

เพียงเลื่อนเมาส์ไปเหนือกระบวนการเพื่อดูอาร์กิวเมนต์บรรทัดคำสั่งที่ใช้เริ่ม:
ป้อนคำอธิบายรูปภาพที่นี่

หรือคุณสามารถเปิดคุณสมบัติของกระบวนการและตรวจสอบบรรทัดคำสั่งได้ที่นั่น:
ป้อนคำอธิบายรูปภาพที่นี่


2
มันเจ๋งจริงๆ
cutrightjm

2
น่าเสียดายที่ดูเหมือนว่าจะไม่ทำงานกับแอปพลิเคชันที่ได้รับการปกป้องด้วย WinLicense / Themida: oreans.com/winlicense.phpแนวคิดอื่นใดบ้าง
Gepard

@Gepard: คุณรู้ได้อย่างไรว่ามันไม่ทำงาน? คุณแน่ใจหรือว่าแอปพลิเคชันนั้นถูกเรียกด้วยอาร์กิวเมนต์บรรทัดคำสั่งจริงหรือ ทั้งสองวิธี PE ใช้วิธี Windows ในการกำหนดข้อมูลนั้น สิ่งอื่นใดจะต้องได้รับการปรับแต่งให้เหมาะกับแอปพลิเคชันเฉพาะฉันถือว่า
Der Hochstapler

6
ฉันไม่ดีมันไม่ได้วิ่ง PE สูง มันทำงานได้ตามที่ตั้งใจไว้
Gepard

@OliverSalzburg โปรแกรมนี้ทำงานอย่างไร โปรแกรม C ปกติใด ๆ สามารถทำสิ่งนี้ได้หรือไม่?
Pacerier

87

คุณสามารถทำได้โดยไม่มี Process Explorer เช่นกันโดยใช้บริการ WMI ของ Windows เรียกใช้สิ่งต่อไปนี้จากพรอมต์คำสั่ง:

WMIC path win32_process get Caption,Processid,Commandline

หากคุณต้องการดัมพ์เอาต์พุตไปยังไฟล์ (ทำให้อ่านง่ายขึ้น) ให้ใช้สวิตช์ / OUTPUT:

WMIC /OUTPUT:C:\Process.txt path win32_process get Caption,Processid,Commandline

4
เยี่ยมคุณรู้เรื่องนี้ได้อย่างไร
Pacerier

4
@Pacerier: ฉันไม่แน่ใจว่าจะซื่อสัตย์ ;-) ฉันคิดว่ามันมาจากการขุดเอกสาร WMI และเล่นเพราะฉันต้องการใช้ WMI ในบางครั้ง
Andy E

3
คุณอ้างถึงเอกสาร WMI ใด
Pacerier

3
นี่เป็นวิธีบรรทัดคำสั่งที่มีประโยชน์มากสำหรับการรับบรรทัดคำสั่งของกระบวนการทำงาน ในกรณีของฉันฉันสามารถปรับแต่งนี้เล็กน้อยเพื่อรับผลลัพธ์สำหรับกระบวนการเฉพาะ: เส้นทาง WMIC win32_process โดยที่ "caption = 'cmd.exe'" รับ Commandline
chriv

1
ยอดเยี่ยมและประโยคที่สนับสนุนคุณสมบัติ SQL บางอย่างเช่นโดยที่ "ชื่อเช่น 'cmd.%'
zhaorufei

39

หนึ่งยังสามารถบรรลุว่าด้วยการใช้ตัวจัดการงาน

เปิดตัวจัดการงาน (โดย CTRL-SHIFT-ESC, CTRL-ALT-DELETE หรือวิธีอื่นใด)

สำหรับ Windows 7 (และอาจเป็น Windows XP):

  • ไปที่แท็บ "กระบวนการ" ในเมนู "มุมมอง" เลือก "เลือกคอลัมน์ ... "
  • ทำเครื่องหมายที่ช่อง "Command Line" แล้วคลิกตกลง (คุณอาจต้องเลื่อนลงเพื่อค้นหา)

สำหรับ Windows 8:

  • ไปที่แท็บ "รายละเอียด" คลิกขวาที่คอลัมน์ใด ๆ (เช่นชื่อ PID ฯลฯ ) และเลือก "เลือกคอลัมน์"
  • ทำเครื่องหมายที่ช่อง "Command Line" แล้วคลิกตกลง (คุณอาจต้องเลื่อนลงเพื่อค้นหา)

คอลัมน์ของบรรทัดคำสั่งของจะถูกเพิ่มไปยังคอลัมน์ที่ปรากฏในปัจจุบัน


1
ฉันไม่ได้รับคุณ @JesseBarnum จริงๆใครสามารถปรับขนาดคอลัมน์เพื่อให้มีมุมมองที่สมบูรณ์ไม่ว่าบรรทัดคำสั่งจะยาวแค่ไหนใช่มั้ย
Jeromy Adofo

1
เฉพาะในกรณีที่หน้าต่างกว้างพอสำหรับขนาดของคำสั่ง หากคำสั่งนั้นเหมือนกับกระบวนการ Java ที่มี classpath แบบยาวนั่นจะไม่พอดีกับความกว้างของหน้าต่าง
Jesse Barnum

1
เอาล่ะขอบคุณสังเกต ฉันไม่ได้มีปัญหานั้นและตามวิธีที่ตัวจัดการงานของฉันสามารถเลื่อนได้ - ไม่รู้เกี่ยวกับตัวคุณ :-) ฉันคิดว่าถ้าคุณสามารถส่งโปรแกรมตัวอย่างให้ฉันลองได้
Jeromy Adofo

6
นี่เป็นคำตอบที่ประเมินค่าต่ำสุดอย่างมากไม่รู้ว่าเป็นไปได้
Hashim

4
ฉันเห็นความคิดเห็นสองสามข้อข้างต้นเกี่ยวกับตัวจัดการงานของ Windows แม้ว่าคุณจะตั้งค่าคอลัมน์ 'บรรทัดคำสั่ง' เพื่อแสดงกระบวนการ Java ด้วยบรรทัดคำสั่งที่ยาวมาก ๆ ก็จะถูกตัดทอน แต่คุณสามารถคลิกที่แถวในตัวจัดการงานและ 'คัดลอก' (Ctrl-c) ทั้งแถวและวางลงในโปรแกรมแก้ไขข้อความเพื่อดูบรรทัดคำสั่งทั้งหมดไม่ว่าจะนานแค่ไหน
JohnD

6

PowerShell เพื่อช่วยเหลือ

หา:

Get-WmiObject Win32_Process -Filter "name = 'perl.exe'" | where {$_.CommandLine -eq '"C:\strawberry\perl\bin\perl.exe" t/Server_PreFork.t'}

และฆ่าเป็นโบนัส:

Get-WmiObject Win32_Process -Filter "name = 'perl.exe'" | where {$_.CommandLine -eq '"C:\strawberry\perl\bin\perl.exe" t/Server_PreFork.t'} | ForEach-Object { Invoke-WmiMethod -Path $_.__Path –Name Terminate }

คุณสามารถเรียกใช้จาก powershell โดยตรงหรือจาก ps1 หากคุณมีการตั้งค่าระบบของคุณ ฉันแสดงรายละเอียดการตั้งค่าสคริปต์ที่ไม่ จำกัด ในการฆ่าซอมบี้ด้วย powershellรวมถึงเทคนิคอื่น ๆ ของ powershell ...


1
โอ้โฮ ... ส่วนหนึ่งฆ่าค่อนข้างอันตรายให้ชื่อของคำถาม;) Otheriwse คำตอบอย่างมาก;)
ทอม

5

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

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

ป้อนคำอธิบายรูปภาพที่นี่

จากนั้นเพียงแค่ให้กระบวนการตรวจสอบกระบวนการทำงานและทำสิ่งที่คุณทำเพื่อให้กระบวนการที่คุณต้องการเข้าสู่ระบบทำงาน คุณสามารถเห็นได้ในคอลัมน์ "รายละเอียด" หรือคอลัมน์ "บรรทัดคำสั่ง" (ขึ้นอยู่กับวิธีที่คุณกำหนดค่าเหล่านั้น) อาร์กิวเมนต์บรรทัดคำสั่ง ตัวอย่างเช่น:

ป้อนคำอธิบายรูปภาพที่นี่

แน่นอนด้วยวิธีนี้คุณสามารถดึงข้อมูลที่เกี่ยวข้องมากขึ้นเช่นไดเรกทอรีทำงานอะไรตัวแปรสภาพแวดล้อมที่ได้รับการส่งผ่านในกระบวนการ ฯลฯ ... นอกจากนี้ยังเป็นเรื่องง่ายที่จะส่งออกผลลัพธ์ไปยังไฟล์


1

เมื่อใช้CygWinถ้าฉันเริ่มกระบวนการPythonนี่คือตัวอย่างของบรรทัดคำสั่ง:

c:\CygWin\bin\python2.7.exe /usr/local/bin/sudoserver.py

แต่Process Explorerจะเห็น exe หลักเท่านั้น:

Process Explorer ไม่พบบรรทัดคำสั่งแบบเต็มของกระบวนการ Python

(โปรดทราบว่า"เส้นทาง: [ข้อผิดพลาดการเปิดข้อความกระบวนการ]" (ดู EDIT-1)) ผลลัพธ์เดียวกันสำหรับtasklist:

C:\>tasklist | find "python" /i
python2.7.exe                 5740 Console                    1    15.312 KB

ดังนั้นเคล็ดลับเดียวที่ฉันรู้จนถึงตอนนี้คือการค้นพบมันผ่านCygWin Bash shell pgrep :

Luis@Kenobi /cygdrive/c/
$ pgrep -f -l server.py
5740 /usr/bin/python2.7 /usr/local/bin/sudoserver.py

มันมีประโยชน์ที่จะรู้สิ่งนี้ตราบใดที่ CygWin ร่วมมือกันโดยไม่มีปัญหาใน Windows และคุณสามารถใช้มันเพื่อรันโปรแกรม POSIX และ Python จำนวนมาก

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

EDIT-1: ปัญหานี้จะไม่เกิดขึ้นหากคุณเรียกใช้ Process Explorer ในฐานะผู้ดูแลระบบ ขอบคุณสำหรับการชี้ @Pacerier


2
หากคุณทำงานในฐานะผู้ดูแลระบบคุณจะไม่เห็น[Error opening process message]
Pacerier

คุณพูดถูกแล้ว @Pacerier ชัดเจนเกินไปที่จะจำ :-) ขอบคุณ. ฉันได้แก้ไขโพสต์เพื่อให้สะท้อน
Sopalajo de Arrierez

-3

ไปที่runหรือข้ามไปstartและค้นหา:

tasklist -m

tasklist -svc

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