Powershell encontra processos órfãos

1

Estou procurando uma maneira de encontrar processos que não tenham um processo pai em execução (processos órfãos). Estou tentando fazer isso usando win32_process. Eu tenho a consulta que retorna os atributos necessários, é a comparação que estou lutando com:

gwmi win32_process -ComputerName $hostname | select ProcessID,ParentProcessID,@{l="Username";e={$_.getowner().user}} | where{$_.Username -like $username}

Eu tentei comparar-objeto -includeequal contra os dois arrays e obter um número esmagador de resultados, tanto que eu duvido da verdade do operador, dado os arrays que eu estou alimentando. Eu acho que há valor adicionado no comando diff, mas não estou familiarizado com o uso além de alimentar matrizes também. Alguém tem experiência com o comando diff e / ou outra solução?

O objetivo final é comparar ou diferenciar as duas matrizes da chamada wmi acima:

$proc_all = gwmi win32_process -ComputerName $hostname | select ProcessID,ParentProcessID,@{l="Username";e={$_.getowner().user}} | where{$_.Username -like $username}
$sub_procs = $proc_all.Processid #ARRAY1
$par_proces = $proc_all.ParentProcessId #ARRAY2

E, em seguida, retorne apenas os que não aparecem em ambos (órfão). Obrigado antecipadamente!

    
por user367081 25.07.2016 / 19:24

1 resposta

0

Provavelmente não é muito eficiente, mas parece funcionar:

$all_Processes = gwmi win32_process -ComputerName . | select ProcessID,ParentProcessID,Description,@{l="Username";e={$_.getowner().user}} | where{$_.Username -like $env:username}
$all_processIDs = $all_Processes.Processid #ARRAY1
$parent_processIDs = $all_Processes.ParentProcessId #ARRAY2

# create a new Array for parents that are gone
$gone = New-Object System.Collections.ArrayList

# loop through all processes
$parent_processIDs | Sort-Object -Unique | ForEach-Object {
# find the ones where the current parent ID is not running
    if ($all_processIDs -notcontains $_)
    {
        $gone.Add($_) | Out-Null
    }
}
# now we have all parentIDs no longer running

# loop through all processes and find those in that list
$all_Processes | Where-Object {$gone -contains $_.ParentProcessId} | ForEach-Object {$_}
    
por 25.07.2016 / 20:16