Snippet Consultar Active directory / LDAP

Este post trata de como consultar de una manera sencilla el Active Directory/LDAP corporativo, en concreto se extraerá la fecha de caducidad de una cuenta conociendo el login.

Antes de nada, hay que tener en cuenta que LDAP almacena las fechas a partir de los segundos transcurridos desde el 1 de enero de 1601. Por ello vamos a introducir en el código la siguiente función que nos ayudará a tratar con este tipo de fechas:

/// <summary>
/// Esta función convierte el tiempo de LDAP (AD) en una variable DateTime
/// </summary>
/// <param name="accountExpires">LDAP time</param>
/// <returns>La representación datetime del LDAP</returns>
static DateTime longToDatetime(Int64 accountExpires) {
      DateTime expireDate = DateTime.MaxValue;
      if (!accountExpires.Equals(Int64.MaxValue))
           expireDate = DateTime.FromFileTime(accountExpires);

       return expireDate;
   }

A continuación viene el código que tiene algo más de chicha, el acceso a AD:

public class UserResult {
        public String Name;
        public DateTime ExpireDate;
    }
 static UserResult GetUser(String userId)
        {
            UserResult res;
            DirectoryEntry searchRoot = new DirectoryEntry(dominio, "user","password");
            DirectorySearcher search = new DirectorySearcher(searchRoot);
            search.Filter = "(&(objectClass=user)(samaccountname="+userId+"))";
            search.PropertiesToLoad.Add("accountExpires");
            search.PropertiesToLoad.Add("samaccountname");
            SearchResult result;
            SearchResultCollection resultCol = search.FindAll();
            if (resultCol == null) { return null; }
            result = resultCol[0];
            res = new UserResult();
            res.ExpireDate = longToDatetime((Int64)result.Properties["accountExpires"][0]);
            res.Name = (string)result.Properties["samaccountname"][0];
            return res;
            
        }

El codigo anterior se conecta al active directory especificado por la variable dominio y por un usuario que tenga privilegios en el AD.

El string de domintio tiene que tener la forma:

const string dominio= "LDAP://DC=organizacion,DC=com";

Serializar y deserializar en C#

Cuantas veces hemos tenido que utilizar una lista de objetos y la queremos exportar en texto o queremos que los datos no estén incrustados en la App,..

Bueno pues aquí dejo 2 funciones para poder serializar y desserializar listas de objetos.

Serializar:

        public static void Serialize( List<T> list, string fileName)
        {
            var serializer = new XmlSerializer(typeof(List<T>));
            using (var stream = File.OpenWrite(fileName))
            {
                serializer.Serialize(stream, list);
            }
        }

Deserializar:

        public static void Deserialize( List<T> list, string fileName)
        {
            var serializer = new XmlSerializer(typeof(List<T>));
            using (var stream = File.OpenRead(fileName))
            {
                var other = (List<T>)(serializer.Deserialize(stream));
                list.Clear();
                list.AddRange(other);
            }
        }

Espero que os sea útil

Accediendo a contenidos tras un formulario de autenticación

Buenos días a todos,

Desde hace unos días estoy trabajando en la automatización de tareas repetitivas que consumen mucho tiempo. Una de las tareas era generar unos informes desde una máquina ACS de CISCO, esta máquina genera internamente el informe de usuarios conectados cada día a la red Wireless pero yo necesita obtener esos datos para introducirlos en un Excel. Por eso me puse en contacto con la gente de cisco pero sus ingenieros me contestaron que eso era una tarea imposible y que si lo quería tenía que cambiar el aparato entero.

Investigando un poco la web que generaba el informe vi que obtenía la información de la URL:

https://x.x.x.x/acsview/LoadTopNAuthenticationsPortlet.do?protocol=RADIUS&trend=ACS&timerange=LAST7DAYS&count=5&status=PASSED

donde x.x.x.x es la url del ACS.

Mi primera opción para descargarmelo fue usar C# con un HttpWebRequest pero al estar tras una página de login un poco extraña me fallaba ya que hacía varias redirecciones y no me guardaba las cookies correctamente entre la petición de login y la de descarga la información.
Sigue leyendo

Automatizando builds con CMAKE

Algunos programadores del mundillo GNU ya se han dado cuenta de que Make te simplifica la vida a la hora de compilar, pero es algo complicado de configurar. Por ello, hoy voy a enseñar como crear un proyecto C++ y automatizar la compilación con CMake.

Nuestra estructura de proyecto va a ser:

\build
\src\main.cpp
\src\CMakeLists.txt
\doc\Doxygen.in

Para empezar, como es costumbre debemos instalar la herramienta cmake, y doxygen si queremos generar la documentación.
Sigue leyendo