Como posso determinar se um processo no Windows “não tem pai”?

6

Eu estou tentando descobrir um caminho através da linha de comando do Windows para determinar se um processo não tem pai.

Eu sei que todos os processos tecnicamente têm um pai que é controlado pelo sistema operacional ou qualquer outro, mas por uma questão de simplicidade "não tem pai". Por exemplo, se você abrir uma janela do explorador, ela será exibida no Process Explorer , na parte superior da árvore de processos.

Quando eu faço uma consulta wmic no processo, no entanto, recebo um PID para 'parentProcessPID'. Quando tento e pesquiso o PID usando a lista de tarefas, ele diz que o PID não é reconhecido. Eu olhei para alguns processos como este e eles parecem ter diferentes processos pai que são todos inacessíveis através de lista de tarefas. Se um processo tiver um processo pai inacessível por meio da lista de tarefas, isso significa que ele está no "topo" de sua árvore de processos?

Estou perguntando porque estou tentando diferenciar entre um programa em execução sozinho e o mesmo programa em execução como um processo filho de outro programa.

Por exemplo:

Digamos que eu vá para o menu Iniciar do Windows e abra uma janela do Explorer. Em seguida, abro uma janela cmd e digito: explorer.exe . Agora tenho dois processos explorer.exe. Um é um processo filho de cmd.exe e um é um processo autônomo. Eu quero poder, através de uma consulta wmic ou tasklist, destacar todos os processos explorer.exe que são um processo independente. Portanto, o processo que iniciei através do menu Iniciar do Windows deve ser retornado e não o processo iniciado pelo cmd.exe.

Estou correndo para o problema de que todo processo tem um ID de processo pai e não sei como diferenciar entre um processo pai proveniente de um programa ou o processo pai proveniente de um processo relacionado ao sistema operacional. Se eu puder fazer o seguinte, seria ótimo:

Pseudocódigo:

wmic process where name=explorer.exe get parentProcessID,processID
tasklist /fi "PID eq <parentProcessID>" 2>&1> log.txt
if(log.txt contains "INFO: No tasks are running which match the specified criteria."){
    // Parent PID is not recognized by tasklist
    // Do something
}

Mas não tenho certeza se minha lógica está correta.

    
por user972276 16.12.2013 / 18:09

1 resposta

3

Não sei ao certo como fazer isso na linha de comando, mas escrevi isso para fazer uma filtragem dos processos relacionados ao sistema operacional do PowerShell. Talvez te dê uma ideia. Ele ignora itens de serviço, sistema e nulo.

gwmi win32_process |select ProcessID,ParentProcessID,Name, @{l="Username";e={$_.getowner().user}}|where {$_.Username -ne "SYSTEM"} | where {$_.Username -ne "LOCAL SERVICE"} | where {$_.Username -ne "NETWORK SERVICE"} | where {$_.Username -ne $null} |Sort-Object ProcessID | ft -AutoSize
#

Saída

    ProcessID ParentProcessID Name            Username
    --------- --------------- ----            --------
     2136     3460            notepad.exe     KNUCKLE-DRAGGER
     2504     3460            firefox.exe     KNUCKLE-DRAGGER
     2792      700            dllhost.exe     KNUCKLE-DRAGGER
     2816     4232            conhost.exe     KNUCKLE-DRAGGER
     2916     3460            powershell.exe  KNUCKLE-DRAGGER
     3128     3460            notepad.exe     KNUCKLE-DRAGGER
     3180      576            taskhost.exe    KNUCKLE-DRAGGER
     3196     4308            vmware-tray.exe KNUCKLE-DRAGGER
     3460     4392            explorer.exe    KNUCKLE-DRAGGER
     3644     4636            vmware-vmx.exe  KNUCKLE-DRAGGER
     3696     3460            mplayerc.exe    KNUCKLE-DRAGGER
     4636     3196            vmware.exe      KNUCKLE-DRAGGER
     4828     3460            notepad.exe     KNUCKLE-DRAGGER
    
por 16.12.2013 / 18:38