Find all child processes of my own .NET process / find out if a given process is a child of my own?

后端 未结 2 1079
离开以前
离开以前 2020-11-27 22:30

I have a .NET class library that spins up a secondary process which is kept running until I dispose of the object.

Due to some occurances of the program lingering in

相关标签:
2条回答
  • 2020-11-27 22:54

    Although the answer of mtijn is probably the closest you can get, the real answer is: you can't.

    Windows does not maintain a real process tree where processes are re-structured when a process on an intermediate level dies. However, Windows does remember the parent process ID.

    The problematic case is the following:

    Original process structure:

    YourApp.exe
    - SubApp.exe
      - Second.exe
    

    If now SubApp.exe terminates, the parent process ID of Second.exe will not be updated. The new result is

    YourApp.exe
    Second.exe
    

    You can verify this using SysInternals Process Explorer. It is able to show the processes as a tree. Start CMD, then type start cmd. Into the new window, type start cmd again. You'll have 3 windows open. Now terminate the middle one.

    0 讨论(0)
  • 2020-11-27 22:59

    as it happens I have a bit of C#/WMI code lying around that kills all processes spawned by a specified process id, recursively. the killing is obviously not what you want, but the finding of child processes seems to be what you're interested in. I hope this is helpful:

        private static void KillAllProcessesSpawnedBy(UInt32 parentProcessId)
        {
            logger.Debug("Finding processes spawned by process with Id [" + parentProcessId + "]");
    
            // NOTE: Process Ids are reused!
            ManagementObjectSearcher searcher = new ManagementObjectSearcher(
                "SELECT * " +
                "FROM Win32_Process " +
                "WHERE ParentProcessId=" + parentProcessId);
            ManagementObjectCollection collection = searcher.Get();
            if (collection.Count > 0)
            {
                logger.Debug("Killing [" + collection.Count + "] processes spawned by process with Id [" + parentProcessId + "]");
                foreach (var item in collection)
                {
                    UInt32 childProcessId = (UInt32)item["ProcessId"];
                    if ((int)childProcessId != Process.GetCurrentProcess().Id)
                    {
                        KillAllProcessesSpawnedBy(childProcessId);
    
                        Process childProcess = Process.GetProcessById((int)childProcessId);
                        logger.Debug("Killing child process [" + childProcess.ProcessName + "] with Id [" + childProcessId + "]");
                        childProcess.Kill();
                    }
                }
            }
        }
    
    0 讨论(0)
提交回复
热议问题