IsUserMemberOfAdminGroup



  • Hallo,

    ich prüfe in meiner Desktop App unter Windows (>= Windows XP SP2) über SSPI, ob ein angegebener User auf dem lokalen Rechner existiert (Name/Passwort abfrage).
    Das funktioniert soweit.

    Nun möchte ich aber prüfen, ob diser User ein Miglied der lokalen/domain Admin-Gruppe ist. Das gelingt mir irgendwie nicht. Habe schon eine Menge ausprobiert.
    GetTokenInformation, CheckTokenMembership, etc.

    Ich finde hier einfach nichts, was funktioniert. Mein eingegebener User ist ein lokaler User und der lokalen Admingruppe zugeordnet.

    Hat jemand eine Lösung oder Link bzw. kennt jemand das Problem?


  • Mod

    Willst Du wissen ob der User aktuell den Token für die lokale Admin Gruppe hat, oder es nur grundsätzlich wissen.

    UAC verbirgt den Token vor Dir, solange Du Dein Programm nicht als Admin startest.

    EDIT:
    Schau Dir mal den Code an:
    http://code.msdn.microsoft.com/windowsdesktop/CppUACSelfElevation-981c0160



  • Ich will wissen, ob er den Token hat.
    Alle Beispiele, die prüfen, ob ein Token die lokale Admin-Gruppe beinhaltet, ermiteln den Token über OpenProcessToken.
    Ich erhalte den Token aber über QuerySecurityContextToken, s. MSDN SSPI Beispiel:
    http://support.microsoft.com/kb/180548/en-us
    Auch den Token vorher zu impersonaten bringt nicht das gewünschte Ergebnis.


  • Mod

    Siehe Code Beispiel. Der erste Test müsste es dann sein.



  • Danke für den Link!

    Das hatte ich probiert => negativ
    Fehler: 1312 (ERROR_NO_SUCH_LOGON_SESSION)
    Ursache: User Account Control ist nicht aktiviert ...

    Habe nun eine Lösung, die auch in diesem Fall funktioniert:

    - Hole Group-Tokens mit GetTokenInformation zu meinem Access token handle
    - Hole AllocateAndInitializeSid für builtin Admin SID
    - Iteriere über Group-Tokens, prüfe ob Admin SID gleich Group SID (EqualSid)
    - Prüfe in diesem Fall (EqualSid) abschliessend noch auf Group-Token Attribute (SE_GROUP_ENABLED bzw. SE_GROUP_USE_FOR_DENY_ONLY)

    Frage mich nur, wieso dafür keine API Funktion existiert?



  • Ich frage mich immer noch, warum Du das wissen willst.... was hilft Dir die Info?



  • Ich beabsichtige nur die Optionen eines Programms zur Laufzeit editierbar zu machen, ohne das Programm selbst zu elevaten.



  • Hmmm, ich komme hier nicht weiter...

    Meine Umgebung:
    Windows 7, User-Credential-Verification (SSPI über NTLM), Server = Client

    Die Funktion IsUserInAdminGroup (s. Martins Link) habe ich so angepaast, dass es ein Access-Token als Parameter nimmt, anstatt diesen über OpenProcessToken zu ermitteln.

    Meine Versuche mit QuerySecurityContextToken bzw. OpenThreadToken und/ohne DuplicateTokenEx(...., TokenPrimary, ...) schlagen in der Funktion IsUserInAdminGroup bei GetTokenInformation(..., TokenLinkedToken, ...) mit Fehler 1312 fehl.

    Auch mit vorherigem ImpersonateSecurityContext meines Server-Security-Contextes.

    Wie prüfe ich nun den über SSPI validierten User auf Admin-Rechte bzw. Member der Gruppe Administrator?


  • Mod

    Ich weiß nicht was Deine Anfrage soll und was Dein Einwurf ist falsch?

    1. Mein Beispielcode, den ich Dir genannt habe macht genau, dass was Du anfragst!
    2. Der Code funktioniert auch wenn UAC abgeschaltet ist


Anmelden zum Antworten