2013-03-26 2 views
1

Я пытаюсь перечислить все дочерние объекты данного процесса (учитывая его идентификатор процесса). После некоторых исследований я пришел к этому:Список всех дочерних процессов процесса

static void Main(string[] args) 
{ 
    listChildProcesses(0); 
    Console.ReadKey(); 
} 

public static void listChildProcesses(int parentProcessId) 
{ 
    String myQuery = string.Format("select * from win32_process where ParentProcessId={0}", parentProcessId); 
    ObjectQuery objQuery = new ObjectQuery(myQuery); 
    ManagementObjectSearcher objSearcher = new ManagementObjectSearcher(objQuery); 
    ManagementObjectCollection processList = objSearcher.Get(); 

    foreach (ManagementObject item in processList) 
    { 
     try 
     { 
      int processId = Convert.ToInt32(item["ProcessId"].ToString()); 

      Console.WriteLine("processId:{0} name:{1} {2}", 
       item["ProcessId"], 
       item["Name"], 
       item["ParentProcessId"] 
      ); 

      // recursive call 
      if (processId != parentProcessId) 
       listChildProcesses(processId); 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine("Error: " + e); 
     } 
    } 
} 

Я надеялся, что это позволило бы мне, чтобы отобразить все процессы (так как метод начинается с PID = 0, а затем рекурсивно называется на каждом PID нашли оттуда).

Но вот выход я получаю на моем Windows 8 (x86):

processId:0 name:System Idle Process 0 
processId:4 name:System 0 
processId:300 name:smss.exe 4 

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

+0

Возможный дубликат [Как я могу получить список дочерних процессов для данного устройства в C#?] (Http://stackoverflow.com/questions/1073615/how-can-i-get-a-list-of -child-processes-for-a-given-sevice-in-c) – MethodMan

+0

Спасибо, что указали это! Я действительно видел это раньше, пытаясь понять это. Но он не упоминает о проблеме, с которой я столкнулся, почему рекурсивный вызов не перечисляет их всех. – Juicy

ответ

1

Вы не делаете то, что вы думаете ...

таким образом вы просто список детей. И вы получаете доступ к idle на '0'.

попробовать что-то вроде этого, чтобы получить все процессы ...

ManagementClass mngcls = new ManagementClass("Win32_Process"); 
foreach (ManagementObject instance in mngcls.GetInstances()) 
{ 
    Console.Write("ID: " + instance["ProcessId"]); 
} 

... то, что вы делаете.

+0

Спасибо! Это работает как шарм. – Juicy

+0

np, добро пожаловать – NSGaga

+0

Если у вас есть минута, я хотел бы понять, почему мой код не работает? Я действительно хотел сделать это рекурсивно: начать с процесса 0, получить всех детей из 0, перейти к первому ребенку, получить всех детей ... – Juicy

Смежные вопросы