Check Process Elevation - Delphi

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
Featured Windows APIs
Created
April 15, 2025
Last Revised
April 15, 2025