Đưa ra một PID trên Windows - làm thế nào để tôi tìm thấy lệnh dòng lệnh đã thực thi nó?


26

Trên cơ sở dữ liệu, tôi có thể nhận được một danh sách tất cả các quy trình hiện đang chạy và lệnh sql đã khởi động chúng.

Tôi muốn làm một điều tương tự trên một hộp cửa sổ.

Tôi có thể lấy danh sách các quy trình, nhưng không phải là dòng lệnh khởi động chúng.

Câu hỏi của tôi là: Đưa ra một PID trên Windows - làm thế nào để tôi tìm thấy lệnh dòng lệnh đã thực thi nó?

Giả định:

  • Windows 7 và các máy chủ tương đương

Câu trả lời:


35

Powershell và WMI.

Get-WmiObject Win32_Process | Select ProcessId,CommandLine

Hoặc là

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

Lưu ý rằng bạn phải có quyền truy cập thông tin này về một quy trình. Vì vậy, bạn có thể phải chạy lệnh với tư cách quản trị viên nếu quá trình bạn muốn biết đang chạy trong ngữ cảnh đặc quyền.


Tôi thấy nó cắt ngắn con đường - có cách nào khác không?
Hawkeye

1
@Hawkeye Hãy thử thêm | FLvào cuối lệnh. Điều đó mở rộng tất cả các dòng lệnh cho tôi. Cũng có thể muốn chơi với| Select -ExpandProperty CommandLine
Ryan Ries

Thật thú vị, bạn không thể lấy thông tin này từ lệnh ghép ngắn Get-Process gốc.
Davidw

3
Get-process sử dụng lớp system.diagnostics. Process không có thuộc tính đó. Trợ giúp cho quy trình get cũng có một ví dụ về việc sử dụng wmi để lấy đối tượng xử lý
Jim B

2
Điều đáng chú ý là không có cách nào được hỗ trợ chính thức để có được dòng lệnh của một quy trình khác. Mặc dù có nhiều cách để có được một chuỗi có thể là dòng lệnh, nhưng nó không được đảm bảo bởi hệ điều hành và kết quả có thể là "gà gà gà" cho tất cả những gì bạn biết.
Nick

21

Bạn có thể sử dụng hệ thống con WMI, sử dụng WMIC.EXE để nhận thông tin này. Giả sử PID là 600:

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

Bạn cũng có thể tìm kiếm tên hoặc đặc điểm khác của quy trình. Sử dụng lệnh này để liệt kê tất cả các thuộc tính:

wmic.exe path Win32_Process get  /format:list

1
Thật tiện dụng; bạn có thể rút ngắn nó một chút với processbí danh thay vì path Win32_Process; ví dụ: wmic.exe process get
mkuity 18/12/18

15

Các câu trả lời khác chắc chắn là các tùy chọn tốt sẽ phục vụ bạn tốt trong một hệ thống tự động vì tính chất dòng lệnh của chúng (và tôi thấy từ thẻ đó là những gì bạn muốn). Tất nhiên, một số người có thể muốn khám phá loại thông tin này với GUI, vì vậy đây là một lựa chọn thay thế dọc theo các dòng đó.

Process Explorer là một công cụ Sysiternals được duy trì bởi Microsoft. Nó có thể hiển thị dòng lệnh của quá trình trong hộp thoại thuộc tính của tiến trình cũng như cha mẹ đã khởi chạy nó, mặc dù tên của quá trình đó có thể không còn nữa. Đây là hộp thoại thuộc tính process:

hộp thoại thuộc tính quá trình

Nếu bạn muốn có một bản kiểm toán chi tiết hơn về thời điểm một quy trình được đưa ra và trong những điều kiện nào, bạn có thể chuyển sang một công cụ Sysiternals khác có tên là Process Monitor. Tại đây, bạn có thể lọc các sự kiện "Quá trình bắt đầu", tìm hiểu về môi trường mà quá trình được khởi chạy và xem những sự kiện khác đang diễn ra vào khoảng thời gian đó. Đây là một chương trình khá mạnh mẽ. Đây là hộp thoại thuộc tính sự kiện:

hộp thoại thuộc tính sự kiện


10
Hoặc chỉ cần thay đổi các cột trên Trình quản lý tác vụ để hiển thị PID và "Dòng lệnh". Và thực hiện.
Ismael Miguel

@IsmaelMiguel Cột Dòng lệnh trong Trình quản lý tác vụ thực hiện cắt ngắn các chuỗi đối số thực sự dài, không biết nếu Process Explorer thực hiện
JG trong SD

@JGinSD Tôi chưa bao giờ thấy một đối số bị cắt ngắn.
Ismael Miguel

1
@IsmaelMiguel Có vẻ như giới hạn là khoảng 200 ký tự cho cột Dòng lệnh
JG trong SD

1
Giới hạn thực tế trong Trình quản lý tác vụ là 259 ký tự. (đã xác minh trên Windows 10). Tuy nhiên, Trình quản lý tác vụ có một lợi thế: nó hiển thị cho bạn các dòng lệnh của các quá trình nâng cao / người dùng khác ngay cả khi chính nó chạy mà không có độ cao (không phải là quản trị viên). Mặc dù Process Explorer và Process Monitor không có giới hạn 259 ký tự, kể từ v16.22, chúng có thể bị treo với các dòng lệnh quá dài nếu Command Linecột đã được thêm nếu bạn di chuột qua cột đó.
mkuity 18/12/18

1

Để bổ sung cho câu trả lời PowerShell hữu ích của Ryan Ries bằng một giải pháp thay thế ngắn hơn thông qua -Filtertham số cũng sử dụngGet-CimInstance thay cho lệnh ghép ngắn không dùng nữa từ 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

Các -Filterthông số cơ bản cho phép bạn vượt qua WHEREđiều khoản của một WQL tuyên bố thay vì đi qua một tuyên bố truy vấn đầy đủ qua -Query.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.