Accediendo a Active Directory con System.DirectoryServices.AccountManagement

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);

}

Publicado por

Vicente García Diez

Mi nombre es Vicente García Diez y soy arquitecto empresarial, experto en tecnologías Microsoft y transformaciones digitales complejas. Soy socio director y Trusted Advisor en abstratio En mi blog trataré temas de Estrategia IT y lecciones aprendidas en mis proyectos.

2 comentarios sobre “Accediendo a Active Directory con System.DirectoryServices.AccountManagement”

Deja un comentario

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