Process Explorer如何枚举来自XP来宾帐户的所有进程名称?

我试图枚举所有正在运行的进程EXE名称,并试图在XP来宾帐户上尝试此操作时偶然发现。 我能够使用EnumProcesses枚举所有进程ID,但是当我尝试使用PROCESS_QUERY_INFORMATION或PROCESS_VM_READ的OpenProcess时,该函数失败。

我启动了XP Guest帐户下的Process Explorer,并且能够枚举所有进程名称(尽pipe如预料的那样,来自Guest用户空间之外的进程的大部分其他信息不存在)。

所以,我的问题是,我怎样才能复制Process Explorer魔术,以获得在Guest帐户用户空间之外运行的服务和其他进程的进程名称?

我想,Process Explorer使用带有参数SystemProcessInformation NtQuerySystemInformation来获取进程列表。 代码示例请参阅我的旧回答 。 另外,函数NtQueryInformationProcess将被用来获得额外的信息。

顺便说一下,如果启动Dependency Walker下的Process Explorer(菜单“Profile”/“Start Profiling”或F7 ),那么您将看到Process Explorer从NTDLL.DLL真正使用的所有函数。 你可以看到NtQuerySystemInformation和NtQueryInformationProcess将被真正的使用。

NtQuerySystemInformation只有几乎没有记录和“可能会被更改或在未来版本的Windows中”不可用CreateToolhelp32Snapshot已完整记录,应该给你的图像名称。

当一个进程启动时,它被分配了一组基本的访问权限。 某些API调用需要额外的权限才能成功完成。 具体而言,在某些情况下, OpenProcess可能需要SeDebugPrivilege特权。 您可以找到如何修改流程令牌以在此处启用其他特权的示例: 在C ++中启用和禁用特权 。

GetProcessImageFileName只需要从Vista开始的PROCESS_QUERY_LIMITED_INFORMATION,但在XP上它需要PROCESS_QUERY_INFORMATION。

你不应该需要,绝对不应该能够从一个来宾帐户,PROCESS_VM_READ。