2012-04-20 18 views
7

fand ich How can I get a list of users from active directory?Suchen Sie eine Benutzer-Login-ID nach Vornamen und Nachnamen

Es ist hilfreich, wenn ich nur ein paar Benutzer, aber ich habe so viele Benutzer in AD, so, wenn ich betreibe meine Abfrage

if ((String)(entry.Properties["sn"].Value) == "lname" 
    && (String)(entry.Properties["givenName"].Value) == "fname") 
{ 
    return entry.Properties["samAccountName"].Value.ToString(); 
} 

es dauerte zu lange, um zu beenden.

Was kann ich tun, um eine bestimmte Benutzer-Anmelde-ID nach Vor- und Nachname zu durchsuchen?

Antwort

7

Da du bist Auf .NET 4 sollten Sie den Namespace System.DirectoryServices.AccountManagement (S.DS.AM) überprüfen. Lesen Sie mehr darüber hier:

Grundsätzlich können Sie einen Domain-Kontext definieren und einfach finden Benutzer und/oder Gruppen in AD:

// set up domain context 
PrincipalContext ctx = new PrincipalContext(ContextType.Domain); 

// find a user - by e.g. his "samAccountName", or the Windows user name or something 
UserPrincipal user = UserPrincipal.FindByIdentity(ctx, "SomeUserName"); 

if(user != null) 
{ 
    // do something here....  
    string samAccountName = user.SamAccountName; 
} 

Wenn Wenn Sie keinen Benutzer mit einem Benutzernamen finden können, können Sie auch die neue Suchfunktion verwenden:

// define a "query-by-example" principal - here, we search for a UserPrincipal 
// and with the first name (GivenName) and a last name (Surname) 
UserPrincipal qbeUser = new UserPrincipal(ctx); 
qbeUser.GivenName = firstName; 
qbeUser.Surname = lastName; 

// create your principal searcher passing in the QBE principal  
PrincipalSearcher srch = new PrincipalSearcher(qbeUser); 

// find all matches 
foreach(var found in srch.FindAll()) 
{ 
    // do whatever here - "found" is of type "Principal" - it could be user, group, computer.....   
} 

Das neue S.DS.AM macht es einfach, mit Benutzern und Gruppen in AD herumzuspielen! Und nur einen einzigen Benutzer zu finden, sollte auch relativ schnell sein.

+0

großer Hilfe, wünsche ich, dass ich alle Ihre Jungen des anwsers – user1225072

+0

@marc_s akzeptieren könnte das war genau das, was ich suchte, perfekt, danke. .. aber ich habe auf die harte Tour herausgefunden, dass, wenn ein Feld, das Sie vom Benutzer für die Suche angefordert haben, nicht benötigt wird, die entsprechende Eigenschaft im 'UserPrincipal' übersprungen wird. Ich habe ursprünglich "string.empty" und dann sogar "null" gedrückt und hatte ** no ** Ergebnisse zurückgegeben. Sobald ich jedoch eine 'if'-Anweisung hinzugefügt und dieses Element im 'UserPrincipal' ignoriert habe, wurden schließlich Ergebnisse zurückgegeben (_ie: übersprungen ** GivenName **, wenn der ** Vorname ** nicht ausgefüllt wurde, anstatt zu setzen zu Standard_). – famousKaneis

0

Sie müssen die QueryFilter-Eigenschaft auf searcher setzen und dann searcher.FindOne() anstelle von searcher.FindAll() anrufen. Der Abfragefilter kann auf ein Objekt UserPrincipal festgelegt werden, in dem Sie die Felder festlegen, nach denen Sie suchen möchten.

Microsoft hat ein gutes Beispiel dafür auf der Seite Query By Example, obwohl ihr Beispiel erwartet, mehrere Objekte zu finden, die die angegebenen Kriterien erfüllen.

Eine besonders wörtliche Anpassung der verknüpften Frage Ihrer Anforderung würde

using (var context = new PrincipalContext(ContextType.Domain, "mydomain.com")) 
{ 
    using (var searcher = new PrincipalSearcher(new UserPrincipal(context) { GivenName = "fname", Surname = "lname" })) 
    { 
      foreach (var result in searcher.FindAll()) 
      { 
       DirectoryEntry de = result.GetUnderlyingObject() as DirectoryEntry; 
       return de.Properties["samAccountName"].Value.ToString(); 
      } 
    } 
} 
0

sein Wenn entry Teil einer IEnumerable Sammlung ist, könnten Sie so etwas wie tun:

var entries = {do your population of the collection here} 

var entry = entries.Where(e=>e.Properties["sn"].Value.ToString() == "lname" 
    && e=>.Properties["givenName"].Value.ToString() == "fname") 
    .FirstOrDefault(); 
2

Sie sollten den AD-Server verwenden, um die Filterung durchzuführen. Führen Sie dazu einen LDAP-Syntaxfilter aus. Außerdem geben Sie nur die Eigenschaften, die Sie benötigen, mit dem propertiesToLoad Argumente von FindAll:

public static SearchResultCollection FindByName(
     string domain, string firstName, string lastName, string[] properties) { 
     var rootEntry = new DirectoryEntry("LDAP://" + domain); 
     var filter = string.Format("(&(sn={0})(givenName={1}))", lastName, firstName); 
     var searcher = new DirectorySearcher(rootEntry, filter, properties); 
     return searcher.FindAll(); 
    } 

    // Using the method: 
    var result = FindByName("mydomain", "Robert", "Smith", new[] { "samAccountName" })[0]; 
    string uName = (string)result.Properties["samAccountName"][0]; 
Verwandte Themen