Consultar información de usuario desde Active Directory en C#

Syed Hassan Sabeeh Kazmi 12 octubre 2023
  1. Use el espacio de nombres System.DirectoryServices en C# para consultar la información del usuario desde Active Directory
  2. Use el espacio de nombres System.DirectoryServices.AccountManagement en C# para consultar la información del usuario desde Active Directory
  3. Combine System.DirectoryServices y System.DirectoryServices.AccountManagement para acceder a propiedades no expuestas por las bibliotecas AccountManagement
Consultar información de usuario desde Active Directory en C#

Recuperar la información del usuario de Active Directory puede ser un desafío, ya que algunas de las herramientas de línea de comandos y MSAD son bastante limitadas y difíciles de usar. Por otro lado, escribir su código C# es más gratificante y personalizable.

Hay dos conjuntos de clases para operaciones de AD para consultar información en C#. El primero usa el espacio de nombres System.DirectoryServices y es más fácil de usar.

Sin embargo, no es tan versátil como el segundo que presenta el espacio de nombres System.DirectoryServices.AccountManagement.

Use el espacio de nombres System.DirectoryServices en C# para consultar la información del usuario desde Active Directory

System.DirectoryServices es una forma técnica de permitirle acceder a cualquier información de usuario desde Active Directory. Las propiedades de los objetos AD (ya que son todos objetos genéricos) se mantienen en una matriz que contiene toda la información del usuario.

Este método es mucho más críptico y orientado a los detalles. A menudo requiere que los desarrolladores configuren manualmente los códigos UAC para consultar la información del usuario de Active Directory.

El siguiente código ejecutable le mostrará cómo usar Active Directory para consultar la información del usuario en C#.

using System;
using System.Text;
using System.DirectoryServices;

namespace queryInfoAD {

  class userActiveDirectory {
    static void Main(string[] args) {
      // Input the user name (password can also be required) to get a particular user info from
      // Active Directory

      Console.Write("User Name = ");
      String searchUsername = Console.ReadLine();

      try {
        // create an LDAP connection object that will help you fetch the Active Directory user

        DirectoryEntry userLdapConn = createDirectoryEntry();

        // create `ObjSearch` as a search object which operates on an LDAP connection object to only
        // find a single user's details

        DirectorySearcher ObjSearch = new DirectorySearcher(userLdapConn);
        ObjSearch.Filter = searchUsername;

        // create result objects from the search object

        SearchResult checkUser = ObjSearch.FindOne();

        if (checkUser != null) {
          ResultPropertyCollection fields = checkUser.Properties;

          foreach (String ldapUser in fields.PropertyNames) {
            foreach (Object InfoChart in fields[ldapUser])
              Console.WriteLine(String.Format("{0,-20} : {1}", ldapUser, InfoChart.ToString()));
          }
        }

        else {
          Console.WriteLine("User does not exist!");
        }
      }

      catch (Exception e) {
        Console.WriteLine("Error!\n\n" + e.ToString());
      }
    }

    static DirectoryEntry createDirectoryEntry() {
      // create an LDAP connection with custom settings and return it

      DirectoryEntry ldapConnection = new DirectoryEntry("Insert connection domain link...");
      ldapConnection.Path =
          "Insert the path to the Active Directory which contains user information";
      ldapConnection.AuthenticationType = AuthenticationTypes.Secure;

      return ldapConnection;
    }
  }
}

System.DirectoryServices brinda fácil acceso al directorio activo desde el código administrado. El objeto de búsqueda de DirectorySearcher ayuda a limitar la búsqueda a un solo usuario con un nombre de usuario común.

Puede acotar aún más su consulta LDAP introduciendo un método dSearcher.Filter, que puede buscar a un usuario en particular para obtener información interesante. Además, no olvide deshacerse de los objetos DirectoryEntry y DirectorySearcher ya que pertenecen al espacio de nombres System.DirectoryServices.

Use el espacio de nombres System.DirectoryServices.AccountManagement en C# para consultar la información del usuario desde Active Directory

Su objetivo principal es administrar Active Directory a través de .NET mucho más fácil. Es el enfoque más nuevo para recuperar información de usuario del directorio activo y puede realizar prácticamente todas las operaciones de AD.

Este método permite a los desarrolladores utilizar comandos como user.DisplayName y user.VoiceTelephoneNumber, que ayuda a consultar un conjunto personalizado de información de usuario de Active Directory.

using System;
using System.DirectoryServices;
using System.DirectoryServices.AccountManagement;

// add the reference in the `System.DirectoryServices.AccountManagement` library to your project
// before executing this code

namespace DSAM_examp {
  class AccManagement {
    static void Main(string[] args) {
      try {
        // enter Active Directory settings
        PrincipalContext ActiveDirectoryUser =
            new PrincipalContext(ContextType.Domain, "Insert the domain link here...");

        // create search user and add criteria

        Console.Write("Enter User Name: ");
        UserPrincipal userName = new UserPrincipal(ActiveDirectoryUser);
        userName.SamAccountName = Console.ReadLine();

        PrincipalSearcher search = new PrincipalSearcher(userName);

        foreach (UserPrincipal result in search.FindAll())

          // the user information in AD contains the VoiceTelephoneNumber that is unique and helps
          // find the target user

          // result.VoiceTelephoneNumber != null is also valid

          if (result.DisplayName != null) {
            // to display the user name and telephone number from Active Directory. You can also
            // retrieve more information using similar commands.

            Console.WriteLine(result.DisplayName, result.VoiceTelephoneNumber);
          }
        search.Dispose();
      }

      catch (Exception error) {
        Console.WriteLine("User not found! Error: " + error.Message);
      }
    }
  }
}

Puede usar UserPrincipal.FindByIdentity como una clase del espacio de nombres System.DirectoryServices.AccountManagement, que es la forma más sencilla de consultar la información del usuario, pero también la más lenta.

Al eliminar el método SamAccountName y la entrada manual del nombre de usuario, puede consultar la información de todos los usuarios en Active Directory.

Combine System.DirectoryServices y System.DirectoryServices.AccountManagement para acceder a propiedades no expuestas por las bibliotecas AccountManagement

Se puede acceder a las propiedades que las bibliotecas AccountManagement no exponen convirtiendo UserPrincipal en un objeto más general.

Al recuperar objetos subyacentes de UserPrincipal en Active Directory, ambos espacios de nombres DirectoryServices juegan un papel importante.

using System;
using System.DirectoryServices;
using System.DirectoryServices.AccountManagement;

namespace HybridMethod {
  class getUserInfo {
    static void Main(string[] args) {
      try {
        PrincipalContext userActiveDirectory =
            new PrincipalContext(ContextType.Domain, "Insert your domain link here...");

        // `UserPrincipal` class encapsulates principals that contain user information

        UserPrincipal userName = new UserPrincipal(userActiveDirectory);

        // retrieves the principal context that is essential to perform the query. Its context
        // specifies the server/domain against which search operations are performed.

        PrincipalSearcher searchObj = new PrincipalSearcher(userName);

        foreach (UserPrincipal result in searchObj.FindAll()) {
          if (result.DisplayName != null) {
            // access the underlying object, e.g., user properties

            DirectoryEntry lowerLdap = (DirectoryEntry)result.GetUnderlyingObject();

            Console.WriteLine("{0,30} {1} {2}", result.DisplayName,
                              lowerLdap.Properties["postofficebox"][0].ToString());
          }
        }

        // disposing the `PrincipalSearcher` object

        searchObj.Dispose();
      }

      catch (Exception exp) {
        Console.WriteLine(exp.Message);
      }
    }
  }
}

En este tutorial, aprendió tres formas de consultar la información del usuario de Active Directory en C#. Con el tercer método híbrido, incluso puede obtener propiedades de usuario oscuras.

Estos métodos le ofrecen varias ventajas, como legibilidad y brevedad, y son extremadamente útiles para obtener toda o una parte de la información del usuario de Active Directory de forma más rápida y sencilla.

Syed Hassan Sabeeh Kazmi avatar Syed Hassan Sabeeh Kazmi avatar

Hassan is a Software Engineer with a well-developed set of programming skills. He uses his knowledge and writing capabilities to produce interesting-to-read technical articles.

GitHub