某些用户的 OpenProcess 访问被拒绝

OpenProcess Access is denied for some users

本文关键字:访问 拒绝 OpenProcess 用户      更新时间:2023-10-16

我有一个应用程序打开另一个非系统 32 位进程,并尝试获取其加载模块的列表,其中包含每个模块的EnumProcessModulesEx和路径GetModuleFileNameEx。它在我的开发环境 (Windows 10) 和许多测试过该应用程序的用户中运行良好。但是,对于某些用户(两个用户,Windows 8.1 和 Windows 10),OpenProcess() 函数失败,访问被拒绝(错误代码 5)。

我正在用PROCESS_QUERY_INFORMATION | PROCESS_VM_READ打开这个过程.使用 PROCESS_QUERY_LIMITED_INFORMATION 打开进程有效,但随后EnumProcessModulesEx将失败。根据我的测试,PROCESS_QUERY_INFORMATIONPROCESS_VM_READ 如果单独使用,对于有上述问题的用户来说,OpenProcess() 都会失败。另外,我相信EnumPorcessModulesEx需要PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,因此尝试使用较少的访问权限不是一种选择。

但是,当使用"以管理员身份运行"执行应用程序时,此问题不再发生。OpenProcess() 工作,应用程序也按预期工作。

问题所在

hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, processid);

适用于大多数用户,但返回错误代码 5,应用程序的某些用户访问被拒绝。

部分解决方案

。是以管理员身份运行应用程序。OpenProcess() 则运行良好。

问题

为什么在没有"以管理员身份运行"的情况下执行应用程序时,某些用户的访问被拒绝?有没有另一种方法可以在不以管理员身份执行我的应用程序的情况下获取另一个进程的模块列表?

您是否检查过 AdjustTokenPrivileges API?

https://www.experts-exchange.com/questions/10125867/ExitWindowsEx-AdjustTokenPrivileges-to-SE-SHUTDOWN-NAME.html

默认情况下,即使进程以提升方式运行(以管理员身份),某些权限仍处于进程禁用状态。要启用它们,我们需要调用 OpenProcessTokenLookupPrivilegeValueAdjustTokenPrivileges API。

根据此页面,需要SeDebugPrivilege(宏SE_DEBUG_NAME)来执行ReadProcessMemory(需要PROCESS_VM_READ访问权限)。