domingo, 21 de diciembre de 2008

Consultar usuarios de Active Directory desde C#

Algo que puede resultar muy útil en algunos casos es tener que consultar información de los usuarios de la red dados de alta en Active Directory desde nuestra aplicacion, en este caso con C#.


Para comenzar deberemos tener en cuenta que es necesario poder contar con un usuario dado de alta en Active Directory, aunque con mínimos permisos. Este usuario con el que deberemos contar sera el usuario que se conecte a nuestro Active Directory(en el caso del código este ejemplo debería agregarse su información en nuestro web.config). Y servirá para el caso en el que querramos obtener por ejemplo el correo electrónico, nombre, apellido, o algún otro dato de cualquier usuario, solo teniendo su loguin por ejemplo.

Yendo puntualmente a la solución de nuestro problema, lo primero que deberemos hacer en nuestro proyecto es referenciar al assembly System.DirectoryServices, posteriormente deberemos hacer un using de la misma





Así de simple podremos consultar la información de nuestros usuario de la siguiente manera

Si bien el código que sigue no tiene grandes complicaciones, básicamente consta de dos clases (en el mismo archivo ), que para el caso de la primero solo modela un usuario con sus propiedades y la segunda contiene un método con el comportamiento necesario para conectarse a nuestro AD, a través del usuario configurado en algún archivo de configuracion.


using System;
using System.Collections.Generic;
using System.Text;
using System.Configuration;
using System.DirectoryServices;
namespace FindUSers
{
    public class Usuarios
    {
        private int id_User;
        public int Id_User
        {
            get { return id_User; }
            set { id_User = value; }
        }
        private string login;
        public string Login
        {
            get { return login; }
            set { login = value; }
        }
        private string password;
        public string Password
        {
            get { return password; }
            set { password = value; }
        }
        private string email;
        public string Email
        {
            get { return email; }
            set { email = value; }
        }
        private string lastName;
        public string LastName
        {
            get { return lastName; }
            set { lastName = value; }
        }
        private string names;
        public string Names
        {
            get { return names; }
            set { names = value; }
        }
  
    }
    public class GetUsersInfo
    {
        public List<Usuarios> FindName(Usuarios usuario)
        {
            //This info can become from web.config
         
                string userAD = ConfigurationSettings.AppSettings["UserAD"];
                string passAD = ConfigurationSettings.AppSettings["PassAD"];
                string ldap = "LDAP://" + ConfigurationSettings.AppSettings["LDAP"];
                string strSearchAD = "";
                if (usuario.Email != "")
                {
                    strSearchAD = "(mail=" + usuario.Email.ToLower() + ")";
                }
                if (usuario.LastName != "")
                {
                    strSearchAD += "(sn=" + usuario.LastName + ")";
                }
                if (usuario.Login != "")
                {
                    strSearchAD += "(sAMAccountName=" + usuario.Login + ")";
                }
                List<Usuarios> listUsuarios = new List<Usuarios>();
                //DirectoryEntry adEntry = new DirectoryEntry("LDAP://Domaincontroler", "user", "pass", AuthenticationTypes.Secure);
                DirectoryEntry adEntry = new DirectoryEntry(ldap, userAD, passAD, AuthenticationTypes.Secure);
                System.DirectoryServices.DirectorySearcher adSearch = new System.DirectoryServices.DirectorySearcher(adEntry);
            
                adSearch.Filter = "(&(objectClass=user)" + strSearchAD + ")";
                SearchResultCollection objResultados;
                //adResult = adSearch.FindOne(); // if only i need the first returned user 
                objResultados = adSearch.FindAll();
                foreach (SearchResult MiObjeto in objResultados)
                {
                    Usuarios usarioToAdd = new Usuarios();
                    usarioToAdd.Email = MiObjeto.Properties["mail"][0].ToString();
                    usarioToAdd.Login = MiObjeto.Properties["sAMAccountName"][0].ToString();
                    usarioToAdd.Names = MiObjeto.Properties["givenName"][0].ToString();
                    usarioToAdd.LastName = MiObjeto.Properties["sn"][0].ToString();
                    listUsuarios.Add(usarioToAdd);
                }
                return listUsuarios;
       
        }
    }
}

Adjunto el código correspondiente al proyecto en el que se encuentra el archio .cs con las dos clases del ejemplo (recuerden agregar un archivo .config con las entradas necesarias ), espero que sirva.

Ariel Serlin

Para bajar el codigo hace click aqui

1 comentario:

Dante Valencia dijo...

amigo tengo una duda por favor si puedes ayudarme, lo que quiero hacer es que al hacer login en la computadora ya se guarden los datos de mi usuario asi que al tener que entrar a algun programa que tengo en C# ya me reconosca nivel , nombre y todos los campos que quiera... no se si me hago entender bien
le dejo mi correo por favor para que pueda ayudarme. dante.valencia92@gmail.com