Code:
function IsAdmin:Boolean;
const
SECURITY_NT_AUTHORITY: TSIDIdentifierAuthority = (Value: (0,0,0,0,0,5));
SECURITY_BUILTIN_DOMAIN_RID = $00000020;
DOMAIN_ALIAS_RID_ADMINS = $00000220;
var
IsUserAnAdmin: function(): BOOL; stdcall;
hAccessToken: THandle;
ptgGroups: PTokenGroups;
dwInfoBufferSize: DWORD;
psidAdministrators: PSID;
xi: Integer;
bSuccess: BOOL;
hMod: Thandle;
begin
Result:=True;
if IsWin9x then Exit;
Result:=False;
hAccessToken:=0;
hMod:=GetModuleHandle('shell32.dll');
if hMod=0 then hMod:=LoadLibrary('shell32.dll');
IsUserAnAdmin:=GetProcAddress(hMod,'IsUserAnAdmin');
if not Assigned(IsUserAnAdmin) then begin
bSuccess:=OpenThreadToken(GetCurrentThread,TOKEN_QUERY,True,hAccessToken);
if not bSuccess then if GetLastError=ERROR_NO_TOKEN then
bSuccess:=OpenProcessToken(GetCurrentProcess,TOKEN_QUERY,hAccessToken);
if bSuccess then begin
GetMem(ptgGroups,1024);
bSuccess:=GetTokenInformation(hAccessToken,TokenGroups,ptgGroups,1024,dwInfoBufferSize);
CloseHandle(hAccessToken);
if bSuccess then begin
AllocateAndInitializeSid(SECURITY_NT_AUTHORITY,2,SECURITY_BUILTIN_DOMAIN_RID,DOMAIN_ALIAS_RID_ADMINS,0,0,0,0,0,0,psidAdministrators);
if ptgGroups.GroupCount>0 then
for xi:=0 to ptgGroups.GroupCount-1 do
if EqualSid(psidAdministrators,ptgGroups.Groups[xi].Sid) then begin
Result:=True;
Break;
end;
FreeSid(psidAdministrators);
end;
FreeMem(ptgGroups);
end;
end
else Result:=IsUserAnAdmin();
end;
Example of use in formCreate...FormShow or timer
Code:
if IsAdmin then {ADM} else
Label.Caption := 'Execute como Administrador';