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

How to get the process handle of an elevated process?

对于 Delphi 10 Seattle,我使用此代码获取进程句柄:

uses
  Winapi.Windows;

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

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

不幸的是,它不适用于 ELEVATED PROCESSES,它返回 0.

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

简单的回答是你不能这样做。系统说不行。当您调用 GetLastError 时,返回的值将为 ERROR_ACCESS_DENIED。您的进程没有足够的权限获得 PROCESS_QUERY_INFORMATION 已提升的进程。

如果您在进程提升时调用 OpenProcess,您将会成功。

或者,您可能能够以低于 PROCESS_QUERY_INFORMATION 的权限获得通过。这很难判断,因为我们不知道您要对这个进程句柄做什么。根据您的评论,您将根据要求 PROCESS_QUERY_INFORMATIONPROCESS_QUERY_LIMITED_INFORMATION.

传递句柄 GetProcessImageFileName,即 documented