6

Я пытаюсь выяснить способ через командную строку Windows, чтобы определить, если процесс не имеет родителя.

Я знаю, что все процессы технически имеют родителя, который контролируется ОС или чем-то еще, но ради простоты у него "нет родителя". Например, если вы откроете окно проводника, оно появится в Process Explorer в верхней части дерева процессов.

Однако, когда я делаю wmic-запрос к процессу, я получаю PID для "parentProcessPID". Когда я пытаюсь найти этот PID с помощью списка задач, он говорит, что PID не распознан. Я посмотрел на пару процессов, подобных этому, и у них, кажется, есть разные родительские процессы, которые все недоступны через список задач. Если у процесса есть родительский процесс, который недоступен через список задач, означает ли это, что он находится на "вершине" своего дерева процессов?

Я спрашиваю, потому что я пытаюсь провести различие между программой, выполняемой сама по себе, и той же программой, запущенной как дочерний процесс другой программы.

Например:

Допустим, я захожу в меню Пуск Windows и открываю окно проводника. Затем я открываю окно cmd и набираю: explorer.exe . Теперь у меня есть два процесса explorer.exe. Один - это дочерний процесс cmd.exe, а другой - автономный процесс. Я хочу иметь возможность с помощью запроса wmic или списка задач выделить все процессы explorer.exe которые являются автономными. Итак, должен быть возвращен процесс, который я запустил через меню «Пуск» Windows, а не процесс, запущенный cmd.exe.

Я сталкиваюсь с проблемой, что у каждого процесса есть идентификатор родительского процесса, и я не знаю, как отличить родительский процесс, происходящий от программы, или родительский процесс, происходящий от процесса, связанного с ОС. Если бы я мог сделать следующее, это было бы здорово:

псевдокод:

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
}

Но я не уверен, что моя логика верна.

1 ответ1

3

Я не уверен, как это сделать из командной строки, но я написал это, чтобы выполнить некоторую фильтрацию процессов, связанных с ОС, из PowerShell. Может быть, это даст вам идею. Он пропускает элементы, принадлежащие сервису, системе и нулю.

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
#

Выход

    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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .