En el Microsoft Framework .NET 3.5 se ha incluido el namespace System.DirectoryServices.AccountManagement que nos permite acceder de una manera más transparente a grupos y usuarios de un Active Directory que con las clases DirectoryEntry y DirectorySearcher. Para ello contamos con las clases UserPrincipal y GroupPrincipal, que hereda de la clase abstracta Principal y nos permitirán crear nuestras plantillas de búsqueda. Después ejecutaremos nuestras peticiones contra el Active Directory a través de la clase PrincipalSearcher, con sus métodos FindOne() si queremos obtener solo un resultado o FindAll() si queremos obtener una collección de resultados en un objeto de tipo PrincipalSeachResult.
El primer paso será inicializar un PrincipalContext que será nuestra conexión contra el Active Directory:
PrincipalContext context = new PrincipalContext(ContextType.Domain, «plainconcepts», «DC=plainconcepts,DC=com», «User», «Password»);
Y ahora vamos a hacer una búsqueda sobre un usuario del Active Directory cuyo correo electrónico sea vicente.garcia@plainconcepts.com y vamos a cambiarle su propiedad Description. Lo primero, deberemos inicializar un objecto de la clase UserPrincipal con su propiedad EmailAddress a “vicente.garcia@plainconcepts.com” y, después, ejecutar esa búsqueda a través del método FindOne() del objeto PrincipalSearcher:
UserPrincipal userQuery = new UserPrincipal(context);
userQuery.EmailAddress = «vicente.garcia@plainconcepts.com»;
PrincipalSearcher principalSearcher = new PrincipalSearcher(userQuery);
UserPrincipal result = principalSearcher.FindOne() as UserPrincipal;
Ahora solo queda modificar la propiedad Description y llamar al método Save() del objeto de tipo UserPrincipal:
result.Description = «Development Advisor»;
result.Save();
Para utilizar el método FindAll() haremos una búsqueda por todos los elementos cuya propiedad EmailAddress pertenezca al dominio plainconcepts.com e imprimiremos su nombre por salida estándar:
PrincipalContext context = new PrincipalContext(ContextType.Domain, «plainconcepts», «DC=plainconcepts,DC=com», «User», «Password»);
UserPrincipal userQuery = new UserPrincipal(context);
userQuery.EmailAddress = «*@plainconcepts.com»;
PrincipalSearcher principalSearcher = new PrincipalSearcher(userQuery);
PrincipalSearchResult<Principal> result = principalSearcher.FindAll();
foreach (Principal item in result)
{
Console.WriteLine(((UserPrincipal)item).Name);
}
La única consideración que hay que tener es que los métodos FindAll() y FindOne() devuelven siempre o colección de objetos de clase Principal o un objeto de tipo Principal, por lo que será necesario castearlo.
Para recuperar un grupo o grupos de un Active Directory con la funcionalidad que este nuevo namespace nos provee debemos operar de una manera muy similar. Por ejemplo, vamos a recuperar todos los grupos cuya propiedad Name comience por la letra P e imprimiermos su propiedad Description:
PrincipalContext context = new PrincipalContext(ContextType.Domain, «plainconcepts», «DC=plainconcepts,DC=com», «User», «Password»);
GroupPrincipal groupQuery = new GroupPrincipal(context);
groupQuery.Name = «P*»;
PrincipalSearcher principalSearcher = new PrincipalSearcher(groupQuery);
PrincipalSearchResult<Principal> result = principalSearcher.FindAll();
foreach (Principal item in result)
{
Console.WriteLine(((GroupPrincipal)item).Description);
}