Учитывая PID в Windows - как найти инструкцию командной строки, которая его выполнила?

26

В базе данных я могу получить список всех запущенных в данный момент процессов и команду sql, которая их запустила.

Я хотел бы сделать аналогичную вещь на коробке окна.

Я могу получить список процессов, но не командную строку, которая их вызвала.

Мой вопрос: учитывая PID в Windows - как найти инструкцию командной строки, которая его выполнила?

Предположения:

  • Windows 7 и эквивалентные серверы
Hawkeye
источник

Ответы:

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
Райан Райс
Интересно, что вы не можете получить эту информацию из собственного командлета 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
RobW
источник
1
Это удобно; Вы можете немного сократить его с помощью processпсевдонима вместо path Win32_Process; например, wmic.exe process get
mklement
15

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

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

диалог свойств процесса

Если вам нужен более подробный контрольный журнал о том, когда был запущен процесс и при каких условиях, вы можете обратиться к другому инструменту Sysinternals, который называется Process Monitor. Здесь вы можете отфильтровать события «Процесс запущен», узнать об окружающей среде, в которой запущен процесс, и посмотреть, какие другие события произошли за это время. Это довольно мощная программа. Вот диалог свойств события:

диалог свойств события

Corrodias
источник
10
Или просто измените столбцы в диспетчере задач, чтобы показать PID и «Командную строку». И сделано.
Исмаэль Мигель
@IsmaelMiguel Столбец командной строки в диспетчере задач действительно усекает действительно длинные строки аргументов, не знаю, если это делает Process Explorer
JG в SD,
@JGinSD Я никогда не видел усеченного аргумента.
Исмаэль Мигель
1
@IsmaelMiguel Похоже, что для столбца командной строки ограничение составляет около 200 символов
JG в SD,
1
Фактический лимит в диспетчере задач составляет 259 символов. (проверено в Windows 10). Однако у диспетчера задач есть одно преимущество: он показывает командные строки процессов других пользователей / с повышенными правами, даже если сам он работает без повышения прав (не как администратор). Хотя Process Explorer и Process Monitor не имеют предела в 259 символов, с версии v16.22 они могут зависать из- за слишком длинных командных строк, если Command Lineстолбец был добавлен, если навести указатель мыши на этот столбец.
Мклемент
1

Чтобы дополнить полезный ответ PowerShell Райана Райса более короткой альтернативой через -Filterпараметр, который также используетGet-CimInstance вместо устаревшего Get-WmiObjectкомандлета v3 .

# 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.

mklement
источник