Dado um PID no Windows - como encontro a instrução de linha de comando que o executou?

26

Em um banco de dados, posso obter uma lista de todos os processos em execução no momento e o comando sql que os iniciou.

Eu gostaria de fazer uma coisa semelhante em uma caixa de janelas.

Eu posso obter a lista de processos, mas não a linha de comando que os iniciou.

Minha pergunta é: Dado um PID no Windows - como encontro a instrução de linha de comando que o executou?

Suposições:

  • Windows 7 e servidores equivalentes
Hawkeye
fonte

Respostas:

35

Powershell e WMI.

Get-WmiObject Win32_Process | Select ProcessId,CommandLine

Ou

Get-WmiObject -Query "SELECT CommandLine FROM Win32_Process WHERE ProcessID = 3352"

Observe que você precisa ter permissões para acessar essas informações sobre um processo. Portanto, talvez você precise executar o comando como administrador se o processo que você deseja conhecer estiver em execução em um contexto privilegiado.

Ryan Ries
fonte
Acho que trunca o caminho - existe uma maneira de contornar isso?
Hawkeye
1
@Hawkeye Tente adicionar | FLno final do comando. Isso expande toda a linha de comando para mim. Também pode querer brincar com| Select -ExpandProperty CommandLine
Ryan Ries
Curiosamente, você não pode obter essas informações do cmdlet Get-Process nativo.
21715 David Davidw
3
Get-process usa a classe system.diagnostics.process que não possui essa propriedade. A ajuda para get-processo também tem um exemplo de como usar o WMI para obter o objeto de processo
Jim B
2
Vale a pena notar que não maneira oficialmente suportada de obter a linha de comando de outro processo. Embora existam maneiras de obter uma string que possa ser a linha de comando, ela não é garantida pelo sistema operacional e o resultado pode ser "chicken chicken chicken", pelo que você sabe.
Nick
21

Você pode usar o subsistema WMI, usando WMIC.EXE para obter essas informações. Supondo um PID de 600:

wmic.exe path Win32_Process where handle='600' get name, commandline  /format:list

Você também pode procurar por nome ou outra característica do processo. Use este comando para listar todos os atributos:

wmic.exe path Win32_Process get  /format:list
RobW
fonte
1
Isso é útil; você pode reduzi-lo um pouco com o processapelido em vez de path Win32_Process; por exemplo, wmic.exe process get
mklement
15

As outras respostas certamente são boas opções que o servirão bem em um sistema automatizado devido à natureza da linha de comando (e vejo pela tag que é isso que você queria). Obviamente, algumas pessoas podem querer explorar esse tipo de informação com uma GUI, então aqui está uma alternativa nesse sentido.

Process Explorer é uma ferramenta Sysinternals mantida pela Microsoft. Ele pode exibir a linha de comando do processo na caixa de diálogo de propriedades do processo, bem como o pai que o iniciou, embora o nome desse processo possa não estar mais disponível. Aqui está o diálogo de propriedades do processo:

caixa de diálogo de propriedades do processo

Se você desejar uma trilha de auditoria mais detalhada de quando um processo foi iniciado e sob quais condições, poderá recorrer a outra ferramenta Sysinternals chamada Process Monitor. Aqui, você pode filtrar por eventos "Processo iniciado", aprender sobre o ambiente em que o processo foi iniciado e ver quais outros eventos estavam ocorrendo nesse período. É um programa bastante poderoso. Aqui está o diálogo de propriedades do evento:

caixa de diálogo de propriedades do evento

Corrodias
fonte
10
Ou simplesmente altere as colunas no Gerenciador de tarefas para mostrar o PID e a "Linha de comando". E feito.
Ismael Miguel
Coluna @IsmaelMiguel a linha de comando no Gerenciador de tarefas faz truncar realmente longas cadeias de argumentos, não sei se Process Explorer faz
JG em SD
@JGinSD Eu nunca vi um argumento truncado.
Ismael Miguel
1
@IsmaelMiguel Parece que o limite é de cerca de 200 caracteres para a coluna Linha de Comando
JG in SD
1
O limite real no Gerenciador de tarefas é de 259 caracteres. (verificado no Windows 10). No entanto, o Gerenciador de Tarefas tem uma vantagem: mostra as linhas de comando dos processos de outros usuários / elevados, mesmo quando ele é executado sem elevação (não como administrador). Embora o Process Explorer e o Process Monitor não tenham o limite de 259 caracteres, na v16.22 eles podem travar com linhas de comando muito longas se a Command Linecoluna tiver sido adicionada se você passar o mouse sobre essa coluna.
Mklement
1

Para complementar a resposta útil do PowerShell de Ryan Ries com uma alternativa mais curta por meio do -Filterparâmetro que também usa, emGet-CimInstance vez do cmdlet obsoleto desde a v3Get-WmiObject .

# 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

O -Filterparâmetro essencialmente permite que você passe a WHEREcláusula de uma instrução WQL em vez de passar uma instrução de consulta completa via -Query.

mklement
fonte