如何获取提升权限进程的进程句柄?

3

在 Delphi 10 Seattle 中,我使用以下代码获取进程的句柄:

uses
  Winapi.Windows;

var
  hp: THandle;
begin
    hp := OpenProcess(PROCESS_QUERY_INFORMATION, False, ProcessID);

这适用于所有进程,包括32位和64位。

然而,在提升的进程中不起作用,它会返回0

那么如何获取提升进程的进程句柄?


不确定是否重要,但我还是问一下:您的应用程序是否正在以提升的权限运行? - Tom Brunberg
你是指我运行这段代码的应用程序吗?不是。但即使我以管理员身份运行我的应用程序,它也会返回零。 - user1580348
好的。那么,GetLastError返回什么?请参考MSDN文档中有关返回值的说明:如果函数失败,则返回值为NULL。要获取扩展错误信息,请调用GetLastError。 - Tom Brunberg
1
我收到了“访问被拒绝”的错误提示。 - user1580348
1个回答

4
简单的答案是你无法做到这一点。系统拒绝了你的请求。当你调用GetLastError时,返回的值将是ERROR_ACCESS_DENIED。你的进程没有足够的权限来获取已提升的进程的PROCESS_QUERY_INFORMATION
如果你的进程被提升,当你调用OpenProcess时,就会成功。
另外,有可能你可以使用低于PROCESS_QUERY_INFORMATION的权限来完成任务。由于我们不知道你要使用这个进程句柄做什么,所以很难判断。根据你的评论,你将传递GetProcessImageFileName句柄,它被文档记录为需要PROCESS_QUERY_INFORMATIONPROCESS_QUERY_LIMITED_INFORMATION

我需要进程句柄来使用GetProcessImageFileName获取进程文件路径。那么有没有其他方法可以获取提升后的进程的文件路径呢? - user1580348
如果您想要完整的文件路径,则需要以提升的权限运行您的进程。这个问题会有所帮助:https://dev59.com/ZGox5IYBdhLWcg3whUum - David Heffernan
太棒了!当我使用PROCESS_QUERY_LIMITED_INFORMATION($1000)而不是PROCESS_QUERY_INFORMATION时,它可以工作!然后我可以使用GetProcessImageFileName获取提升进程的完整路径! - user1580348
这有点令人惊讶,考虑到那个问题中的答案和评论。无论如何,那是我回答的最后一段。 - David Heffernan
顺便提一下,PROCESS_QUERY_LIMITED_INFORMATIONWinapi.Windows 或 RTL 的任何其他地方似乎都没有定义。但是,值 $1000 似乎是正确的。 - user1580348
是的,RTL 头文件翻译滞后。该值已在 MSDN 上记录:https://msdn.microsoft.com/zh-cn/library/windows/desktop/ms684880(v=vs.85).aspx - David Heffernan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接