Inicio > C++/CLI, Código y ejemplos > Código para buscar usuario en directorio activo por su cuenta

Código para buscar usuario en directorio activo por su cuenta


Ando apoyando a un colega, quien está trabajando en un programa para SharePoint que sincronice información de usuarios hacia el directorio activo. Como no sabía cómo hacerle, le ayudé creando un pequeño ejemplo en C++/CLI, el cual con gusto comparto con ustedes. Ya les tocará pasarlo a C#… Smile with tongue out


#include "stdafx.h"

using namespace System;
using namespace System::DirectoryServices;

int main(array<String^>^ args)
{
    bool exit = false;

    do 
    {
        Console::WriteLine(L"Por favor ingresa tu usuario. ");
        String^ account = Console::ReadLine();

        Console::WriteLine(L"\nBuscando información para usuario...\n\n");

        try
        {
            auto root = gcnew DirectoryEntry(L"LDAP://DC=scanda,DC=com,DC=mx");
            auto searcher = gcnew DirectorySearcher(root);
            searcher->Filter = String::Format(L"(SAMAccountName={0})", account);
            
            searcher->PropertiesToLoad->Add(L"userprincipalname");
            searcher->PropertiesToLoad->Add(L"displayName");
            searcher->PropertiesToLoad->Add(L"givenname");
            searcher->PropertiesToLoad->Add(L"sn");
            searcher->PropertiesToLoad->Add(L"company");
            searcher->PropertiesToLoad->Add(L"title");
            searcher->PropertiesToLoad->Add(L"description");
            searcher->PropertiesToLoad->Add(L"wwwhomepage");
            searcher->PropertiesToLoad->Add(L"physicaldeliveryofficename");
            searcher->PropertiesToLoad->Add(L"streetaddress");            
            searcher->PropertiesToLoad->Add(L"postalcode");
            searcher->PropertiesToLoad->Add(L"st");
            searcher->PropertiesToLoad->Add(L"ipphone");
            
            auto result = searcher->FindOne();

            if (result == nullptr)
                throw gcnew Exception(L"Usuario no encontrado.");

            for each (String^ prop in result->Properties->PropertyNames)
            {
                if(prop->Equals(L"adspath"))
                    continue;

                Console::Write(L"{0}: ", prop);
                for each (Object^ value in result->Properties[prop])
                {
                    Console::Write(L"{0}\n", value);
                }
            }
        }
        catch (Exception^ ex)
        {
            Console::WriteLine(ex->Message);
        }
        finally 
        {
            Console::WriteLine(L"\n\n¿Desea hacer otra consulta? [Y/N]");
            auto key = Console::ReadKey(true);
            exit = key.Key != ConsoleKey::Y;
            Console::Clear();
        }
    } while (!exit);

    
    return 0;
}

 

Algunos comentarios. En la línea 20 creamos un objeto DirectoryEntry que representará la raíz de donde buscaremos. En este caso, si nuestra red tiene el dominio dominio.com.mx creamos el objeto y le pasamos la dirección LDAP correspondiente. En la línea 21 creamos un DirectorySearcher y le pasamos como parámetro al constructor el DirectoryEntry creado. Nota: si no quieres buscar en un dominio específico, no crees el DirectoryEntry y utiliza el constructor por default del DirectorySearcher.

Luego, en la línea 22 establecemos el filtro. Si queremos buscar a “fernando.gomez”, entonces el filtro debe ser “(SAMAccountName=fernando.gomez)”. Nota que la cuenta va SIN EL DOMINIO y encerrado todo entre paréntesis.

A continuación, de las líneas 23 a 36, le decimos al objeto qué propiedades debe cargar. Ahí tienes algunas, como los nombres, el apellido, algunos campos de direcciones, etc. Si quieres cargar todas las propiedades, entonces deja vacía la colección PropertiesToLoad y ya.

Luego, línea 38: Ejecutamos la búsqueda. El método FindOne busca el primer elemento que concuerde. Dado que buscamos por SAMAccountName, y dado que sólo debería existir una cuenta por dominio, es seguro usar el FindOne. Si buscaras por algún otro atributo, entonces te interesaría usar el método FindAll, que te regresa la colección entera.

Luego, de las líneas 43 a 52 iteramos sobre el resultado. Nota que éste es un diccionario, con cadenas de texto como llave (el nombre de la propiedad) y como una colección de valores como valor. De ahí que tengamos que hacer una doble iteración. Para muchas propiedades, el valor es uno sólo. Pero hay algunas que tienen varios valores. Por ejemplo, “memberof” suele tener varios valores, dependiendo de a qué unidades organizacionales el usuario pertenece.

Por supuesto, el valor puede ser de diferente tipo de dato, dependiendo de la propiedad. Hay algunos que son byte[], por ejemplo. Pero bueno, ya es cuestión de que le vayas jugando.

 

Post Scriptum:

Si alguien traduce esto a C#, ¡comparta! Lo hice en C++/CLI porque ando probando el Visual Studio 11 Beta, y andaba viendo cómo el intellisense para C++/CLI anda medio atrofiado (curiosamente funciona perfecto con C++ nativo) cuando mi compañero me preguntó. En fin, no creo que sea muy difícil de entender. Nos vemos la próxima.

Categorías:C++/CLI, Código y ejemplos Etiquetas:
  1. Xavier Alejo
    marzo 17, 2014 a las 2:03 pm

    Muchas gracias por tu post, me apoyo en mucho.

    Pero tengo una duda, por lo que entiendo DC hace mención del dominio, pero en mi código también me muestra CN, ¿Sabes a que se refiere?

    Saludos

    • marzo 17, 2014 a las 2:41 pm

      CN significa Common Name, y hace referencia al nombre del objeto que estás intentando localizar. Por ejemplo:

      CN=Juan Pérez,OU=Users,DC=contoso,DC=com

      busca el nombre “Juan Pérez” dentro del objeto Users, dentro del controlador de dominio contoso, dentro del controlador de dominio com. Cuando haces búsquedas de AD, el CN lo usas normalmente como el último nodo, el más específico, de la jerarquía de objetos sobre la cual buscas.

      ¡Saludos!

  2. juan carlos
    mayo 27, 2014 a las 4:00 pm

    Orale wey pasalo a C#

  3. KatiFranco
    agosto 25, 2014 a las 10:03 am

    Hola, muchísimas gracias por el post..
    tengo una consulta alguien sabe como se obtiene el OU que entiendo que viene a ser el nombre de la organizacion / agencia… necesito ese dato pero no lo puedo obtener…

  1. abril 2, 2012 a las 2:34 pm
  2. abril 13, 2012 a las 4:05 pm
  3. abril 23, 2012 a las 12:14 pm

Responder

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