我正在使用 WINAPI 来编写我正在编写的程序。该程序具有另一个进程的 ProcessId,并且需要获取它的句柄(以便稍后能够终止它,并且还可以使用 WaitForSingleObject 定期检查该进程是否处于事件状态并进行响应)。当我编译我的程序时(在 Embarcadero RAD Studio 2010 C++ Builder 中),它运行良好;该程序似乎已成功获取句柄并且通常按预期工作。但是,如果我从文件夹中将其作为独立的 exe 启动,则似乎无法正确获取句柄。我通过比较检查了它(Companion是一个HANDLE,Companion_PID是一个DWORD):
GetProcessId(Companion)
和
Companion_PID
前面几行中,Companion 是从以下代码中的 Companion_PID 中获取的:
Companion = OpenProcess(PROCESS_ALL_ACCESS, FALSE, Companion_PID);
“GetProcessId(Companion)”结果为 0(这是一个好兆头,表明 OpenProcess 未能返回正确的句柄。
令我感到非常惊讶的是,这段代码在从编译器运行时和作为独立的 exe 运行时的工作方式有所不同;我假设在第一种情况下,安全属性是从编译器本身继承的,但我想从在 WINAPI 和安全属性方面更有经验的人那里听到对这种行为的更好的解释。
小更新:是的,就像我想的那样,OpenProcess 会导致错误 0x5 = ERROR_ACCESS_DENIED。
最佳答案
来自OpenProcess function page在 MSDN 中:
To open a handle to another local process and obtain full access rights, you must enable the SeDebugPrivilege privilege.
我相信您的 IDE(您从IDE运行应用程序,而不是编译器)默认启用了SeDebugPrivilege
。当您运行应用程序时,您的 IDE(进程)将创建一个新进程,该进程继承 IDE 的权限,包括 SeDebugPrivilege
,这就是函数从 IDE 运行时成功的原因。
您的应用程序应检查是否启用了 SeDebugPrivilege
,如果没有启用,enable it .
关于c++ - 从编译器运行和作为独立 exe 运行时,进程访问权限似乎有所不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9213982/