列出进程的所有子进程
本文关键字:子进程 进程 | 更新日期: 2023-09-27 18:06:03
我试图列出给定进程的所有子进程(给定它的进程ID)。经过一番研究,我得出了这样的结论:
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
它停在那里。我希望它对System的每一个子节点,然后是这些子节点的每一个子节点继续执行。
你没有做你想做的事…
这样你只是列出了孩子。你通过0来访问空闲的那个。
尝试像这样得到所有进程…
ManagementClass mngcls = new ManagementClass("Win32_Process");
foreach (ManagementObject instance in mngcls.GetInstances())
{
Console.Write("ID: " + instance["ProcessId"]);
}
…