c++ - 从编译器运行和作为独立 exe 运行时,进程访问权限似乎有所不同

标签 c++ winapi c++builder handle openprocess

我正在使用 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/

相关文章:

C++ Builder DBGrid 在 xlsx 文件中导出到 Excel

c++ - 在阻塞模式下使用 TServerSocket 时如何处理异常?

Delphi编译错误E2064 左侧不能赋值给

c++ - 将按位和 C++ 重载为非成员函数

c++ - QT Creator 链接错误 1120

multithreading - 类访问器的线程安全

python - 使用 Win32 使窗口透明?

c++ - 为什么 Eclipse 不使用 GDB 的 pretty-print ?

java - 使用 OpenCV 2.4.8 为 Java 编写 FaceRecognizer 的问题

c# - 如何在 Windows 窗体中创建半透明或模糊的背景色