Hoy he tenido un pequeño "debate" con un par de compañeros acerca del tema de problemas que tenemos en la empresa con una máquina clonada. Eso nos ha llevado al tema de los SID (identificadores usados en Windows para máquinas y cuentas de usuario) y la herramienta NewSID de Mark Russinovich (el famoso programador de sysinternals).
Russinovich se dio cuenta, cuando tuvo que actualizar la herramienta ante la aparición de Windows Vista, de que en realidad no era necesario obtener un nuevo SID en una máquina clonada. ¡Pero si eso llevaba haciéndose, sin cuestionarse, desde 1997! (y 12 años después descubrió que era innecesario).
Bueno, Sergio de los Santos, de Hispasec, lo explica mejor que yo, así que aquí tenemos el enlace para entender los detalles técnicos y el porqué de una herramienta que se vino utilizando por inercia psicológica, porque, como dice el autor, "todo el mundo asumió que otra persona sabría exactamente cuál era el problema"
El original, en inglés, escrito por el propio Russinovich:
http://blogs.technet.com/b/markrussinovich/archive/2009/11/03/3291024.aspx
Para quienes prefieran leerlo en español (yo, por ejemplo ;-)
Parte 1:
http://unaaldia.hispasec.com/2010/05/la-noticia-no-es-nueva-realmente-se.html
Parte 2:
http://unaaldia.hispasec.com/2010/05/es-casi-seguro-que-todos-los-usuarios-y.html
The power of myths.
Por cierto, dos curiosidades acerca de Russinovich: Una, que con ese nombre tan cirílico, resulta que nació en... ¡Salamanca! ¡Olé! Y la otra, que el año pasado publicó una novela: Zero Day.
Habrá que leerla.
viernes, 13 de abril de 2012
miércoles, 7 de marzo de 2012
Descargar https://algo en IE - Cabeceras PHP
¡Buf! Bueno, me ha costado, pero al final ha salido. Resulta que tengo una aplicación web que genera en un momento dado un fichero de Excel. Cuando he habilitado la famosa "s" para añadir cifrado a las páginas, pasando del HTTP al HTTPS, pues resulta que el fichero Excel me lo descargaba bien con Firefox y con Chrome, pero se interrumpía la descarga con IE 9.
Tras unas 3 ó 4 horas leyendo, al final he detectado el problema, pero encontré una solución que tenía un error tipográfico y eso me llevó loco. La clave está en enviar una cabecera en la página que produce la página. Antes, tenía estas 2 cabeceras:
header("Content-type: application/vnd.ms-excel");
header("Content-Disposition: filename=\"TABLA.XLS\";");
Ahora, he tenido que añadir esta tercera:
header("Cache-Control: max-age=1");
Básicamente, lo que eso hace es permitir que la página cifrada se cachee en un fichero temporal. Si no queremos que eso ocurra (poniéndonos un poco paranoicos con la seguridad, que es lo que me pasa a mí), pues pedimos que el tiempo máximo de duración del fichero cacheado sea de 1 segundo.
Si queréis la explicación detallada, aquí la mejor página de las que he leído con la explicación:
viernes, 13 de enero de 2012
SQL - Seleccionar sólo las primeras N filas
El otro día metí la pata haciendo un SELECT genérico de una tabla de la que desconocía el tamaño. El procesador se puso casi al 100% durante 5 minutos, y el disco duro no dejaba de rascar. Los usuarios que compartían (sufrían) conmigo el acceso a la BD estuvieron experimentando un rendimiento pésimo durante esos 5 minutos (bueno, los pocos que intentaron trabajar en ese período), que a mí se me hicieron eternos. El problema es que la tabla tenía casi 2 millones de registros y esto fue er... bueno... "un poco" pesado. Encima, el resultado fue a una página web, así que os podéis imaginar el tamaño del "ascensor" (el recuadro) de la barra de desplazamiento. Casi no se podía pinchar en él de pequeño que se quedó.
El caso es que me interesaba simplemente ojear el contenido de esa tabla, me hubiera bastado con recuperar unos pocos registros, digamos, unos 100 para hacerme una idea de su contenido. Bueno, pues eso se puede hacer sin necesidad de poner filtros a los datos (cosa que en su momento no podía hacer pues no tenía ni idea de los campos y datos de la tabla).
En MS SQL Server y en SYBASE
SELECT TOP 10 * FROM TABLA
En INFORMIX
SELECT FIRST 100 * FROM TABLA
Actualización 02/09/2014 para incluir SQLite3, que me ha hecho falta hoy. Hay que añadir LIMIT(N) al final de la consulta
En SQLite3
SELECT * FROM TABLA LIMIT(100)
Si hubiera cláusulas WHERE u ORDER BY, hay que poner la opción LIMIT al final de todo, o sea:
SELECT * FROM TABLA WHERE CONDICION ORDER BY CAMPO LIMIT(100)
El caso es que me interesaba simplemente ojear el contenido de esa tabla, me hubiera bastado con recuperar unos pocos registros, digamos, unos 100 para hacerme una idea de su contenido. Bueno, pues eso se puede hacer sin necesidad de poner filtros a los datos (cosa que en su momento no podía hacer pues no tenía ni idea de los campos y datos de la tabla).
En ORACLE
SELECT * FROM TABLA WHERE ROWNUM <100En MS SQL Server y en SYBASE
SELECT TOP 10 * FROM TABLA
En INFORMIX
SELECT FIRST 100 * FROM TABLA
Actualización 02/09/2014 para incluir SQLite3, que me ha hecho falta hoy. Hay que añadir LIMIT(N) al final de la consulta
En SQLite3
SELECT * FROM TABLA LIMIT(100)
Si hubiera cláusulas WHERE u ORDER BY, hay que poner la opción LIMIT al final de todo, o sea:
SELECT * FROM TABLA WHERE CONDICION ORDER BY CAMPO LIMIT(100)
viernes, 16 de diciembre de 2011
Apagado remoto de un equipo en un dominio Windows
Forma alternativa, si no se tienen instaladas las pstools
shutdown -s -f -m \\equipo
shutdown -s -f -m \\equipo
lunes, 28 de noviembre de 2011
Ruta de la BD actual en MS Access VBA
Pues eso:
Public Function GetDBPath() As String
GetDBPath = CurrentProject.Path & "\"
End Function
Más detalles aquí:
http://www.ammara.com/access_image_faq/get_mdb_database_path.html
GetDBPath = CurrentProject.Path & "\"
End Function
Más detalles aquí:
http://www.ammara.com/access_image_faq/get_mdb_database_path.html
jueves, 13 de octubre de 2011
Las dichosas eñes - PHP + Informix + SQLite3
En PHP, al migrar datos de una BD Informix a una SQLite3, me he encontrado con que las eñes se grababan mal. Los datos los recupero así:
Solución: usar la función utf8_encode.
Y todo funciona a la perfección.
$ape1=trim(odbc_result($rs,"ape1"));
Solución: usar la función utf8_encode.
$ape1=utf8_encode(trim(odbc_result($rs,"ape1")));
Y todo funciona a la perfección.
martes, 6 de septiembre de 2011
Obtener la fecha y hora en una cadena (Windows)
Esto es útil para generar automáticamente ficheros que incluyen en su nombre la fecha y hora (normalmente, copias de seguridad). Normalmente, yo lo utilizo en ficheros de script (CMD o BAT).
set HH=%time: =0%
set FECHA=%date:~-4,4%%date:~-7,2%%date:~0,2%%HH:~0,2%%time:~3,2%
Con esto, ya podemos generar un fichero como
Seguro que se puede hacer en una línea, pero me salió así y tampoco me quise calentar mucho más la cabeza. Ahora, si alguien tiene la solución elegante y me la manda, la pondré aquí.
set HH=%time: =0%
set FECHA=%date:~-4,4%%date:~-7,2%%date:~0,2%%HH:~0,2%%time:~3,2%
Con esto, ya podemos generar un fichero como
echo "realizando tarea" > log_%FECHA%.log
Seguro que se puede hacer en una línea, pero me salió así y tampoco me quise calentar mucho más la cabeza. Ahora, si alguien tiene la solución elegante y me la manda, la pondré aquí.
miércoles, 31 de agosto de 2011
Ejecutar aplicaciones en un equipo remoto con Pstools
Para ejecutar un programa en otro equipo de nuestra red, las pstools son una muy buena opción.
Descarga: http://technet.microsoft.com/es-es/sysinternals
Una vez instaladas, añadir al path (Mi Pc, clic derecho, Propiedades, Opciones avanzadas, Variables de entorno) la ruta de instalación.
Y ahora, los ejemplos:
Con pskill también podemos matar procesos que no hayamos iniciado remotamente, por si alguien imaginaba que sólo podíamos matar los lanzados con psexec.
Descarga: http://technet.microsoft.com/es-es/sysinternals
Una vez instaladas, añadir al path (Mi Pc, clic derecho, Propiedades, Opciones avanzadas, Variables de entorno) la ruta de instalación.
Y ahora, los ejemplos:
Ejemplo 1. Ejecutar la calculadora de windows en el otro equipo
psexec \\direccion_ip -u dominio\usuario -p password -i calc
(si no ponemos la -p password, nos la pedirá en el momento de ejecutar)
Ejemplo 2. Ejecutar un programa que no existe en el equipo remoto (opción -c, copiar)
psexec \\direccion_ip -u dominio\usuario -i -c ejecutable.exe
Ejemplo 3. Matar el proceso
pskill \\direccion_ip -u dominio\usuario ejecutable
(no es necesario poner .exe)Con pskill también podemos matar procesos que no hayamos iniciado remotamente, por si alguien imaginaba que sólo podíamos matar los lanzados con psexec.
Ejemplo 4. Apagar el equipo remoto
psshutdown \\direccion_ip -u dominio\usuario
Se muestra un aviso y una cuenta atrás de 20 segundos
martes, 30 de agosto de 2011
Cuenta atrás en una página web (Javascript) para redirigir a otra página
Útil para mostrar un aviso durante unos segundos (por ejemplo, "Este mes finaliza el plazo para presentar la declaración de la renta") y luego cargar la "verdadera" página de inicio del sitio web.
Guardar el texto siguiente un un fichero con nombre "atras.htm"
Guardar el texto siguiente un un fichero con nombre "atras.htm"
<html> <head> <title> Ejemplo de cuenta atrás </title> </head> <body> <h1>Ejemplo de cuenta atrás</h1> <form name="redirect"> <h2>Vamos contando... <span id="Segundos"></span> <input type="hidden" size="3" name="contador"> segundos restantes </h2> </form> <script language="javascript"> var targetURL="atras.htm" //URL A LA QUE DIRIGIR. Redirige a sí misma var cuentaAtras=10 //SEGUNDOS A CONTAR var segundoActual = document.redirect.contador.value=cuentaAtras+1 function contarParaRedireccionar(){ if (segundoActual!=1){ segundoActual-=1 var textoSegundos = document.getElementById("Segundos"); textoSegundos.innerHTML =segundoActual } else { window.location=targetURL return } setTimeout("contarParaRedireccionar()",1000) } contarParaRedireccionar() </script> <p>Si no se le redirige automáticamente, pulse <a href="atras.htm">aquí</a></p> </body> </html>
Suscribirse a:
Entradas (Atom)