如何获得PPID

时间:2012-12-24 10:57:09

标签: c# process

我正在开发一个MS Windows C#Winform项目,我无法获得PPID(父进程ID)。 我找到了很多解决方案,但似乎没有任何解决方案与操作系统和语言一起使用。

我如何获得PPID?

2 个答案:

答案 0 :(得分:1)

如果您可以使用System.Management,这很容易:

    private static int GetParentProcess(int Id)
    {
        int parentPid = 0;
        using (ManagementObject mo = new ManagementObject("win32_process.handle='" + Id.ToString() + "'"))
        {
            mo.Get();
            parentPid = Convert.ToInt32(mo["ParentProcessId"]);
        }
        return parentPid;
    }

否则你可能不得不通过CreateToolhelp32Snapshot like this求助于P / Invoke调用

答案 1 :(得分:0)

.NET没有提供内置方式。 Process.GetProcesses()本身使用NtQuerySystemInformation(SystemProcessInformation,)来查询大多数流程属性,其返回的条目具有代码无法使用的PPID字段。

所以,要走的路是使用外部技术:

    根据{{​​3}}

  • WMI

  • toolhelp32 API ,例如: holtavolt's answer。它可以对特定或所有流程进行快照。

  • 根据{{​​3}}
  • NtQueryInformationProcess(,ProcessBasicInformation,)

  • 上述 NtQuerySystemInformation(SystemProcessInformation,)

其他注意事项:

  • 请记住,您获取信息的任何流程都可以随时结束(例外是关键系统流程,但您可能对它们不感兴趣)

  • 在Windows中重用PID而不重置PPID。要过滤掉可能的假父母",请查看StartTime。真正的父母将比孩子更早开始,假的 - 后来。