Comment déterminer si un processus sous Windows «n'a pas de parent»?

6

J'essaie de trouver un moyen via la ligne de commande Windows pour déterminer si un processus n'a pas de parent.

Je sais que techniquement tous les processus ont un parent contrôlé par le système d'exploitation ou autre, mais par souci de simplicité, il "n'a pas de parent". Par exemple, si vous ouvrez une fenêtre de l'explorateur, celle-ci apparaîtra dans Process Explorer en haut de son arborescence.

Lorsque je fais une requête wmic sur le processus, cependant, je reçois un PID pour 'parentProcessPID'. Lorsque j'essaie de rechercher ce PID à l'aide de la liste des tâches, il indique que le PID n'est pas reconnu. J'ai examiné quelques processus comme celui-ci et ils semblent avoir différents processus parents qui sont tous inaccessibles via la liste de tâches. Si un processus a un processus parent inaccessible via une liste de tâches, cela signifie-t-il qu'il se trouve au "sommet" de son arborescence de processus?

Je demande parce que j'essaie de faire la différence entre un programme qui s'exécute par lui-même et le même programme qui s'exécute comme un processus enfant d'un autre programme.

Par exemple:

Disons que je vais dans le menu Démarrer de Windows et ouvre une fenêtre de l'explorateur. Ensuite, j'ouvre une fenêtre cmd et tapez: explorer.exe. J'ai maintenant deux processus explorer.exe. L'un est un processus enfant de cmd.exe et l'autre est un processus autonome. Je souhaite pouvoir, via une requête wmic ou une liste de tâches, isoler tous les explorer.exeprocessus qui sont des processus autonomes. Ainsi, le processus que j'ai lancé via le menu Démarrer de Windows doit être renvoyé et non le processus lancé par cmd.exe.

Je suis confronté au problème que chaque processus a un ID de processus parent et je ne sais pas comment faire la différence entre un processus parent provenant d'un programme ou un processus parent provenant d'un processus lié au système d'exploitation. Si je peux faire ce qui suit, ce serait formidable:

Pseudocode:

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
}

Mais je ne suis pas sûr si ma logique est correcte.

utilisateur972276
la source

Réponses:

3

Je ne sais pas comment procéder à partir de la ligne de commande, mais j'ai écrit ceci pour filtrer certains processus liés au système d'exploitation à partir de PowerShell. Cela vous donnera peut-être une idée. Il ignore les éléments appartenant au service, au système et à la valeur null.

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
#

Sortie

    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
Knuckle-Dragger
la source
et vous pouvez voir que la plupart des éléments de la liste sont la propriété de 3460, qui est mon explorer.exe
Knuckle-Dragger
Je suppose que dans mon exemple, tous les processus ne seraient pas la propriété du système, du service local ou du service réseau. Cependant, tous les processus que j'essaie d'examiner ont en réalité été créés par un service Windows exécuté sous l'utilisateur LOCAL SYSTEM. La différenciation doit donc fonctionner pour les deux types de processus démarrés dans la session 0 sous l'utilisateur système local.
user972276
Vous devez rechercher quels processus ont un ID de processus parent qui n'existe pas. Par exemple, si explorer.exele processus parent est répertorié en tant que PPID 5072, mais qu'aucun processus avec un PID ne 5072s'exécute sur le système, vous avez un processus non configuré.
Darth Android
alors créez un GWMI de l'identifiant parent filtrant uniquement les processus que vous souhaitez vérifier, puis exécutez un deuxième GWMI de tous les pids et foreach dans la liste des identifiants parents de la première requête. Ceux qui ne correspondent pas sont $ profit.
Knuckle-Dragger