Check Process Elevation - Delphi

DarkCoderSc personal avatar
DarkCoderSc

Jean-Pierre LESUEUR

uses
  System.SysUtils, Winapi.Windows;

// ...

type
  TElevatedStatus = (
    esUnknown,
    esLimited,
    esElevated
  );

// ...

const PROCESS_QUERY_LIMITED_INFORMATION = $1000;

// ...

function IsProcessElevated(AProcessHandle : THandle = 0) : TElevatedStatus;
begin
  result := esUnknown;
  ///

  if AProcessHandle = 0 then begin
    AProcessHandle := GetCurrentProcess();
    if AProcessHandle = 0 then
      raise EWindowsException.Create('GetCurrentProcess');
  end;

  var AToken : THandle;
  if not OpenProcessToken(AProcessHandle, TOKEN_QUERY, AToken) then
    raise EWindowsException.Create('OpenProcessToken');

  var ATokenInfo : TTokenElevation;
  var AReturnLength : DWORD;
  if not GetTokenInformation(AToken, TokenElevation, @ATokenInfo, SizeOf(TTokenElevation), AReturnLength) then
    raise EWindowsException.Create('GetTokenInformation');

  ///
  if ATokenInfo.TokenIsElevated <> 0 then
    result := esElevated
  else
    result := esLimited;
end;

function IsProcessElevatedById(const AProcessId : Cardinal) : TElevatedStatus;
begin
  var hProcess := OpenProcess(
    PROCESS_QUERY_LIMITED_INFORMATION,
    False,
    AProcessId
  );
  if hProcess = 0 then
    raise EWindowsException.Create('OpenProcess');
  try
    result := IsProcessElevated(hProcess);
  finally
    CloseHandle(hProcess);
  end;
end;

function ElevatedStatusToString(const AElevatedStatus : TElevatedStatus) : String;
begin
  case AElevatedStatus of
    esLimited  : result := 'Limited';
    esElevated : result := 'Elevated';
    else
      result := 'Unknown';
  end;
end;

// ...

try
  var ATargetProcessId := GetCurrentProcessId(); // Or another process id

  WriteLn(Format('Elevation status for process_id:[%d] => %s', [
    ATargetProcessId,
    ElevatedStatusToString(IsProcessElevatedById(ATargetProcessId))
  ]));
except
  on E: Exception do
    Writeln(E.ClassName, ': ', E.Message);
end;

Implemented By Technique


Created

April 15, 2025

Last Revised

April 15, 2025