Laden...

sAMAccountName auslesen aus AD

Erstellt von *neo* vor einem Jahr Letzter Beitrag vor einem Jahr 724 Views
*
*neo* Themenstarter:in
299 Beiträge seit 2006
vor einem Jahr
sAMAccountName auslesen aus AD

Hallo zusammen,

ich habe versucht, auch mit Hilfe der Beiträge hier, den sAMAccountName aus einem AD zu lesen für einen bestimmten User.
Da ich noch nicht so genau verstehe wie ich den bestimmten User lese. Wollte ich mir erst einmal alle User aus CN=gruppeadmin holen und dann nach einem bestimmten User suchen über eine Schleife.

Ich Poste mal etwas Code für das bessere Verständnis:


DirectoryEntry directoryEntry = new DirectoryEntry("LDAP://SERVERNAME", username, password);
directoryEntry.Path = "LDAP://CN=gruppeadmin,OU=OU2,OU=OU1,DC=S1,DC=S2"; //In cn gruppeadmin sind die User hinterlegt
directoryEntry.AuthenticationType = AuthenticationTypes.Secure;

string[] props = { "sAMAccountName"};
DirectorySearcher search = new DirectorySearcher(directoryEntry, "(&(objectClass=user))", props, System.DirectoryServices.SearchScope.Subtree);

SearchResultCollection resultCol = search.FindAll();
if (resultCol != null)
{
if (resultCol.Count > 0)
{
//hier komme ich gar nicht hin, weil Count == 0
}

}


Ich weiß ehrlich gesagt nicht was ich falsch mache. Der Filter "(&(objectClass=user)) stimmt hier glaub ich nicht.
Variable username, password sind die Daten von dem User den ich im AD suche.
Das ist so gewollte. Der User soll durch Eingabe seiner Anmeldedaten am AD authentifiziert werden und bestimmte Daten erhalten. Daher ist sAMAccountName nur ein Beispiel.

Danke und Grüße

16.806 Beiträge seit 2008
vor einem Jahr

Der User soll durch Eingabe seiner Anmeldedaten am AD authentifiziert werden und bestimmte Daten erhalten.

Dann solltest Du Dein Vorhaben überdenken. Das AD liefert Dir niemals das Passwort, weder von Dir noch von anderen User.
Du kannst das Passwort niemals selbst validieren. Alles andere wäre eine riesige Sicherheitslücke - und sogar gesetzlich durch GDPR verboten.

Willst Du ein User und dessen Credentials gegen das AD validieren, dann geht das nur über einen Principal Context (oder die Win32 APIs dazu)


using(PrincipalContext pc = new PrincipalContext(ContextType.Domain, "DEINE_DOMAIN")) // Dein lokaler Rechner muss Teil der Domäne sein
{
    bool isValid = pc.ValidateCredentials("myUser", "myPassword");
}

*
*neo* Themenstarter:in
299 Beiträge seit 2006
vor einem Jahr

Hallo,

das habe ich falsch beschrieben 🙂. Beim durchlesen eben ist mir das aufgefallen.
Ich möchte natürlich nicht das Passwort. Ich will den User prüfen.
Ich habe das auch hingekommen wie folgt:


PrincipalContext principalContext = new PrincipalContext(ContextType.Domain, "DEINE_DOMAIN", "DC=S1,DC=S2", username, password);

GroupPrincipal groupPrincipal = GroupPrincipal.FindByIdentity(principalContext, IdentityType.Name, "gruppeadmin");

if (groupPrincipal != null)
                {
                    foreach (Principal p in groupPrincipal.GetMembers(true))
                    {
                        if (p.Name != null)
                        {
                            if (p.Name.Equals(username))
                            {
                                foundInAdAndGroup = true;
                                break;
                            }
                        }
                    }

                    groupPrincipal.Dispose();
                }

Eigentlich ist das Ziel zu schauen, ist der Benutzer in einer bestimmten Gruppe.

Das funktioniert auch prima!
Heute im Homeoffice über VPN dauert die Anfrage fasst 45 Sekunden. Bei einer 75mbit Leistung.
Ich muss das jetzt morgen noch einmal Vorort testen. Das ging eigentlich ganz schnell!
Das Problem tritt hier auf bei GetMembers(true). Das dauert ewig. In der Gruppe 'gruppeadmin' sind eigentlich nur 3 Personen aktuell!
Hat jemand hier schon mal Erfahrung gemacht.

Danke, grüße

16.806 Beiträge seit 2008
vor einem Jahr

Es ist quatsch alles zu laden, vor allem in einzelnen Strücken. Das wird ja immer langsamer, je mehr Du laden musst.
Lad nur das, was Du brauchst - und das möglichst in einem Rutsch.


UserPrincipal? user = UserPrincipal.FindByIdentity(ctx, "UserName");
GroupPrincipal? group = GroupPrincipal.FindByIdentity(ctx, "GroupName");

if(user is not null && group is not null)
{
   if (user.IsMemberOf(group))
   {
     // abc here
   } 
}

*
*neo* Themenstarter:in
299 Beiträge seit 2006
vor einem Jahr

Hallo,

genauso hatte ich es am Anfang, dass hat aber genauso lange gedauert.
Ich muss mit unseren Netzwerkadmins sprechen. Das scheint der Weg über den VPN das Problem zu sein, warum auch immer.

Sehr komisch!