AndorraDotNet

Comunitat d'usuaris .NET del pais dels pirineus
¿No perteneces a AndorraDotNet? ¡Regístrate y sé un miembro!
Iniciar sesión | REGÍSTRATE AQUÍ | Ayuda
en Buscar

400 Bad Request

Dímelo con flores ;-)

Corrección función getUserLDAPProperties

_tipex

Corrección aplicable al post:

http://geeks.ms/blogs/lfranco/archive/2008/07/08/accediendo-al-directorio-activo-de-la-organizaci-243-n-desde-net-iv.aspx

Ayer estuve revisando una de las funciones de la librería LDAPservices, que se encarga de devolver los nombres de las propiedades del objeto usuario dentro del AD. Hoy os publico una corrección, ya que observé que la función no devolvía correctamente todos los nombres de propiedades.

Este bug es producido porque en la función se utiliza un objeto DirectorySearcher para devolver todos los objetos de tipo usuario en el AD, a continuación lee los nombres de las propiedades del primer usuario encontrado y los inserta en una colección. A continuación la función no continúa procesando el resto de usuarios, ya que deberían tener las mismas propiedades, no? Pues no. Para mi sorpresa resulta que sólo se devuelven aquellas propiedades del usuario que han sido informadas:

public static List<string> 
    getUserLDAPProperties(string LDAPURL)
{
    List<string> properties =new List<string>();
    DirectoryEntry entries = new DirectoryEntry(LDAPURL);
    DirectorySearcher searcher = new DirectorySearcher(
        entries, "(&(objectCategory=person)(objectClass=user))");
    try
    {
        foreach (SearchResult result in searcher.FindAll())
        {
            foreach (string property in
                result.GetDirectoryEntry().Properties.PropertyNames)
            {
                properties.Add(property);
            }
            break;                    
        }
    }
    catch (Exception ex)
    {
        throw ex;
    }
    return properties;
}

Para solucionar este bug, hay que procesar las propiedades de todos los usuarios, quedando el código de la función así como sigue:

foreach (SearchResult result in searcher.FindAll())
{
    foreach (string property in
        result.GetDirectoryEntry().Properties.PropertyNames)
    {
        if(!properties.Contains(property)) properties.Add(property);
    }
}

Como veis, se suprime el break que terminaba el bucle y se añade una condición para que se agreguen a la colección sólo aquellos nombres de propiedad que no se han agregado previamente.

Saludos y happy coding!!!

** crossposting desde el blog de Lluís Franco en geeks.ms **

Comentarios

Aún no ha hecho nadie ningún comentario. Escribe alguno y sé el primero :P

About lfranco

Nacido en 1971 en Barcelona (España), Lluís Franco es MVP en la categoría de Visual Developer desde 2003, MCP Developer, Project Manager y desarrollador en Fimarge Societat Gestora de Patrimonis, situada en Andorra. Desde 1994, ha estado principalmente trabajando en el desarrollo de aplicaciones sobre plataformas Windows. Está especializado en desarrollos financieros con Visual Basic, SQL Server y últimamente C# y ASP.NET. Ha colaborado con campusMVP impartiendo formación sobre ADO.NET, juntamente con otros MVPs como José M. Alarcón Aguín, Rodrigo Corral, Octavio Hernández, Iván González, Alejandro Mezcua, Salvador Ramos, Guillermo Som, "El Guille" o Unai Zorrilla Castro. Mantiene varios sitios Web y blogs, y también colabora con publicaciones especializadas como dotnetmania.
Ofrecido por Community Server (Commercial Edition)