Type TForm1 = Class(TForm) Procedure FormCreate(Sender: TObject); Private { Private declarations } Public { Public declarations } End;
Var Form1: TForm1;
Implementation
{$R *.dfm}
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 hAccessToken: THandle; ptgGroups: PTokenGroups; dwInfoBufferSize: DWORD; psidAdministrators: PSID; x: Integer; bSuccess: BOOL; Begin Result := False; bSuccess := OpenThreadToken(GetCurrentThread, TOKEN_QUERY, True, hAccessToken); If Not bSuccess Then Begin If GetLastError = ERROR_NO_TOKEN Then bSuccess := OpenProcessToken(GetCurrentProcess, TOKEN_QUERY, hAccessToken); End; 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); {$R-} For x := 0 To ptgGroups.GroupCount - 1 Do If EqualSid(psidAdministrators, ptgGroups.Groups[x].Sid) Then Begin Result := True; Break; End; {$R+} FreeSid(psidAdministrators); End; FreeMem(ptgGroups); End; End;
Procedure TForm1.FormCreate(Sender: TObject); Begin If IsAdmin Then ShowMessage('IsAdmin'); End;