我正在处理一个 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;
}
.NET 不提供内置方式。Process.GetProcesses()
它本身用于NtQuerySystemInformation(SystemProcessInformation,)
查询大多数进程属性,它返回的条目有一个代码不使用的 PPID 字段。
所以,要走的路是使用外部技术:
WMI根据holtavolt 的回答
toolhelp32
API,例如从 Process name 获取进程的 ID。它可以对特定或所有进程进行快照。
NtQueryInformationProcess(,ProcessBasicInformation,)
根据Fetching parent process Id from child process。
之前所提NtQuerySystemInformation(SystemProcessInformation,)
其他需要注意的事项:
请记住,您获得信息的任何进程都可以随时结束(关键系统进程除外,但您可能对它们不太感兴趣)
PID 可在 Windows 中重复使用,而无需重置 PPID。要过滤掉可能的“假父母”,请查看StartTime
. 真正的父母会比孩子更早开始,一个假的——晚一点。