我正在尝试枚举所有正在运行的进程EXE名称,并且在XP Guest帐户上尝试此操作时发现了绊倒。我可以使用EnumProcesses枚举所有进程ID,但是当我使用PROCESS_QUERY_INFORMATION或PROCESS_VM_READ尝试OpenProcess时,该函数将失败。
我在XP Guest帐户下启动了Process Explorer,它能够枚举所有进程名称(尽管如此,来自Guest用户空间之外的进程的大多数其他信息都不存在)。
所以,我的问题是,我如何复制Process Explorer魔术来获取在Guest帐户用户空间之外运行的服务和其他进程的进程名称?
答案 0 :(得分:3)
我认为Process Explorer使用带有参数SystemProcessInformation
的{{3}}来获取进程列表。有关代码示例,请参阅NtQuerySystemInformation。此外,函数my old answer将用于获取其他信息。
顺便说一句,如果您在NtQueryInformationProcess下启动Process Explorer(菜单“Profile”/“Start Profiling”或 F7 ),那么您将看到Process Explorer真正使用的所有函数NTDLL.DLL。您可以看到真正使用Dependency Walker和NtQuerySystemInformation。
答案 1 :(得分:1)
NtQuerySystemInformation几乎没有记录,“在未来版本的Windows中可能会被更改或不可用”CreateToolhelp32Snapshot已完整记录,应该为您提供图像名称。
答案 2 :(得分:0)
当进程启动时,会为其分配一组基本访问权限。某些API调用需要其他权限才能成功完成。具体而言,OpenProcess
在某些情况下可能需要SeDebugPrivilege
权限。您可以在此处找到有关如何修改流程令牌以启用其他权限的示例:Enabling and Disabling Privileges in C++。
答案 3 :(得分:0)
GetProcessImageFileName
仅需要从Vista开始处理PROCESS_QUERY_LIMITED_INFORMATION,但在XP上它确实需要PROCESS_QUERY_INFORMATION。
你不应该,也绝对不能从访客帐户中获取PROCESS_VM_READ。