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;
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');
Beküldte falu - 2010, április 6 - 13:45
- falu blogja
- A hozzászóláshoz be kell jelentkezni