Saltar al contenido

¿Cómo puedo obtener una lista de usuarios del directorio activo?

Solución:

Si es nuevo en Active Directory, le sugiero que primero comprenda cómo Active Directory almacena los datos.

Active Directory es en realidad un servidor LDAP. Los objetos almacenados en el servidor LDAP se almacenan jerárquicamente. Es muy similar a almacenar sus archivos en su sistema de archivos. Por eso tiene el nombre Directorio servidor y activo Directorio

Los contenedores y objetos en Active Directory se pueden especificar mediante un distinguished name. El nombre distinguido es así CN=SomeName,CN=SomeDirectory,DC=yourdomain,DC=com. Al igual que una base de datos relacional tradicional, puede ejecutar consultas en un servidor LDAP. Se llama consulta LDAP.

Hay varias formas de ejecutar una consulta LDAP en .NET. Puede utilizar DirectorySearcher desde System.DirectoryServices o SearchRequest de System.DirectoryServices.Protocol.

Para su pregunta, dado que está pidiendo encontrar el objeto principal del usuario específicamente, creo que la forma más intuitiva es usar PrincipalSearcher de System.DirectoryServices.AccountManagement. Puede encontrar fácilmente muchos ejemplos diferentes en Google. Aquí hay una muestra que está haciendo exactamente lo que está pidiendo.

using (var context = new PrincipalContext(ContextType.Domain, "yourdomain.com"))
{
    using (var searcher = new PrincipalSearcher(new UserPrincipal(context)))
    {
        foreach (var result in searcher.FindAll())
        {
            DirectoryEntry de = result.GetUnderlyingObject() as DirectoryEntry;
            Console.WriteLine("First Name: " + de.Properties["givenName"].Value);
            Console.WriteLine("Last Name : " + de.Properties["sn"].Value);
            Console.WriteLine("SAM account name   : " + de.Properties["samAccountName"].Value);
            Console.WriteLine("User principal name: " + de.Properties["userPrincipalName"].Value);
            Console.WriteLine();
        }
    }
}
Console.ReadLine();

Tenga en cuenta que en el objeto de usuario de AD, hay varios atributos. En particular, givenName te dará el First Name y sn te dará el Last Name. Sobre el nombre de usuario. Creo que te refieres al nombre de inicio de sesión del usuario. Tenga en cuenta que hay dos nombres de inicio de sesión en el objeto de usuario de AD. Uno es samAccountName, que también se conoce como nombre de inicio de sesión de usuario anterior a Windows 2000. userPrincipalName se utiliza generalmente después de Windows 2000.

Si desea filtrar y cuentas activas agregue esto al código de Harvey:

 UserPrincipal userPrin = new UserPrincipal(context);
 userPrin.Enabled = true;

después del primer uso. Luego añade

  searcher.QueryFilter = userPrin;

antes de encontrar todo. Y eso debería darte los activos.

Ciertamente, el crédito es para @Harvey Kwok aquí, pero solo quería agregar este ejemplo porque en mi caso quería obtener una Lista real de UserPrincipals. Probablemente sea más eficiente filtrar esta consulta por adelantado, pero en mi pequeño entorno, es más fácil extraer todo y luego filtrar según sea necesario de mi lista.

Dependiendo de lo que necesite, es posible que no necesite convertir a DirectoryEntry, pero algunas propiedades no están disponibles en UserPrincipal.

using (var searcher = new PrincipalSearcher(new UserPrincipal(new PrincipalContext(ContextType.Domain, Environment.UserDomainName))))
{
    List<UserPrincipal> users = searcher.FindAll().Select(u => (UserPrincipal)u).ToList();
    foreach(var u in users)
        {
            DirectoryEntry d = (DirectoryEntry)u.GetUnderlyingObject();
            Console.WriteLine(d.Properties["GivenName"]?.Value?.ToString() + d.Properties["sn"]?.Value?.ToString());
        }
}
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *