c++ - 某些用户的 OpenProcess 访问被拒绝

标签 c++ windows

我有一个应用程序打开另一个非系统 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() 将失败。我也相信 PROCESS_QUERY_INFORMATION | EnumPorcessModulesEx 需要 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。

根据 this page ,需要 SeDebugPrivilege(宏 SE_DEBUG_NAME)才能执行 ReadProcessMemory(这需要 PROCESS_VM_READ 访问权限)。

关于c++ - 某些用户的 OpenProcess 访问被拒绝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35732495/

相关文章:

c++ - fstream给我错误的文件大小

windows - bat文件是否知道它的名字并且它可以删除自己

c++ - Linux 到 Windows C++ 端口

c++ - 变量作为全局范围内的结构 - 如何定义?

c++ - 为什么在 XAudio2 的 DirectX 版本中调用 OnCriticalError?

Python 2.7.7 包安装给出 Visual C++ cl.exe 错误 : command failed with exit status 2

c# - 改变滚动条的宽度

C++ 部分模板特化 : Member Functions

c++ - 如何使用自动添加的 Qt 元素

windows - 替换 Windows 文件名中的 URL 字符编码(批量)