Як дізнатися аргументи командного рядка запущеної програми?


82

Я шукаю інструмент або метод, щоб дізнатися, які параметри командного рядка передані програмі, наприклад, коли вона виконувалася іншою програмою (сценарій запуску-програми).

Відповіді:


70

Це можна зробити за допомогою Провідника процесів .

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

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


2
Це справді круто.
cutrightjm

2
На жаль, це, здається, не працює з програмами, захищеними WinLicense / Themida: oreans.com/winlicense.php Будь-які інші ідеї?
Гепард

@Gepard: Звідки ти знаєш, що це не працює? Ви впевнені, що програма насправді викликалася аргументами командного рядка? У будь-якому випадку, PE використовує Windows спосіб визначення цієї інформації. Я припускаю, що все інше повинно бути налаштоване на конкретну програму.
Der Hochstapler

6
Моє погано, PE не було підвищеним. Це працює за призначенням.
Гепард

@OliverSalzburg, Як ця програма працювала? Чи може досягти цього будь-яка звичайна програма С?
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 для чогось у той час.
Енді Е

3
На які документи WMI ви звертаєтесь?
Pacerier

3
Це був дуже корисний метод командного рядка для отримання командного рядка запущеного процесу. У моєму випадку мені вдалося це трохи змінити, щоб отримати вихід лише для конкретного процесу: шлях WMIC win32_process, де "caption = 'cmd.exe" "отримати
командний рядок

1
Чудово, а пункт де насправді підтримує деякі функції SQL, наприклад, де "ім'я типу" cmd.% ​​"
zhaorufei

38

Цього можна досягти і за допомогою диспетчера завдань .

Відкрити менеджер завдань (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 }

Ви можете запустити його з Powerhell безпосередньо або з ps1, якщо у вас встановлена ​​система. Я докладно описую необмежену настройку сценарію на вбивстві зомбі за допомогою силової оболонки , а також про інші хитрощі при владі ...


1
Ото ... частина вбивства є досить небезпечною, з огляду на назву питання;) Отері дуже точна відповідь;)
Том

5

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

В основному він реєструє різні події в системі, у цьому випадку ми можемо просто відфільтрувати подію "Процес запуску" та назву процесу, який ми хочемо відстежувати, як показано нижче:

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

Тоді просто продовжуйте працювати монітор процесу і робіть все, що ви робите, щоб отримати процес, який ви хочете виконати. Ви можете бачити або у стовпці "Детальніше", або у стовпці "Командний рядок" (залежить від того, як ви їх налаштуєте) аргументи командного рядка. Наприклад:

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

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


1

Якщо я використовую CygWin , якщо я запускаю процес Python , це приклад командного рядка:

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

Але Process Explorer бачить лише основний exe:

Провідник процесів не виявляє повного командного рядка процесу Python

(зверніть увагу на "шлях: [Помилка відкриття повідомлення про процес]" (див. EDIT-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 у підвищеному режимі адміністратора .

EDIT-1: Ця проблема не виникне, якщо ви запустите Process Explorer як адміністратор. Дякую за вказівку, @Pacerier.


2
Якщо ти [Error opening process message]
працюєш

Ви мали рацію, @Pacerier. Занадто очевидно, щоб запам'ятати :-). Дякую тобі. Я відредагував свою публікацію, щоб відобразити її.
Sopalajo de Arrierez

-3

перейти runабо перейти startта шукати:

tasklist -m

tasklist -svc

5
Це не показує командний рядок виклику. /mпоказує завантажені модулі (DLL тощо) та /svcпоказує послуги, розміщені в кожному процесі.
Боб
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.