З огляду на 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"

Зауважте, що ви повинні мати дозволи для доступу до цієї інформації про процес. Тому вам, можливо, доведеться запустити команду як адміністратор, якщо процес, про який ви хочете знати, працює в привілейованому контексті.


Я вважаю, що це обрізає шлях - чи є такий шлях?
Хокі

1
@Hawkeye Спробуйте додати | FLдо кінця команди. Це розширює весь командний рядок для мене. Можливо, також хочеться пограти з| Select -ExpandProperty CommandLine
Ryan Ries

Цікаво, що ви не можете отримати цю інформацію з рідного командлету Get-Process.
Davidw

3
Get-process використовує клас system.diagnostics.process, який не має цього властивості. У довідці щодо get-process також є приклад використання wmi для отримання об’єкта процесу
Jim B

2
Варто зазначити, що офіційно не підтримується спосіб отримання командного рядка іншого процесу. Хоча існують способи отримати рядок, який може бути командним рядком, операційна система це не гарантує, і результатом може стати "курка курка" для всіх, що ви знаєте.
Нік

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

Інші відповіді - це, безумовно, хороші варіанти, які будуть добре служити вам в автоматизованій системі через їх характер командного рядка (і я бачу з тегу, що це саме ви хотіли). Звичайно, деякі люди, можливо, захочуть вивчити подібну інформацію за допомогою графічного інтерфейсу, тому ось альтернатива у цьому напрямку.

Process Explorer - це інструмент Sysinternals, який підтримує Microsoft. Він може відображати командний рядок процесу у діалоговому вікні властивостей процесу, а також батьків, який його запустив, хоча назва цього процесу вже не буде доступною. Ось діалогове вікно властивостей процесу:

Діалогове вікно властивостей процесу

Якщо ви хочете отримати більш детальний аудиторський слід про те, коли процес був запущений і за яких умов, ви можете звернутися до іншого інструмента Sysinternals під назвою Process Monitor. Тут ви можете відфільтрувати події "Процес розпочато", дізнатися про середовище, в якому процес був запущений, і побачити, які інші події відбувалися за цей час. Це досить потужна програма. Ось діалог властивостей події:

Діалогове вікно властивостей події


10
Або просто поміняйте стовпці в диспетчері завдань, щоб показати PID та "Командний рядок". І зробили.
Ісмаїл Мігель

@IsmaelMiguel Стовпчик командного рядка в диспетчері завдань справді обрізає дійсно довгі рядки аргументів, не знаю, чи так це Explorer Explorer
JG в SD

@JGinSD Я ніколи не бачив усічений аргумент.
Ісмаїл Мігель

1
@IsmaelMiguel Схоже, що для колонки командного рядка обмеження становить близько 200 символів
JG в SD

1
Фактична межа в диспетчері завдань - 259 знаків. (перевірено в Windows 10). Однак, у диспетчера завдань є одна перевага: він показує вам командні рядки процесів інших користувачів / підвищених, навіть коли він сам працює без піднесення (не як адміністратор). Хоча Провідник процесів та Монітор процесів не мають обмеження 259 символів, з версії v16.22 вони можуть зависати із занадто довгими командними рядками, якщо Command Lineстовпець додано, якщо навести курсор на цей стовпець.
mklement

1

Для того, щоб доповнити корисний відповідь PowerShell Ryan Ries ' з більш короткою альтернативою через -Filterпараметр , який також використовуєGet-CimInstance замість застарілого-так-v3 Get-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

-FilterПараметр по суті дозволяє передати WHEREположення про в WQL заяви замість того , щоб передати повний оператор запиту з допомогою -Query.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.