Herausfinden ob der User Adminrechte hat



  • Hallo,

    ich suche nach einer möglichkeit herauszufinden ob der eingeloggte User Adminrechte hat.
    Was ich bis jetzt gefunden habe ist nicht so toll...

    Ich hol mir mit NetUserGetLocalGroups die Gruppen zu denen der User gehört und sich mir die Admin Gruppe raus... nur bei einem Polnischen XP oder 2000 dürfte das nicht ganz so klappen...

    Hat jemand eine Idee?



  • Und was hilft Dir das??? Mit Vista und UAC wird alles noch viel schlimmer... da mag der Benutzer zwar Admin sein, hat aber trotzdem keine Adminrechte...



  • Lassen wir mal Vista und UAC aussen vor. Dann kannst du über das Prozesstoken prüfen, ob der Benutzer Admininstratorenrechte hat:

    //////////////////////////////////////////////////////////////////////////////// 
    // Procedure : HasAdminPrivileges 
    // Author    : NBe 
    // Comment   : 
    function HasAdminPrivileges: LongBool; 
    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; 
      SE_GROUP_ENABLED: DWORD = $00000004; 
    
    var 
      TokenHandle       : THandle; 
      ReturnLength      : DWORD; 
      TokenInformation  : PTokenGroups; 
      AdminSid          : PSID; 
      Loop              : Integer; 
    
    begin 
      Result := False; 
      TokenHandle := 0; 
      TokenInformation := nil; 
      AdminSid := nil; 
      if OpenProcessToken(GetCurrentProcess, TOKEN_QUERY, TokenHandle) then 
      try 
        ReturnLength := 0; 
        GetTokenInformation(TokenHandle, TokenGroups, nil, 0, ReturnLength); 
        TokenInformation := GetMemory(ReturnLength); 
        if Assigned(TokenInformation) and GetTokenInformation(TokenHandle, 
          TokenGroups, TokenInformation, ReturnLength, ReturnLength) then 
        begin 
          AllocateAndInitializeSid(SECURITY_NT_AUTHORITY, 2, 
            SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS, 
            0, 0, 0, 0, 0, 0, AdminSid); 
          for Loop := 0 to TokenInformation^.GroupCount - 1 do 
          begin 
            if (SE_GROUP_ENABLED = (TokenInformation^.Groups[Loop].Attributes and SE_GROUP_ENABLED)) 
              and EqualSid(TokenInformation^.Groups[Loop].Sid, AdminSid) then 
            begin 
              Result := True; 
              Break; 
            end; 
          end; 
          FreeSid(AdminSid); 
          AdminSid := nil; 
        end; 
      finally 
        FreeSid(AdminSid); 
        FreeMemory(TokenInformation); 
        CloseHandle(TokenHandle); 
      end; 
    end;
    

    Ist zwar Delphi Code, aber die API-Funktionen sind die selben.



  • Danke!


  • Mod

    http://win32.mvps.org/security/is_admin.html

    Aber wie gesagt! Unter Vista wird hier bei normalen Start und Trustinfo Manifest immer FALSE retunriert!


Anmelden zum Antworten