如果OpenProcess()因ACCESS_DENIED失败,如何从pid获取进程文件名?

hai*_*img 13 windows security winapi

我正试图从它的pid中获取进程名称.用户以管理员身份运行,启用UAC,而不是提升.

有些系统进程services.exe的安全设置是以OpenProcess(PROCESS_QUERY_INFORMATION ...失败的方式设置的ERROR_ACCESS_DENIED.与PROCESS_QUERY_LIMITED_INFORMATION访问权限相同的结果.但是,我可以看到Process Explorer 至少可以列出所有这些进程及其pid和文件名(当作为非提升的Administrator运行时).

我的问题是,如果非提升的管理员不能遵循OpenProcess()+ GetProcessImageFileName()的常规路由,我怎么能这样做(从pid获取文件名)?

Jim*_*des 11

您是否尝试过使用CreateToolhelp32Snapshot()检索的句柄的Process32First()和Process32Next()?它没有给你完整的路径,但至少应该让你获得文件名.


Jar*_*Par 5

你试过PROCESS_QUERY_LIMITED_INFORMATION吗?它请求较低级别的访问权限,至少可以提供可执行文件的名称。它允许您致电QueryFullProcessImageName提供您正在寻找的信息

  • 使用 PROCESS_QUERY_LIMITED_INFORMATION 打开的系统进程的句柄将不允许您调用 QueryFullProcessImageName。它失败并显示错误 31“连接到系统的设备无法正常工作”。即使我的程序以完全管理员权限运行(没有 SE_DEBUG 权限)。 (2认同)

pez*_*ode 5

您无法打开系统进程(更准确地说,是在另一个帐户下运行的进程 - 在本例中为用户SYSTEM),而无需SE_DEBUG为您的进程启用权限.如果您以管理员身份运行,则可以轻松设置权限:http: //support.microsoft.com/kb/131065/en-us

  • 我在我的代码中尝试过......但是,请看这里:http://msdn.microsoft.com/en-us/library/bb530410.aspx。它说 SeDebugPrivilege 从受限令牌中删除(对于管理员)。 (2认同)