我有一个应用程序打开另一个非系统 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_INFORMATION
和 PROCESS_VM_READ
如果单独使用,对于存在上述问题的用户,OpenProcess() 将失败。我也相信 PROCESS_QUERY_INFORMATION |
,因此尝试使用较少的访问权限不是一种选择。EnumPorcessModulesEx
需要 PROCESS_VM_READ
但是,当应用程序以“以管理员身份运行”执行时,这个问题就不再出现了。 OpenProcess() 工作正常,应用程序也按预期工作。
问题
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, processid);
适用于大多数用户,但返回错误代码 5,应用程序的某些用户拒绝访问。
部分解决方案
...是以管理员身份运行应用程序。然后 OpenProcess() 运行良好。
问题
为什么在没有“以管理员身份运行”的情况下执行应用程序时某些用户的访问被拒绝?有没有其他方法可以在不以管理员身份执行我的应用程序的情况下获取另一个进程的模块列表?
最佳答案
您是否检查过 AdjustTokenPrivileges API?
默认情况下,即使进程正在提升运行(作为管理员),一些特权仍然在进程方面被禁用。要启用它们,我们需要调用 OpenProcessToken、LookupPrivilegeValue 和 AdjustTokenPrivileges API。
根据 this page ,需要 SeDebugPrivilege(宏 SE_DEBUG_NAME)才能执行 ReadProcessMemory(这需要 PROCESS_VM_READ 访问权限)。
关于c++ - 某些用户的 OpenProcess 访问被拒绝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35732495/