Creación y Búsqueda de usuarios en ActiveDirectory

Hoy le toca a Microsoft Active Directory (AD) el artículo técnico. Pero…

¿Qué es AD?

De forma sencilla se puede decir que es un servicio establecido en uno o varios servidores en donde se crean objetos tales como usuarios, equipos o grupos, con el objetivo de administrar los inicios de sesión en los equipos conectados a la red, así como también la administración de políticas en toda la red. Su estructura jerárquica permite mantener una serie de objetos relacionados con componentes de una red, como usuarios, grupos de usuarios, permisos y asignación de recursos y políticas de acceso.- Wikipedia

Implementación (CSharp)

Para crear un usuario en AD, el namespace ‘System.DirectoryServices.AccountManagement‘ incluye objetos de las operaciones básicas y generales. Creación simple de un usuario:

using ( var context = new PrincipalContext(ContextType.Domain, DOMAIN_NAME))
{
var userPrincipal = new UserPrincipal(context) { Enabled = true, PasswordNeverExpires = false };
userPrincipal.DisplayName = user.DisplayName;
userPrincipal.EmailAddress = user.EMail;
userPrincipal.VoiceTelephoneNumber = user.Phone;
/*
userPrincipal.GivenName = user.Name;
userPrincipal.MiddleName = user.LastName;
userPrincipal.Description = user.Description;
*/
userPrincipal.UserPrincipalName = user.UserName + LOCAL_DOMAIN;
userPrincipal.SamAccountName = user.UserName;

userPrincipal.Enabled = true;
Save(userPrincipal);
}

NOTA: La propiedad UserPrincipal.SamAccountName es obligatoria y única. Representa a cada objeto registrado. NOTA 2: Para detalles sobre las variables y funciones adicionales utilizadas, consultar archivo zip adjunto al pié del artículo. Ejemplo de búsqueda simple de un objeto:

public static UserPrincipal GetUserPrincipal(String userName)
{
var context = new PrincipalContext(ContextType.Domain, DOMAIN_NAME);
var userObj = new UserPrincipal(context)
{
SamAccountName = userName
}; 
var searcher = new PrincipalSearcher {
QueryFilter = userObj
}; 
return searcher.FindOne() as UserPrincipal; }

Y comprobación de la existencia:

public static bool Exists(String userName)
{
var context = new PrincipalContext(ContextType.Domain, DOMAIN_NAME);
var userObj = UserPrincipal.FindByIdentity(context, userName);
//  if not null, exists
return userObj != null;
}

De manera avanzada, está el uso del LDAP mediante el namespace a ‘System.DirectoryServices‘. Ejemplo de búsqueda por usuario y/o Logon:

public static User GetUserByUserName(String userName)
{
 var dirSearch = new DirectorySearcher(GetDirectoryEntry);
 dirSearch.Filter = "(&(objectClass=user)(SAMAccountName=" + userName + "))";
 SearchResult results = dirSearch.FindOne();
 if (results != null)
 {
    var tempUser = new DirectoryEntry(results.Path);
    return ToUser(tempUser);
 }
 return null;
 }

Para la propiedad DirectorySearcher.Filter que recibe un String, hay ciertos caracteres que permiten realizar una búsqueda específica:

  • Los asteriscos (*) permiten un “auto-completar” espacios de los campos. Ej:
    search.Filter = "(name=*rafael nolasco*)";

donde los resultados podrían ser:

- Rafael Nolasco Perez
- Manuel Rafael Nolasco Rodriguez
  • Los And/Or u operadores lógicos (| y &) que permiten servir de condicionantes:
searcher.Filter =  "(&(objectClass=user)(|(ipPhone=*" + id + ")(pager=*" + id + ")))";

NOTA: Usar ambas referencias (using) de los namespaces/librerías no harán colisión.

Validación / Autenticación

 using (var context = new PrincipalContext(ContextType.Domain))
 {
       return context.ValidateCredentials(user, password); // returns boolean
 }

Sources

https://bitbucket.org/corderoski/blog-examples/src/…/activeDirectory/

Referencias

Seguridad Informática – Active Directory, http://danielomarrodriguez.blogspot.com/2008/01/active-directory.html

 Happy Coding ✌
Anuncios

¿Quieres agregar algo?

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s