Como descubro argumentos de linha de comando de um programa em execução?

84

Estou procurando uma ferramenta ou método para descobrir quais parâmetros de linha de comando foram passados ​​para um programa, por exemplo, quando ele foi executado por outro programa (cenário do aplicativo iniciador).

Gepard
fonte

Respostas:

71

Você pode fazer isso usando o Process Explorer .

Basta passar o mouse sobre um processo para ver os argumentos da linha de comando usados ​​para iniciá-lo:
insira a descrição da imagem aqui

Como alternativa, você pode abrir as propriedades do processo e inspecionar a linha de comando ali:
insira a descrição da imagem aqui

Der Hochstapler
fonte
2
Isso é muito legal.
cutrightjm
2
Infelizmente, parece não funcionar com aplicativos protegidos com WinLicense / Themida: oreans.com/winlicense.php Alguma outra idéia?
Gepard
@Epard: como você sabe que não funciona? Você tem certeza de que o aplicativo foi chamado de fato com argumentos de linha de comando? De qualquer maneira, o PE usa a maneira do Windows de determinar essas informações. Qualquer outra coisa teria que ser personalizada para um aplicativo específico, presumo.
Der Hochstapler
6
Meu mau, não correu PE elevado. Está funcionando como pretendido.
Gepard
@OliverSalzburg, Como esse programa funcionou? Qualquer programa C normal pode conseguir isso?
Pacerier
88

Você também pode fazer isso sem o Process Explorer, usando o serviço WMI do Windows. Execute o seguinte no prompt de comando:

WMIC path win32_process get Caption,Processid,Commandline

Se você deseja despejar a saída em um arquivo (facilita a leitura), use a opção / OUTPUT:

WMIC /OUTPUT:C:\Process.txt path win32_process get Caption,Processid,Commandline
Andy E
fonte
4
Legal, como você sabia disso?
Pacerier
4
@ Pacerier: Eu não tenho certeza para ser honesto ;-) Eu acho que isso veio da procura dos documentos do WMI e da brincadeira, porque eu precisava usar o WMI para algo no momento.
Andy E
3
A quais documentos WMI você está se referindo?
Pacerier
3
Este foi um método de linha de comando muito útil para obter a linha de comando de um processo em execução. No meu caso, consegui ajustar um pouco isso para obter a saída apenas para um processo específico: caminho WMIC win32_process em que "caption = 'cmd.exe'" obtém Commandline
chriv 30/03/16
1
Grande, e onde cláusula realmente suporte a alguns recursos SQL, por exemplo, onde "nome como 'cmd%.'
zhaorufei
39

Pode-se também conseguir isso usando o Gerenciador de tarefas .

Abra o gerenciador de tarefas (por CTRL-SHIFT-ESC, CTRL-ALT-DELETE ou qualquer outro método).

Para o Windows 7 (e provavelmente o Windows XP):

  • Vá para a aba "Processos". No menu "Exibir", selecione "Selecionar colunas ...".
  • Marque a caixa de seleção "Linha de comando" e clique em OK. (Talvez seja necessário rolar para baixo para encontrá-lo)

Para o Windows 8:

  • Vá para a guia "Detalhes". Clique com o botão direito do mouse em qualquer uma das colunas (por exemplo, Nomes, PID etc.) e selecione "Selecionar colunas".
  • Marque a caixa de seleção "Linha de comando" e clique em OK. (Talvez seja necessário rolar para baixo para encontrá-lo)

Uma coluna de linhas de comando será adicionada às colunas exibidas no momento.

Jeromy Adofo
fonte
1
Eu realmente não entendo você @JesseBarnum, sempre é possível redimensionar a coluna para ter uma visão completa, independentemente da duração da linha de comando, certo?
Jeromy Adofo
1
Somente se a janela for larga o suficiente para o tamanho do comando. Se o comando for algo como um processo Java com um caminho de classe longo, isso não caberá na largura da janela.
Jesse Barnum
1
Tudo bem obrigado, observou. Eu não tive esse problema e, a propósito, meu gerenciador de tarefas é rolável - não sei sobre o seu :-). Eu acho que se você puder me enviar um programa de amostra para tentar, isso pode ser resolvido.
Jeromy Adofo
6
Esta é uma resposta muito subestimada, não sabia que isso era possível.
Hashim
4
Vejo alguns comentários acima sobre o Gerenciador de Tarefas do Windows. Mesmo se você definir a coluna 'Linha de comando' para mostrar que um processo Java com uma linha de comando muito longa será truncado. MAS, você pode clicar na linha no Gerenciador de tarefas e 'copiar' (Ctrl-c) a linha inteira e colá-la em um editor de texto para ver toda a linha de comando, não importa quanto tempo.
JohnD
6

PowerShell para o resgate.

Encontrar:

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

E mate como bônus:

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 }

Você pode executá-lo diretamente do PowerShell ou de um ps1, se tiver a configuração do sistema. Eu detalho a configuração irrestrita do script em i kill zombies with powershell , bem como outros truques do powershell ...

Dave Horner
fonte
1
Whoa ... a parte matar é bastante perigoso, dada a título de questão;) Otheriwse uma resposta muito puro;)
Tom
5

As respostas anteriores são ótimas caso o processo já esteja em execução e não seja encerrado em breve. No entanto, se você precisar (como eu fiz) fazer isso, talvez com processos iniciando várias vezes e / ou finalizando rapidamente, ou talvez registrando ocorrências em um período mais longo, existe um caminho para isso usando o Process Monitor .

Basicamente, ele registra vários eventos no sistema; nesse caso, podemos apenas filtrar o evento "Process Start" e o nome do processo que queremos monitorar, conforme mostrado abaixo:

insira a descrição da imagem aqui

Em seguida, mantenha o monitor de processo em execução e faça o que fizer para que o processo que você deseja registrar seja executado. Você pode ver na coluna "Detalhe" ou na "Linha de comando" (depende de como você as configura) os argumentos da linha de comando. Por exemplo:

insira a descrição da imagem aqui

É claro que dessa maneira você pode extrair muito mais informações relacionadas, como qual é o diretório de trabalho, quais variáveis ​​de ambiente foram passadas no processo, etc ... Também é fácil exportar os resultados para um arquivo.

Sil
fonte
1

Ao usar o CygWin , se eu iniciar um processo Python , este é um exemplo de linha de comando:

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

Mas o Process Explorer vê apenas o exe principal:

O Process Explorer não detecta a linha de comando completa do processo Python

(observe o "caminho: [Erro ao abrir a mensagem do processo]" (consulte EDIT-1)). Mesmos resultados para tasklist:

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

Então, o único truque que eu conheço até agora, é encontrá-lo via shell do CygWin Bash pgrep :

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

É útil saber disso, desde que o CygWin coabite sem problemas no Windows e você possa usá-lo para executar muitos programas POSIX e Python.

EDIT: No Windows, você não parece precisar de privilégios de administrador para a lista de tarefas. No CygWin, você precisará deles para poder visualizar o processo de um administrador (o que me parece mais lógico: a linha de comando completa pode ter alguns parâmetros como senhas ), portanto, precisamos executar o CygWin Bash no modo Administrador elevado .

EDIT-1: Esse problema não ocorrerá se você executar o Process Explorer como administrador. Obrigado por apontar, @Pacerier.

Sopalajo de Arrierez
fonte
2
Se executar como administrador, você não estaria vendo[Error opening process message]
Pacerier
Você estava certo, @Pacerier. Muito óbvio para lembrar :-). Te agradece. Eu editei minha postagem para refleti-la.
Sopalajo de Arrierez
-3

vá para runou vá starte pesquise:

tasklist -m

tasklist -svc
Zanardan
fonte
5
Isso não mostra a linha de comando de chamada. /mmostra módulos carregados (DLLs, etc.) e /svcmostra serviços hospedados em cada processo.
Bob