![]() |
Prüfen ob ein Benutzer als Admin angemeldet ist
Hi,
wie man sicherlich an der Überschrift erkennen kann suche ich eine möglichkeit zu überprüfen ob derjenige der mein Programm ausführt als Admin angemeldet ist. In der Suche habe ich nichts brauchbares gefunden. Danke im Voruas :cheers: |
Re: Prüfen ob ein Benutzer als Admin angemeldet ist
schau mal auf "http://www.delphi-fundgrube.de/" und dann gibt es dort das thema:
"Wie man erkennt, ob der aktuelle Windows-Benutzer Administrator-Rechte hat" und dort steht dann folgendes:
Delphi-Quellcode:
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 : Cardinal; psidAdministrators : PSID; x : Integer; begin Result := false; if Win32Platform <> VER_PLATFORM_WIN32_NT then Exit; if not OpenThreadToken(GetCurrentThread, TOKEN_QUERY, TRUE, hAccessToken) then begin if GetLastError <> ERROR_NO_TOKEN then Exit; if not OpenProcessToken(GetCurrentProcess, TOKEN_QUERY, hAccessToken) then Exit; end; try GetTokenInformation(hAccessToken, TokenGroups, nil, 0, dwInfoBufferSize); if GetLastError <> ERROR_INSUFFICIENT_BUFFER then Exit; GetMem(ptgGroups, dwInfoBufferSize); try if not GetTokenInformation(hAccessToken, TokenGroups, ptgGroups, dwInfoBufferSize, dwInfoBufferSize) then Exit; if not AllocateAndInitializeSid(SECURITY_NT_AUTHORITY, 2, SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0, psidAdministrators) then Exit; try for x := 0 to ptgGroups^.GroupCount - 1 do begin if EqualSid(psidAdministrators, ptgGroups^.Groups[x].Sid) then begin Result := true; Break; end; end; finally FreeSid(psidAdministrators); end; finally FreeMem(ptgGroups); end; finally CloseHandle(hAccessToken); end; end; {Michael Winter} |
Re: Prüfen ob ein Benutzer als Admin angemeldet ist
Hi,
Ich habe folgendes Problem damit. Bei NT und W2000 geht er super. Bei XP geht er nur ab und zu und ich bin noch nicht dahinter gekommen warum?? danke |
Re: Prüfen ob ein Benutzer als Admin angemeldet ist
Probier das mal:
Delphi-Quellcode:
////////////////////////////////////////////////////////////////////////////////
// Procedure : GetAdminSid // Author : NBe // Comment : function GetAdminSid: PSID; const // bekannte SIDs ... (WinNT.h) SECURITY_NT_AUTHORITY: TSIDIdentifierAuthority = (Value: (0, 0, 0, 0, 0, 5)); // bekannte RIDs ... (WinNT.h) SECURITY_BUILTIN_DOMAIN_RID: DWORD = $00000020; DOMAIN_ALIAS_RID_ADMINS: DWORD = $00000220; begin Result := nil; AllocateAndInitializeSid(SECURITY_NT_AUTHORITY, 2, SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0, Result); end; //////////////////////////////////////////////////////////////////////////////// // Procedure : IsAdmin // Author : NBe // Comment : function IsAdmin: LongBool; var TokenHandle : THandle; ReturnLength : DWORD; TokenInformation : PTokenGroups; AdminSid : PSID; Loop : Integer; begin Result := False; TokenHandle := 0; if OpenProcessToken(GetCurrentProcess, TOKEN_QUERY, TokenHandle) then try ReturnLength := 0; GetTokenInformation(TokenHandle, TokenGroups, nil, 0, ReturnLength); TokenInformation := GetMemory(ReturnLength); if Assigned(TokenInformation) then try if GetTokenInformation(TokenHandle, TokenGroups, TokenInformation, ReturnLength, ReturnLength) then begin AdminSid := GetAdminSid; for Loop := 0 to TokenInformation^.GroupCount - 1 do begin if EqualSid(TokenInformation^.Groups[Loop].Sid, AdminSid) then begin Result := True; Break; end; end; FreeSid(AdminSid); end; finally FreeMemory(TokenInformation); end; finally CloseHandle(TokenHandle); end; end; |
Re: Prüfen ob ein Benutzer als Admin angemeldet ist
Danke.
das habe ich heute morgen auch wo gefunden. vielen Dank. Das ging unter XP . |
Re: Prüfen ob ein Benutzer als Admin angemeldet ist
Damit kann man leider nur testen, ob der aktuelle Benutzer als Admin angemeldet ist.
Ich bräuchte zusätzlich die Möglichkeit, das für einen anderen Benutzernamen des Rechners zu prüfen. Also sowas wie IsAdmin(Benutzername). Ist das irgendwie machbar? |
Re: Prüfen ob ein Benutzer als Admin angemeldet ist
Guck dir mal meine Unit MpuNTUser.pas an:
![]() Interessant wären auch noch: ![]() ![]() |
Re: Prüfen ob ein Benutzer als Admin angemeldet ist
Hi Luckie,
habe noch eine Frage zu deiner Unit, Wir sind logischerweise in einer Domäne und der username ist Local nicht angelegt. Also heißt er ja Domäne\Username. Wie kann ich nun Prüfen wo der User mitglied ist. Als Username bekomme ich nur den name ohne die Domöne. Gibts ne Funktion oder muss i das aus zb getdomäne+'\'+getusername basteln ? Nochwas zu der Domäne. Es ist ja möglich das ein PC in der Domäne ist, aber man sich nicht in der domäne einloggt sondern nur Local,wie kann i den Logon Server auslesen? Danke. und Frohe Ostern. :lol: :lol: |
Re: Prüfen ob ein Benutzer als Admin angemeldet ist
Die Unit ist generell nur für lokale Benuterkonten ausgelegt.
|
Re: Prüfen ob ein Benutzer als Admin angemeldet ist
Hi,
Vielen Dank. Weißt du trotzdem ob es in der Richtung Domäne etwas gibt ? Ich suche auch nohc was wo man den FQDN auslesen kann? mfg |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:12 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz