Announcement

Collapse
No announcement yet.

Prüfen der Benutzerrechte unter NT4

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Prüfen der Benutzerrechte unter NT4

    Hallo,

    kann mir jemand sagen, wie ich feststellen kann, ob es sich bei dem angemeldeten Benutzer um einen Admin Account handelt ?

  • #2
    Wenn das Programm nicht nur unter MT läuft, dann muss die Prüfung in einer eigenen DLL erfolgen,<br>
    die nur geladen wird, wenn es sich um NT handelt.
    <br>
    <PRE>
    uses
    AccCtrl;

    function AlsAdminEingeloggt : boolean;
    var
    psidAdmin: Pointer;
    Token: THandle;
    Count: DWORD;
    TokenInfo: PTokenGroups;
    HaveToken: Boolean;
    I: Integer;
    begin
    Result := False;
    psidAdmin := nil;
    TokenInfo := nil;
    HaveToken := False;
    try
    HaveToken := OpenThreadToken(GetCurrentThread, TOKEN_QUERY, True, Token);
    if (not HaveToken) and (GetLastError = ERROR_NO_TOKEN) then
    HaveToken := OpenProcessToken(GetCurrentProcess, TOKEN_QUERY, Token);
    if HaveToken then begin
    Win32Check(AllocateAndInitializeSid(SECURITY_NT_AU THORITY, 2,
    SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0, psidAdmin));
    if GetTokenInformation(Token, TokenGroups, nil, 0, Count) or
    (GetLastError <> ERROR_INSUFFICIENT_BUFFER) then RaiseLastWin32Error;
    TokenInfo := PTokenGroups(AllocMem(Count));
    Win32Check(GetTokenInformation(Token, TokenGroups, TokenInfo, Count, Count));
    for I := 0 to TokenInfo^.GroupCount - 1 do begin
    {$R-} // Groups is an array [0..0] of TSIDAndAttributes, ignore ERangeError
    Result := EqualSid(psidAdmin, TokenInfo^.Groups[I].Sid);
    {$R+}
    if Result then Break;
    end;
    end;
    finally
    if TokenInfo <> nil then FreeMem(TokenInfo);
    if HaveToken then CloseHandle(Token);
    if psidAdmin <> nil then FreeSid(psidAdmin);
    end;
    end;
    </PRE&gt

    Comment

    Working...
    X