Как узнать аргументы командной строки работающей программы?

84

Я ищу инструмент или метод, чтобы выяснить, какие параметры командной строки были переданы программе, например, когда она была запущена другой программой (сценарий запуска приложения).

Гепард
источник

Ответы:

71

Вы можете сделать это с помощью Process Explorer .

Просто наведите курсор мыши на процесс, чтобы увидеть аргументы командной строки, использованные для его запуска:
введите описание изображения здесь

Кроме того, вы можете открыть свойства процесса и проверить командную строку прямо здесь:
введите описание изображения здесь

Der Hochstapler
источник
2
Это действительно круто.
cutrightjm
2
К сожалению, похоже, что он не работает с приложениями, защищенными WinLicense / Themida: oreans.com/winlicense.php. Есть еще идеи?
Гепард
@ Гепард: Откуда ты знаешь, что это не работает? Вы уверены, что приложение было вызвано с аргументами командной строки? В любом случае, PE использует способ определения этой информации в Windows . Я предполагаю, что все остальное должно быть адаптировано к конкретному приложению.
Der Hochstapler
6
Мое плохое, это не бежало PE повышенный. Это работает как задумано.
Гепард
@OliverSalzburg, как работала эта программа? Может ли какая-нибудь нормальная программа на C добиться этого?
Пейсер
88

Вы также можете сделать это без 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
Хорошо, как ты узнал это?
Пейсер
4
@Pacerier: я не уверен, если честно ;-) Я думаю, что это произошло из-за того, что копался в документах WMI и играл, потому что мне нужно было что-то использовать WMI в то время.
Энди Э
3
На какие документы WMI вы ссылаетесь?
Pacerier
3
Это был очень полезный метод командной строки для получения командной строки запущенного процесса. В моем случае, я был в состоянии настроить это немного , чтобы получить выход только для определенного процесса: WMIC путь Win32_Process где «заголовок =„cmd.exe“» получить Commandline
chriv
1
Отлично, и предложение where фактически поддерживает некоторые функции SQL, например, где "name вроде 'cmd.%'
zhaorufei
39

Этого также можно добиться с помощью диспетчера задач .

Откройте диспетчер задач (с помощью CTRL-SHIFT-ESC, CTRL-ALT-DELETE или любым другим способом).

Для Windows 7 (и, вероятно, Windows XP):

  • Перейдите на вкладку «Процессы». В меню «Вид» выберите «Выбрать столбцы ...».
  • Установите флажок «Командная строка» и нажмите ОК. (Возможно, вам придется прокрутить вниз, чтобы найти его)

Для Windows 8:

  • Перейдите на вкладку «Подробности». Щелкните правой кнопкой мыши по любому из столбцов (например, имена, PID и т. Д.) И выберите «Выбрать столбцы».
  • Установите флажок «Командная строка» и нажмите ОК. (Возможно, вам придется прокрутить вниз, чтобы найти его)

Столбец командной строки будет добавлен к отображаемым в данный момент столбцам.

Джероми Адофо
источник
1
Я на самом деле не понимаю @JesseBarnum, всегда можно изменить размер столбца, чтобы получить полный вид, независимо от длины командной строки, верно?
Джером Адофо
1
Только если окно достаточно широкое для размера команды. Если команда похожа на процесс Java с длинным путем к классу, это не будет соответствовать ширине окна.
Джесси Барнум
1
Хорошо, спасибо, отметил. Хотя у меня не было этой проблемы, и, кстати, мой диспетчер задач можно прокручивать - не знаю, как у вас :-). Я думаю, что если вы отправите мне пример программы, это можно решить.
Джером Адофо
6
Это очень недооцененный ответ, даже не подозревал, что это возможно.
Хашим
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
Ого ... часть убийства довольно опасна, учитывая название вопроса;) Отрису очень хороший ответ;)
Том
5

Предыдущие ответы хороши, если процесс уже запущен и не скоро завершится. Однако если вам нужно (как я сделал) сделать это, возможно, с процессами, запускаемыми несколько раз и / или быстро завершающимися, или, возможно, регистрировать события в течение более длительного периода времени, есть способ сделать это с помощью Process Monitor .

По сути, он регистрирует различные события в системе, в этом случае мы можем просто отфильтровать событие «Запуск процесса» и имя процесса, который мы хотим отслеживать, как показано ниже:

введите описание изображения здесь

Затем просто оставьте монитор процесса включенным и делайте все, что вы делаете, чтобы запустить процесс, который вы хотите зарегистрировать В столбце «Сведения» или в столбце «Командная строка» (в зависимости от того, как вы их настраиваете) вы можете видеть аргументы командной строки. Например:

введите описание изображения здесь

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

Sil
источник
1

При использовании CygWin , если я запускаю процесс Python , это пример командной строки:

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

Но Process Explorer видит только основной exe:

Process Explorer не обнаруживает полную командную строку процесса Python

(обратите внимание на «путь: [Ошибка при открытии сообщения процесса]» (см. РЕДАКТИРОВАТЬ-1)). Такие же результаты для tasklist:

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

Итак, единственный трюк, который я знаю до сих пор, это найти его через оболочку CygWin Bash 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 Bash в режиме администратора с повышенными правами .

РЕДАКТИРОВАТЬ-1: эта проблема не произойдет, если вы запустите Process Explorer от имени администратора. Спасибо, что указали, @Pacerier.

Сопалахо де Арриерес
источник
2
Если вы будете работать как администратор, вы не [Error opening process message]
увидите
Вы были правы, @Pacerier. Слишком очевидно, чтобы помнить :-). Спасибо вам. Я отредактировал свой пост, чтобы отразить его.
Сопалахо де Арриерес
-3

перейти к runили перейти startи искать:

tasklist -m

tasklist -svc
Zanardan
источник
5
Это не показывает вызывающую командную строку. /mпоказывает загруженные модули (библиотеки DLL и т. д.) и /svcпоказывает службы, размещенные в каждом процессе.
Боб