Jak znaleźć argumenty wiersza poleceń uruchomionego programu?

82

Szukam narzędzia lub metody, aby dowiedzieć się, jakie parametry wiersza poleceń zostały przekazane do programu, na przykład, gdy został on uruchomiony przez inny program (scenariusz aplikacji uruchamiającej).

Gepard
źródło

Odpowiedzi:

70

Możesz to zrobić za pomocą Eksploratora procesów .

Najedź kursorem myszy na proces, aby zobaczyć argumenty wiersza poleceń użyte do jego uruchomienia:
wprowadź opis zdjęcia tutaj

Alternatywnie możesz otworzyć właściwości procesu i sprawdzić w tym miejscu wiersz poleceń:
wprowadź opis zdjęcia tutaj

Der Hochstapler
źródło
2
To jest naprawdę fajne.
cutrightjm
2
Niestety nie działa z aplikacjami chronionymi przez WinLicense / Themida : oreans.com/winlicense.php Jakieś inne pomysły?
Gepard
@Gepard: Skąd wiesz, że to nie działa? Czy na pewno aplikacja została wywołana z argumentami wiersza poleceń? Tak czy inaczej PE używa systemu Windows do określania tych informacji. Zakładam, że wszystko inne musiałoby być dostosowane do konkretnej aplikacji.
Der Hochstapler
6
Moi źli, to nie działało na podwyższonym poziomie PE. Działa zgodnie z przeznaczeniem.
Gepard
@OliverSalzburg, jak działał ten program? Czy każdy normalny program C może to osiągnąć?
Pacerier
87

Możesz to zrobić również bez Process Explorera, korzystając z usługi WMI systemu Windows. Uruchom następujące polecenie w wierszu polecenia:

WMIC path win32_process get Caption,Processid,Commandline

Jeśli chcesz zrzucić dane wyjściowe do pliku (ułatwia to czytanie), użyj przełącznika / OUTPUT:

WMIC /OUTPUT:C:\Process.txt path win32_process get Caption,Processid,Commandline
Andy E.
źródło
4
Fajnie, skąd to wiesz?
Pacerier
4
@Pacerier: Nie jestem szczery ;-) Wydaje mi się, że wynikało to z przeszukiwania dokumentów WMI i zabawy, ponieważ musiałem używać WMI do czegoś w tym czasie.
Andy E,
3
Do jakich dokumentów WMI masz na myśli?
Pacerier
3
To była bardzo pomocna metoda wiersza poleceń do uzyskania wiersza polecenia uruchomionego procesu. W moim przypadku byłem w stanie nieco to ulepszyć, aby uzyskać dane wyjściowe tylko dla określonego procesu: ścieżka WMIC win32_process gdzie „caption = 'cmd.exe” ”uzyskać
wiersz
1
Świetnie, a klauzula where faktycznie obsługuje niektóre funkcje SQL, np. Gdzie „nazwa jak” cmd.% ​​”
zhaorufei 31.08.16
38

Można to również osiągnąć za pomocą Menedżera zadań .

Otwórz menedżera zadań (za pomocą CTRL-SHIFT-ESC, CTRL-ALT-DELETE lub dowolną inną metodą).

W systemie Windows 7 (i prawdopodobnie Windows XP):

  • Przejdź do zakładki „Procesy”. W menu „Widok” wybierz „Wybierz kolumny ...”.
  • Zaznacz pole wyboru „Wiersz poleceń” i kliknij OK. (Może być konieczne przewinięcie w dół, aby je znaleźć)

W systemie Windows 8:

  • Przejdź do zakładki „Szczegóły”. Kliknij dowolną kolumnę prawym przyciskiem myszy (np. Nazwy, PID itp.) I wybierz „Wybierz kolumny”.
  • Zaznacz pole wyboru „Wiersz poleceń” i kliknij OK. (Może być konieczne przewinięcie w dół, aby je znaleźć)

Kolumna Wiersze poleceń zostanie dodana do aktualnie wyświetlanych kolumn.

Jeromy Adofo
źródło
1
Naprawdę nie otrzymuję cię @JesseBarnum, zawsze można zmienić rozmiar kolumny, aby mieć pełny widok, bez względu na to, jak długi jest wiersz poleceń, prawda?
Jeromy Adofo,
1
Tylko jeśli okno jest wystarczająco szerokie dla rozmiaru polecenia. Jeśli polecenie jest czymś w rodzaju procesu Java z długą ścieżką klasy, nie będzie pasować do szerokości okna.
Jesse Barnum,
1
W porządku, dzięki. Nie miałem tego problemu, a swoją drogą mój menedżer zadań można przewijać - nie wiem o twoim :-). Myślę, że jeśli możesz wysłać mi przykładowy program do wypróbowania, może to rozwiązać.
Jeromy Adofo,
6
To bardzo niedoceniana odpowiedź, nie miałem pojęcia, że ​​to możliwe.
Hashim
4
Widzę kilka komentarzy powyżej na temat Menedżera zadań Windows. Nawet jeśli ustawisz kolumnę „Linia poleceń”, aby pokazać proces Java z naprawdę długą linią poleceń, zostanie obcięty. ALE, możesz kliknąć wiersz w Menedżerze zadań i „skopiować” (Ctrl-c) cały wiersz i wkleić go do edytora tekstu, aby zobaczyć całą linię poleceń, bez względu na to, jak długo.
JohnD
6

PowerShell na ratunek.

Odnaleźć:

Get-WmiObject Win32_Process -Filter "name = 'perl.exe'" | where {$_.CommandLine -eq '"C:\strawberry\perl\bin\perl.exe" t/Server_PreFork.t'}

I zabij jako bonus:

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 }

Możesz uruchomić go bezpośrednio z PowerShell lub z PS1, jeśli masz już konfigurację systemu. Szczegółowo opisuję nieograniczoną konfigurację skryptu dotyczącą zabijania zombie za pomocą PowerShell, a także innych sztuczek PowerShell ...

Dave Horner
źródło
1
Whoa ... część zabicia jest dość niebezpieczna, biorąc pod uwagę tytuł pytania;) Otheriwse bardzo schludna odpowiedź;)
Tom
5

Poprzednie odpowiedzi są świetne w przypadku, gdy proces już trwa i wkrótce się nie zakończy. Jednakże, jeśli potrzebujesz (tak jak ja), aby to zrobić, być może procesory uruchamiają się wiele razy i / lub szybko kończą, lub być może rejestrują zdarzenia w dłuższym okresie czasu, istnieje na to sposób za pomocą Monitora procesów .

Zasadniczo rejestruje różne zdarzenia w systemie, w tym przypadku możemy po prostu odfiltrować zdarzenie „Rozpoczęcie procesu” i nazwę procesu, który chcemy monitorować, jak pokazano poniżej:

wprowadź opis zdjęcia tutaj

Następnie po prostu utrzymuj monitor procesu działający i rób wszystko, co chcesz, aby proces, który chcesz zalogować, był uruchomiony. W kolumnie „Szczegóły” lub w kolumnie „Wiersz poleceń” (w zależności od ich konfiguracji) możesz zobaczyć argumenty wiersza poleceń. Na przykład:

wprowadź opis zdjęcia tutaj

Oczywiście w ten sposób możesz wyodrębnić znacznie więcej powiązanych informacji, takich jak katalog roboczy, jakie zmienne środowiskowe zostały przekazane w procesie itp. Również łatwo jest wyeksportować wyniki do pliku.

Sil
źródło
1

Jeśli korzystam z CygWin , jeśli uruchomię proces w języku Python , jest to przykład wiersza poleceń:

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

Ale Process Explorer widzi tylko główny plik exe:

Process Explorer nie wykrywa pełnego wiersza poleceń procesu Python

(zwróć uwagę na „ścieżkę: [Błąd otwierania komunikatu procesowego]” (patrz EDYCJA-1)). Te same wyniki dla tasklist:

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

Tak więc jedyną sztuczką, jaką znam do tej pory, jest znalezienie jej za pomocą powłoki CygWin Bash pgrep :

Luis@Kenobi /cygdrive/c/
$ pgrep -f -l server.py
5740 /usr/bin/python2.7 /usr/local/bin/sudoserver.py

Warto o tym wiedzieć, o ile CygWin nie ma problemów w systemie Windows i można go używać do uruchamiania wielu programów POSIX i Python.

EDYCJA: W systemie Windows wydaje się, że nie potrzebujesz uprawnień administratora do listy zadań. W CygWin będziesz potrzebował ich, aby móc zobaczyć proces administratora (co wydaje mi się bardziej logiczne: pełny wiersz poleceń może zawierać pewne parametry, takie jak hasła ), więc musimy uruchomić CygWin Bash w podwyższonym trybie administratora .

EDYCJA 1: Ten problem nie wystąpi, jeśli uruchomisz Process Explorer jako administrator. Dziękuję za wskazanie, @Pacerier.

Sopalajo de Arrierez
źródło
2
Jeśli [Error opening process message]
działasz
Miałeś rację, @Pacerier. Zbyt oczywiste, aby pamiętać :-). Dzięki Ci. Zredagowałem mój post, aby go odzwierciedlić.
Sopalajo de Arrierez
-3

przejdź do runlub goto starti wyszukaj:

tasklist -m

tasklist -svc
Zanardan
źródło
5
To nie pokazuje wywołującego wiersza poleceń. /mpokazuje załadowane moduły (biblioteki DLL itp.) i /svcpokazuje usługi hostowane w każdym procesie.
Bob