A bejelentkezett felhasználó rendszergazda?

A Windows két alapvető felhasználói fiók típust különböztet meg: "Rendszergazda" és "Korlátozott". A rendszergazda jogosultságú felhasználók módosíthatják a számítógép beállításait: programokat telepíthetnek, rendszer szintű változtatásokat hajthatnak végre, stb.

Ha egy Delphi programban ellenőrizni kell, hogy a belépett felhasználó rendszergazdaként van bejelentkezve, vagy tagja a Rendszergazdák csoportnak, akkor azt a következő függvénnyel lehet egyszerűen megtenni:

function IsWindowsAdmin: 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;
    g: Integer;
    bSuccess: BOOL;
begin
  Result:=False;
  bSuccess:=OpenThreadToken(GetCurrentThread, TOKEN_QUERY, True, hAccessToken);

  if (not bSuccess) and (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);
      for g:= 0 to ptgGroups.GroupCount - 1 do if EqualSid(psidAdministrators, ptgGroups.Groups[g].Sid) then begin
          Result:= True;
          Break;
      end;
      FreeSid(psidAdministrators);
    end;
    FreeMem(ptgGroups);
  end;
end;

Használat (pl.):

  if IsWindowsAdmin then showmessage('admin') else showmessage('nem admin');
Címkék: