mayho33
Goto Top

C-Sharp, Doamin-User, LocalAdminRigths und System.Security.Principal

Hallo @ All

Ich habe eine Verständnis-Frage auf die ich im Netz nicht wirklich eine grundlegende Antwort finden konnte. Ich hoffe nun, dass sich jemand aus der findigen Administrator.de - Community auskennt face-smile

Info:

DC OS = Server 2016
Client OS = Window10 x64

Die Vorgeschichte:

In einer Domain gibt es unter anderem einen Benutzer-Gruppe "LocalAdmins" die via GPO am Domain-Controller auf bekanntem Wege verteilt wird. Der Gruppe ("LocalAdmins") ist ein Domain-User "User1" hinzugefügt. auf dem Domain-Client findet sich nun in der Gruppe Administrators, die Gruppe "LocalAdmins". Der Domain-User "User1" hat lokale Admin-Rechte.

EDIT: wie unten von @136037 ganz richtig erklärt, prüft diese Methode nur ob der Process als Admin läuft
Wenn ich ein C-Sharp-Project als User1 ausführe und anschließend im Project prüfe ob der Benutzer administrative Rechte hat, bekomme ich False zurück.
private static bool CheckAdminRights()
        {
            bool toReturn = false;
            using (WindowsIdentity identity = WindowsIdentity.GetCurrent())
            {
                WindowsPrincipal principal = new WindowsPrincipal(identity);
                toReturn = principal.IsInRole(WindowsBuiltInRole.Administrator);
            }
            return toReturn;
        }

Ich führe das darauf hin zurück, dass hier nur lokale Rechte geprüft werden. Deshalb habe ich mithilfe von Goolge meine Abfrage etwas erweitert und bin auf diesen Artikel gestoßen: https://lluisfranco.com/2010/12/13/how-to-check-if-current-user-is-membe ...

Diese Methode liefert aber ebenfalls False obwohl ich sicher bin, dass User1 lokale Administrations-Rechte hat.

Die Frage:

EDIT:
Was muss ich tun (steh voll am Schlauch) um zu prüfen ob Domain-User "xy" lokale Admin-Rechte hat?
Warum findet die Methode via Directory Context nicht heraus, dass der Domain-User lokale Adminrights hat? Was muss ich ändern?


Vielen Dank im Voraus für eure Unterstützung!

Grüße!

Mayho

Content-Key: 372598

Url: https://administrator.de/contentid/372598

Printed on: April 20, 2024 at 02:04 o'clock

Mitglied: 136037
136037 Apr 30, 2018 updated at 10:01:26 (UTC)
Goto Top
principal.IsInRole(WindowsBuiltInRole.Administrator);
Das sagt nicht aus ob jemand Admin-Rechte hat sondern sagt nur aus das der Prozess nicht elevated gestartet wurde. Man muss den Prozess also erst mal mit dem Verb "runas" elevated starten (was die UAC triggert), erst dann ist diese Eigenschaft true face-wink.

Gruß
Member: mayho33
mayho33 Apr 30, 2018 at 10:06:31 (UTC)
Goto Top
Hi qaboos,

stimmt! Danke! Ich möchte ja eigentlich auch nicht prüfen ob der Prozess als Admin läuft, sondern ob der ausführende Benutzer lokaler Administrator ist.

Werde das oben noch konkretisieren.

Grüße!
Mitglied: 136037
136037 Apr 30, 2018 updated at 10:08:04 (UTC)
Goto Top
Dann hol dir doch einfach die lokalen Gruppenmitglieder und vergleiche die SID des Users.
Member: mayho33
mayho33 Apr 30, 2018 at 10:24:30 (UTC)
Goto Top
Ich möchte aber wissen ob ein Domain-User lokale Admin-Rights hat. In einem Domain-verwaltetem Netzwerk nützen die lokalen User nicht viel.

siehe Bild:
admin group
Mitglied: 136037
Solution 136037 Apr 30, 2018 updated at 10:36:27 (UTC)
Goto Top
In einem Domain-verwaltetem Netzwerk nützen die lokalen User nicht viel.
Quark, die lokalen Gruppen habe enthalten die Doimain-Gruppen und die kannst du auch rekursiv auslesen. Geht aber noch einfacher mit PrincipalContext:
Folgendes Assembly hinzufügen (System.DirectoryServices.AccountManagement)
private static bool IsAdministrator(string username)
{
    PrincipalContext ctx;
    try
    {
        Domain.GetComputerDomain();
        try
        {
            ctx = new PrincipalContext(ContextType.Domain);
        }
        catch (PrincipalServerDownException)
        {
            // can't access domain, check local machine instead  
            ctx = new PrincipalContext(ContextType.Machine);
        }
    }
    catch (ActiveDirectoryObjectNotFoundException)
    {
        // not in a domain
        ctx = new PrincipalContext(ContextType.Machine);
    }
    var up = UserPrincipal.FindByIdentity(ctx, username);
    if (up != null)
    {
        PrincipalSearchResult<Principal> authGroups = up.GetAuthorizationGroups();
        return authGroups.Any(principal =>
                              principal.Sid.IsWellKnown(WellKnownSidType.BuiltinAdministratorsSid) ||
                              principal.Sid.IsWellKnown(WellKnownSidType.AccountDomainAdminsSid) ||
                              principal.Sid.IsWellKnown(WellKnownSidType.AccountAdministratorSid) ||
                              principal.Sid.IsWellKnown(WellKnownSidType.AccountEnterpriseAdminsSid));
    }
    return false;
}
Geht natürlich auch mit Powershell:
Add-Type -A System.DirectoryServices.AccountManagement
$context = [System.DirectoryServices.AccountManagement.PrincipalContext]::new([System.DirectoryServices.AccountManagement.ContextType]::Domain)
$user = [System.DirectoryServices.AccountManagement.UserPrincipal]::FindByIdentity($context,$env:Username)
$user.GetAuthorizationGroups().Sid.IsWellKnown([System.Security.Principal.WellKnownSidType]::BuiltinAdministratorsSid) -eq $true
Member: mayho33
mayho33 Apr 30, 2018 updated at 10:54:01 (UTC)
Goto Top
Du bist der Wahnsinn!! Hast mich...

A) auf den richtige Weg geführt: https://stackoverflow.com/questions/6850604/user-group-permissions-in-ac ...
B) die perfekte Lösung geliefert (die ist wesentlich eleganter)

Perfekt! Perfekt! Perfekt! Danke!

Mayho