【发布时间】:2012-12-24 10:57:08
【问题描述】:
我正在处理一个 MS Windows C# Winform 项目,但我无法获得 PPID(父进程 ID)。 我找到了许多解决方案,但似乎没有一个适用于上述操作系统和语言。
如何获得 PPID?
【问题讨论】:
我正在处理一个 MS Windows C# Winform 项目,但我无法获得 PPID(父进程 ID)。 我找到了许多解决方案,但似乎没有一个适用于上述操作系统和语言。
如何获得 PPID?
【问题讨论】:
如果你可以使用 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 调用
【讨论】:
.NET 不提供内置方式。 Process.GetProcesses() 本身使用NtQuerySystemInformation(SystemProcessInformation,) 来查询大多数进程属性,其返回的条目有一个代码不使用的 PPID 字段。
所以,要走的路是使用外部技术:
WMI 根据holtavolt's answer
toolhelp32 API 根据例如Getting The ID of a process from Process name 。它可以对特定或所有进程进行快照。
NtQueryInformationProcess(,ProcessBasicInformation,) 根据Fetching parent process Id from child process 。
前面提到的NtQuerySystemInformation(SystemProcessInformation,)
其他注意事项:
请记住,您获得信息的任何进程都可能随时结束(关键系统进程除外,但您可能对它们不太感兴趣)
在 Windows 中重复使用 PID 而无需重置 PPID。要过滤掉可能的“假父母”,请查看StartTime。真正的父母会比孩子更早开始,假的会晚。
【讨论】: