我有一个应用程序打开另一个非系统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 | PROCESS_VM_READ
需要EnumPorcessModulesEx
,因此尝试使用较少的访问权限不是一种选择。
但是,当使用“以管理员身份运行”执行应用程序时,不再出现此问题。 OpenProcess()工作,应用程序也按预期工作。
问题
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, processid);
适用于大多数用户,但返回错误代码5,拒绝该应用程序的某些用户访问。
部分解决方案
...是以管理员身份运行应用程序。然后OpenProcess()运行良好。
问题
为什么在没有“以管理员身份运行”的情况下执行应用程序时某些用户的访问被拒绝?有没有另一种方法来获取另一个进程的模块列表而不以管理员身份执行我的应用程序?
答案 0 :(得分:0)
您是否已检查 AdjustTokenPrivileges API?
默认情况下,即使进程正在提升运行状态(以管理员身份),某些特权仍会逐个进程禁用。要启用它们,我们需要调用 OpenProcessToken , LookupPrivilegeValue 和 AdjustTokenPrivileges API。
根据this page,需要SeDebugPrivilege(宏 SE_DEBUG_NAME )来执行ReadProcessMemory(这需要PROCESS_VM_READ访问)。