Esta semana tuve que implementar una serie de consultas sobre dos directorios LDAP: un directorio activo de Microsoft y otro OpenLDAP. La intención era comprobar la fecha en la que los usuarios se habian cambiado la contraseña y compararlas. Esta información se almacena en el atributo pwdLastSet,en el directorio activo y en el atributo sambaPwdLastSet en OpenLDAP.
Para el caso de OpenLDAP, ya tenia experiencia con trabajar con este atributo y su valor contiene el TimeStamp Unix de la fecha en la que el usuario se cambió la contraseña: Esto es el número de segundos transcurridos desde las 0 horas del 1 de Enero de 1970 (UTC/GMT). Esta forma de medir el tiempo es bastante habitual y extendida en diferentes lenguajes de programación (Java, Perl, Python, Bash, Ruby) y sistemas (Unix, MySQL, Postgres, Oracle, etc), como encontramos en www.epochconverter.com.
Mi sorpresa sucede cuando descubro el formato de fecha que usa el valor del atributo pwdLastSet del directorio activo: el número de intervalos de 100 nanosegundos, transcurridos desde las 0 horas del 1 de Enero de 1601, tal y como se describe en http://msdn.microsoft.com/en-us/library/ms974598.aspx.
Hice un pequeño programa en C para Unix, con el fin de poder convertir rápidamente desde el formato de Windows al de Unix, y poder usarlo en mis scripts:
#include
#include
int main (int argc, char *argv[] ) {
/* Comprobar argumentos */
if ( 2> argc ) {
fprintf(stderr,"ERROR: Debes pasar un valor numerico (de ActiveDir: pwdLastSet)\n");
return 1;
}
/* Constante de conversion */
long int c1= 0x19db1ded53e8000L;
/* Obtener el numero en base 10 */
char * pEnd;
long int li1;
li1 = strtol (argv[1],&pEnd, 10 );
/* Convertir a UnixEpoch */
li1 = ( li1 - c1 ) / 10000000 ;
/* Mostrar en pantalla */
printf ("%ld", li1 );
return 0;
}
Después de esto me planteé varias preguntas, a las que no encontré respuesta: ¿por qué Microsoft siempre hace estas cosas?, ¿por qué se empeñan en reinventar lo globalmente aceptado como referencia o estandard por la comunidad? ¿por qué usaron 1601, y no 1901, o 1001? ¿por qué usar intervalos de 100-nanosegundos, y no nanosegundos directamente o microsegundos, o simplemente segundos? ¿qué ganan con todo esto, aparte de torturar a la gente que realizamos integraciones, con algunos de sus deficientes productos?.
La foto la he sacado de www.ecualug.org.
1 comentario:
Usan el calendario gregoriano, que tiene su inicio en ese año.
También me volví loco con ese número ;)
Publicar un comentario