validar usuario password obtener information datos active c# active-directory

c# - password - Forma rápida de recuperar información del usuario Active Directory



obtener datos usuario active directory c# (5)

¿Cómo consultar información del usuario desde Active Directory ? Tengo un código que funciona, pero es muy lento. Estoy usando C #. Este es el código que uso actualmente:

static void Main(string[] args) { SearchResultCollection sResults = null; try { //modify this line to include your domain name string path = "LDAP://EXTECH"; //init a directory entry DirectoryEntry dEntry = new DirectoryEntry(path); //init a directory searcher DirectorySearcher dSearcher = new DirectorySearcher(dEntry); //This line applies a filter to the search specifying a username to search for //modify this line to specify a user name. if you want to search for all //users who start with k - set SearchString to "k" dSearcher.Filter = "(&(objectClass=user))"; //perform search on active directory sResults = dSearcher.FindAll(); //loop through results of search foreach (SearchResult searchResult in sResults) { if (searchResult.Properties["CN"][0].ToString() == "Adit") { ////loop through the ad properties //foreach (string propertyKey in //searchResult.Properties["st"]) //{ //pull the collection of objects with this key name ResultPropertyValueCollection valueCollection = searchResult.Properties["manager"]; foreach (Object propertyValue in valueCollection) { //loop through the values that have a specific name //an example of a property that would have multiple //collections for the same name would be memberof //Console.WriteLine("Property Name: " + valueCollection..ToString()); Console.WriteLine("Property Value: " + (string)propertyValue.ToString()); //["sAMAccountName"][0].ToString(); } //} Console.WriteLine(" "); } } } catch (InvalidOperationException iOe) { // } catch (NotSupportedException nSe) { // } finally { // dispose of objects used if (sResults != null) sResults.Dispose(); } Console.ReadLine(); }

¿Cómo se vería un código más rápido para obtener información del usuario de AD?


Montaje

System.DirectoryServices.AccountManagement

Espacio de nombre

using System.DirectoryServices.AccountManagement;

El siguiente código le dará toda la información del usuario.

using (var pc = new PrincipalContext(ContextType.Domain, "MyDomainName")) { var user = UserPrincipal.FindByIdentity(pc, IdentityType.SamAccountName, "MyDomainName//" + userName); }


No estoy seguro de cuánto de su "lentitud" se debe al bucle que está haciendo para encontrar entradas con valores de atributo particulares, pero puede eliminar este bucle siendo más específico con su filtro. Prueba esta página para obtener una guía ... Sintaxis del filtro de búsqueda


La razón por la que su código es lento es que su consulta LDAP recupera todos los objetos de usuario en su dominio, aunque solo esté interesado en un usuario con un nombre común de "Adit":

dSearcher.Filter = "(&(objectClass=user))";

Por lo tanto, para optimizar, debe limitar su consulta LDAP solo al usuario que le interesa. Pruebe algo como:

dSearcher.Filter = "(&(objectClass=user)(cn=Adit))";

Además, no olvide disponer de estos objetos cuando haya terminado:

  • DirectoryEntry dEntry
  • DirectorySearcher dSearcher

Puede simplificar este código para:

DirectorySearcher searcher = new DirectorySearcher(); searcher.Filter = "(&(objectCategory=user)(cn=steve.evans))"; SearchResultCollection results = searcher.FindAll(); if (results.Count == 1) { //do what you want to do } else if (results.Count == 0) { //user does not exist } else { //found more than one user //something is wrong }

Si puede delimitar dónde se encuentra el usuario, puede establecer searcher.SearchRoot en una unidad organizativa específica que sepa que el usuario tiene.

También debería usar objectCategory en lugar de objectClass, ya que objectCategory está indexado de manera predeterminada.

También debería considerar buscar en un atributo distinto de CN. Por ejemplo, podría tener más sentido buscar en el nombre de usuario (sAMAccountName), ya que se garantiza que es único.


Bueno, si sabe dónde vive su usuario en la jerarquía de AD (por ejemplo, posiblemente en el contenedor de "Usuarios", si se trata de una red pequeña), también podría enlazar a la cuenta de usuario directamente, en lugar de buscarla.

DirectoryEntry deUser = new DirectoryEntry("LDAP://cn=John Doe,cn=Users,dc=yourdomain,dc=com"); if (deUser != null) { ... do something with your user }

Y si ya está en .NET 3.5, incluso podría usar el espacio de nombres System.DirectorySystems.AccountManagement ampliamente ampliado con clases fuertemente tipadas para cada uno de los objetos AD más comunes:

// bind to your domain PrincipalContext pc = new PrincipalContext(ContextType.Domain, "LDAP://dc=yourdomain,dc=com"); // find the user by identity (or many other ways) UserPrincipal user = UserPrincipal.FindByIdentity(pc, "cn=John Doe");

Hay mucha información disponible en System.DirectoryServices.AccountManagement: echa un vistazo a este excelente artículo en MSDN de Joe Kaplan y Ethan Wilansky sobre el tema.