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!