Як визначити, чи є процес у Windows "не має батьків"?


6

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

Я знаю, що в усіх процесах технічно є батько, яким керує ОС або що завгодно, але заради простоти він "не має батьків". Наприклад, якщо ви відкриєте вікно провідника, воно з’явиться в Провіднику процесів у верхній частині дерева процесів.

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

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

Наприклад:

Скажімо, я заходжу в меню запуску Windows і відкриваю вікно провідника. Потім я відкриваю CMD вікно і введіть: explorer.exe. Зараз у мене є два процесиr.r.ee. Один - це дочірній процес 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
}

Але я не впевнений, чи моя логіка правильна.

Відповіді:


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

і ви можете бачити, що більшість елементів у списку належать 3460, що є моїм
Explor.exe

Я думаю, що в моєму прикладі всі процеси не належали б системі, локальній службі або службі мережі. Але всі процеси, на які я намагаюся розглянути, насправді були створені службою Windows, що працює під користувачем LOCAL SYSTEM. Таким чином, диференціація повинна працювати для обох типів процесів, запущених у сеансі 0 під місцевим користувачем системи.
user972276

Вам потрібно подивитися, які процеси мають батьківський ідентифікатор процесу, який не існує. Тобто, якщо explorer.exeбатьківський процес вказаний як PPID 5072, але не існує процесу з PID, що 5072працює в системі, тоді у вас є безроздільний процес.
Дарт Android

тому створіть один GWMI з фільтрування батьківського ідентифікатора лише тих процесів, які ви хочете перевірити, а потім запустіть другий GWMI з усіх підтекстів та просувайте в списку батьківських ідентифікаторів з першого запиту. Ті, що не відповідають, - це $ прибуток.
Knuckle-Dragger
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.