consultar-usuarios-y-ordenadores-de-active-directory-con-c

Obtener usuarios y ordenadores de Active Directory con C#

Si sois administradores de sistemas con Active Directory estaréis acostumbrados a lidiar con la gestión de cientos o incluso miles de usuarios y ordenadores.

En estas circunstancias, muchas veces resulta de utilidad hacer consultas a Active Directory desde C# para acceder, filtrar, o ejecutar acciones de forma rápida y cómoda desde alguno de nuestros desarrollos.

Con este objetivo, compartimos el código necesario para hacer consultas de usuarios y ordenadores desde Active Directory mediante C#.

Consultar usuarios desde Active Directory

Para que el código funcione es necesario importar el ensamblado System.DirectoryServices;

El código para importar usuarios es el siguiente. Podéis personalizar las propiedades devueltas por la consulta a vuestro gusto. Recordar cambiar XXXXXX por el nombre de vuestro AD, e YYY por la extensión.

public List<User> GetADUsers()
{
  List<User> rst = new List<User>();

  string DomainPath = "LDAP://DC=XXXXXX,DC=YYY";
  DirectoryEntry adSearchRoot = new DirectoryEntry(DomainPath); 
  DirectorySearcher adSearcher = new DirectorySearcher(adSearchRoot);

  adSearcher.Filter = "(&(objectClass=user)(objectCategory=person))";
  adSearcher.PropertiesToLoad.Add("samaccountname");
  adSearcher.PropertiesToLoad.Add("title");
  adSearcher.PropertiesToLoad.Add("mail");
  adSearcher.PropertiesToLoad.Add("usergroup");
  adSearcher.PropertiesToLoad.Add("company");
  adSearcher.PropertiesToLoad.Add("department");
  adSearcher.PropertiesToLoad.Add("telephoneNumber");
  adSearcher.PropertiesToLoad.Add("mobile");
  adSearcher.PropertiesToLoad.Add("displayname");
  SearchResult result;
  SearchResultCollection iResult = adSearcher.FindAll();

  User item;
  if (iResult != null)
  {
    for (int counter = 0; counter < iResult.Count; counter++)
    {
      result = iResult[counter];
      if (result.Properties.Contains("samaccountname"))
      {
        item = new User();

        item.UserName = (String)result.Properties["samaccountname"][0];

        if (result.Properties.Contains("displayname"))
        {
          item.DisplayName = (String)result.Properties["displayname"][0];
        }

        if(result.Properties.Contains("mail"))
        {
          item.Email = (String)result.Properties["mail"][0];
        }

        if (result.Properties.Contains("company"))
        {
          item.Company = (String)result.Properties["company"][0];
        }

        if (result.Properties.Contains("title"))
        {
          item.JobTitle = (String)result.Properties["title"][0];
        }

        if (result.Properties.Contains("department"))
        {
          item.Deparment = (String)result.Properties["department"][0];
        }

        if (result.Properties.Contains("telephoneNumber"))
        {
          item.Phone = (String)result.Properties["telephoneNumber"][0];
        }

        if (result.Properties.Contains("mobile"))
        {
          item.Mobile = (String)result.Properties["mobile"][0];
        }
        rst.Add(item);
      }
    }
  }
  
  adSearcher.Dispose();
  adSearchRoot.Dispose();

  return rst;
}

public class User
{
  public string UserName { get; set; }

  public string DisplayName { get; set; }

  public string Company { get; set; }

  public string Deparment { get; set; }

  public string JobTitle{ get; set; }

  public string Email { get; set; }

  public string Phone { get; set; }

  public string Mobile { get; set; }
}

Consultar ordenadores desde Active Directory

Por su parte, el código necesario para listar los ordenadores del AD es el siguiente. Igualmente podéis personalizar las propiedades devueltas a vuestro antojo, y no olvidéis cambiar XXXXXX e YYY por el nombre y extensión de vuestro AD, respectivamente.

public static List<Computer> GetADComputers()
{
  List<Computer> rst = new List<Computer>();

  string DomainPath = "LDAP://DC=XXXXXX,DC=YYY";
  DirectoryEntry adSearchRoot = new DirectoryEntry(DomainPath);
  DirectorySearcher adSearcher = new DirectorySearcher(adSearchRoot);

  adSearcher.Filter = ("(objectClass=computer)");
  adSearcher.PropertiesToLoad.Add("description");
  adSearcher.SizeLimit = int.MaxValue;
  adSearcher.PageSize = int.MaxValue;

  SearchResult result;
  SearchResultCollection iResult = adSearcher.FindAll();

  Computer item;

  for (int counter = 0; counter < iResult.Count; counter++)
  {
    result = iResult[counter];

    string ComputerName = result.GetDirectoryEntry().Name;
    if (ComputerName.StartsWith("CN=")) ComputerName = ComputerName.Remove(0, "CN=".Length);
    item = new Computer();
    item.ComputerName = ComputerName;

    if (result.Properties.Contains("description"))
    {
      item.Description = (String)result.Properties["description"][0];

    }
    rst.Add(item);
  }

  adSearcher.Dispose();
  adSearchRoot.Dispose();

  return rst;
}

public class Computer
{
  public string ComputerName { get; set; }
  
  public string Description { get; set; }
}

Esperamos que el código os sea de utilidad y si tenéis cualquier duda ¡no dudéis en dejarnos vuestro comentario!