Auf Administratorrechte prüfen |
|
| System | Win9x, WinNT, Win2000, WinXP, Vista, Win7 |
|---|---|
| Ab Delphi-Version | Delphi 1 |
| Letzte Änderung | 28.09.2010 |
Für bestimmte Operationen innerhalb eines Programms können besondere Rechte nötig sein, die womöglich nur dem Administrator zustehen oder die nur ein Administrator durchführen sollte. Folgende Funktion prüft, ob der Benutzer als Administrator eingeloggt ist. Sie gibt in diesem Falle True zurück:
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:=False;
ptgGroups:=nil;
psidAdministrators:=nil;
try
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);
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+}
end;
end;
finally
if bSuccess then
CloseHandle(hAccessToken);
if Assigned(ptgGroups) then
FreeMem(ptgGroups);
if Assigned(psidAdministrators) then
FreeSid(psidAdministrators);
end;
end;
Alternativ kann auch die Funktion "IsAdministrator" aus der JCL, die sich in der Unit JCLSecurity befindet, verwendet werden.