Escritorios virtuales para Windows 7/8

Introducción

Windows-8-Logo-OfficialUna -de las muchas- cosas que extraño de los ambientes de escritorio de GNU/Linux en las contadas ocasiones en las que debo utilizar Windows son los escritorios virtuales.

Había probado soluciones que emulaban los escritorios virtuales minimizando las aplicaciones cada vez que se cambiaba de escritorio, esto por supuesto era una solución poco elegante.  También encontré soluciones de terceros como Dexpot que parece ser muy utilizado, sin embargo es un producto comercial (free for personal use only).

Lo interesante que encontré hoy es que utilizando una herramienta muy simple es posible activar un API en Windows 7 y 8 que permite en buena medida tener escritorios virtuales.  Este software desarrollado por Windows Sysinternals permite tener cuatro escritorios virtuales y elegir las teclas a utilizarse para intercambiarlos.  No provee ningún tipo de animaciones o funcionalidades adicionales pero cumple bastante bien su función básica.

Instalación y uso

Del sitio web de la aplicación Desktops v2.0 se descarga un archivo .zip el cual debe descomprimirse y ubicarse en la ubicación donde permanecerá finalmente (bajo \Program Files por ejemplo).

cc817881.desktops(en-us,MSDN.10)

Al ejecutarse el programa aparece el diálogo de opciones que permite elegir la combinación de teclas que cambiará entre los escritorios.

cc817881.desktops2(en-us,MSDN.10)

La única consideración que debe tenerse en cuenta es que el programa debe estarse ejecutando todo el tiempo que se desee tener acceso a los escritorios virtuales, así que puede ser buena idea seleccionar la casilla Run automatically at logon en el diálogo de opciones.

Recursos

Cambiar una contraseña de Windows 7 desde Linux Ubuntu 14.04 utilizando chntpw

Introducción

A continuación se describen los pasos necesarios para modificar una contraseña de un usuario de Windows desde Linux Ubuntu, para seguirlos es necesario poder montar la partición física donde se encuentra instalado Windows desde la máquina que ejecuta el Linux.

Este procedimento es útil para recuperar el acceso de usuarios que han olvidado su contraseña (especialmente los administradores).

Instalación de chntpw

$ sudo aptitude install chntpw

Identificar el sistema operativo del usuario

En una terminal montar la partición donde se encuentra el Windows que contiene al usuario cuya contraseña se va a modificar y ubicarse en el directorio System32/config.

$ cd /windows/Windows/System32/config

Gestionar la información de la cuenta

Listar la información de las cuentas de usuario disponibles en el sistema operativo.

$ sudo chntpw -l SAM

chntpw version 0.99.6 110511 , (c) Petter N Hagen
Hive <SAM> name (from header): <SystemRootSystem32ConfigSAM>
ROOT KEY at offset: 0x001020 * Subkey indexing type is: 666c <lf>
File size 262144 [40000] bytes, containing 6 pages (+ 1 headerpage)
Used for data: 247/20352 blocks/bytes, unused: 18/4032 blocks/bytes.


* SAM policy limits:
Failed logins before lockout is: 0
Minimum password length        : 0
Password history count         : 0
| RID -|---------- Username ------------| Admin? |- Lock? --|
| 01f4 | Administrador                  | ADMIN  | dis/lock |
| 01f5 | Invitado                       |        | dis/lock |
| 03e8 | Usuario                        | ADMIN  |          |

Modificar la contraseña del usuario Usuario.

$ sudo chntpw -u Usuario SAM

Puede elegir una de las siguientes opciones a realizar sobre la contraseña.

  • Dejar la cuenta sin contraseña (1).
  • Especificar una nueva contraseña para la cuenta (2).
  • Promover al usuario a Administrador (3).
  • Desbloquear y activar la cuenta (4).

Recursos

Errores "Connection reset by peer" durante la conexión a Windows con rdesktop

Introducción

Durante la conexión a máquinas Windows desde Linux Ubuntu utilizando el protocolo Remote Desktop y a rdesktop como herramienta se empezaron a obtener errores de conexión como el siguiente.

ERROR: recv: Connection reset by peer

El problema

rdesktop permite la conexión de escritorio remoto entre máquinas Windows y otros sistemas operativos como Linux, sin embargo no soporta aún el nivel de autenticación de red que implementa por defecto el servicio de Remote Desktop.

La solución

En la máquina Windows que se encuentra ejecutando el servidor de Remote Desktop acceder a la opción del panel de control de Allow remote access to your computer o acceder directamente a las System Properties.

Allow Remote Access - Remote Desktop
Allow remote access to your computer

En la pestaña de Remote y bajo la sección de Remote Desktop seleccionar la opción Allow connections from computers running any version of Remote Desktop (less secure).  Por defecto se encuentra seleccionada la tercera opción.

Allow connections from any Remote Desktop protocol’s version

Otra alternativa

Como otra alternativa de conexión al escritorio remoto que parece no tener el problema de rdesktop con la autenticación de red es freerdp el cual se invoca desde la línea de comando de la siguiente manera.

$ xfreerdp -u USERNAME -d DOMAIN -p PASSWORD HOST

Esta herramienta incluye un parámetro adicional (-g) que encontré muy interesante y que permite escalar en un porcentaje específico la ventana local en la que se despliega el escritorio remoto.

Recursos

Instalación de Windows XP en un netbook desde una unidad USB

Introducción.

Instalar Windows XP en una netbook (portátil liviano sin unidad de DVD) desde una memoria USB no fue tan fácil y placentero como fue la instalación de Windows 7.  Después de algunas pruebas estos fueron los pasos que se siguieron.

Crear la unidad USB de instalación.

Para crear la unidad USB de instalación se utilizó WinToFlash.  Este procedimiento es muy simple, sólo se debe especificar cual es la unidad en la que se encuentran los archivos (CDROM) de instalación de Windows y cual es la unidad (USB) hacia la cual se realizará la copia.

Instalación del sistema operativo.

Una vez creada la unidad USB de instalación se debe iniciar el sistema desde ella y realizar normalmente los pasos de instalación de Windows XP.

Corregir el inicio de la unidad USB.

Finalizada la instalación del sistema operativo se intenta reiniciar y falla mostrando un error relacionado con la falta de archivos del sistema, comúnmente hal.dll.  Esto aparentemente se debe a que el instalador consideró a la unidad USB  como primer disco y al disco duro real como segundo, generando estas referencias incorrectas en el archivo boot.ini.

Para corregir esto es necesario editar este archivo y modificar la referencia a la partición en la que buscará al sistema operativo durante su inicio.  Por facilidad (para mi) utilicé un Linux (Peppermint) que inicia desde LiveUSB que casualmente tenía preparado para otra prueba.  En el ambiente Windows  imagino que se requerirá de un disco de arranque que permita acceder a través de la consola de texto a los comandos básicos del DOS.

Este es un ejemplo de boot.ini en el que se supone que hay un Windows XP Home Edition instalado en la primera partición del primer disco duro del equipo (como habitualmente sucede).

[boot loader]
timeout=5
default=multi(0)disk(0)rdisk(0)partition(1)WINDOWS
[operating systems]
multi(0)disk(0)rdisk(0)partition(1)WINDOWS=”Microsoft Windows XP Home Edition” /fastdetect

El parámetro rdisk (marcado en rojo) es el que se genera incorrectamente y aparece inicialmente con el valor de 1 (segundo disco duro).

Cambiar la ruta de los archivos de instalación.

Una vez superado el problema anterior el sistema operativo deberá iniciar sin problemas.  De manera opcional elegí copiar los archivos del sistema operativo al disco duro del netbook para que estén disponibles si se hace necesaria la instalación de algún componente adicional sin que se necesite insertar nuevamente la unidad USB preparada al comienzo de este procedimiento.

Para lograr esto además de copiar físicamente los archivos del CDROM de instalación al un directorio del disco duro, es necesario actualizar la referencia que tiene el sistema operativo de esta ruta.  Para hacer esto se debe ejecutar el programa regedit (hágalo como Administrador si obtiene problemas de permisos) y acceda a la siguiente rama en el panel izquierdo.

HKEY_LOCAL_MACHINE > Software > Microsoft > Windows > CurrentVersion > Setup.

Ubicado en esa rama identifique la variable SourcePath en el panel derecho y modifique su valor a la ruta absoluta donde se encuentra el directorio i386 de los archivos de instalación de Windows: c:instaladoreswindowsxpi386 en mi caso específico.

Google Chrome y los puertos inseguros: ERR_UNSAFE_PORT

Introducción.

Aparentemente Google Chrome incluye características de seguridad obligatorias como esta que impide que el usuario acceda a servidores a través de ciertos puertos considerados inseguros aunque eso sea realmente lo que se desea.

Error puertos inseguros de Google Chrome
Error puertos inseguros de Google Chrome

A continuación se define el procedimiento necesario para indicarle a Chrome que efectivamente se desea acceder a esos puertos.

Procedimiento.

La única opción es indicarle a Chrome desde el momento de su ejecución cuales son los puertos que se consideran seguros para permitir conexiones mas allá de los estándar.  Para hacer esto es necesario indicar el parámetro –explicitly-allowed-ports seguido por la lista de puertos separados por comas.  Por ejemplo:

$ /usr/bin/google-chrome –explicitly-allowed-ports=4444,5555,6666

Por facilidad, especialmente en la plataforma Windows, se recomienda modificar el acceso directo a la aplicación para que la modificación perdure.

Recuperar la sesión de Firefox

Introducción.

Firefox tiene una característica que permite recuperar el conetenido de su sesión (las pestañas abiertas) aún después de que ha ocurrido un problema grave de ejecución como es el caso cuando el proceso termina abruptamente o el equipo se apaga sin cerrarse convenientemente.

La siguiente vez que se utiliza Firefox, este permite elegir si se desea iniciar una nueva sesión o si por el contrario se desea restaurar la versión anterior.

Yo acostumbro aprovechar esta característica para trabajar en ciertas páginas web durante varias sesiones sin tomar nota de sus URLs, confiando en que la restauración de sesión las abrirá nuevamente.  Esto ha sido confiable salvo algunas pocas oportunidades en las cuales he perdido la sesión, especialmente molesto cuando por error propio presiono el botón de iniciar una nueva sesión en lugar del de restaurar.

Por suerte Firefox permite recuperar la copia de seguridad de la sesión aún si se ha decidido iniciar una nueva.  El procedimiento es muy simple y se explica a continuación.

Procedimiento.

Tan pronto como se desee recuperar la copia de seguridad de la sesión anterior escribir en la barra de direcciones la siguiente instrucción.

about:sessionrestore

La última sesión disponible se recuperará inmediatamente restaurando las pestañas que se tenía abiertas.

La configuración de la restauración de sesión permite ajustar otros comportamientos relacionados como el forzar a que siempre se restaure la sesión si hay una disponible, restaure automáticamente la siguiente sesión únicamente o desactivar esta característica.

Enlaces.

Calculando hashes (MD5 y SHA1) con C#/Mono

Introducción.

Una función de hashing recibe un bloque de datos arbitrarios y genera de manera determinística un arreglo de bytes con el valor de su hash, el cual tiene como característica el ser único para los datos procesados.

Los valores de hash tienen múltiples usos, entre ellos se utilizan en la criptografía para garantizar que la información de un mensaje no ha sido modificada.  Con este mismo uso, comúnmente se utiliza para determinar si la descarga de archivos ha sido exitosa o no (md5sum).

Existen varios algortimos de hashing, los mas conocidos son MD5 de 128 bits y SHA1 de 160 bits.  El primero de ellos es muy utilizado actualmente, especialmente para el almacenamiento de contraseñas, sin embargo ya no se considera seguro por lo cual es conveniente utilizar el segundo mencionado.

Implementación en C#/Mono.

Para la implementaciones que se describen a continuación se utilizaron los siguientes namespaces.

using System;
using System.IO;
using System.Text;
using System.Security.Cryptography;

Calcular el hash de una cadena.

El primer paso es crear instancias de los algoritmos de hashing.

HashAlgorithm md5  = HashAlgorithm.Create("MD5");
HashAlgorithm sha1 = HashAlgorithm.Create("SHA1");

Posteriormente se calcula el valor del hash de la cadena texto (text) especificada.

Byte[] md5Data  = md5.ComputeHash(UTF8Encoding.UTF8.GetBytes(text));
Byte[] sha1Data = sha1.ComputeHash(UTF8Encoding.UTF8.GetBytes(text));

Finalmente su valor puede ser manipulado o entregado al usuario.

Console.WriteLine("MD5:  " + BitConverter.ToString(md5Data).Replace("-", ""));
Console.WriteLine("SHA1: " + BitConverter.ToString(sha1Data).Replace("-", ""));

Calcular el hash de un archivo.

El procedimiento es muy similar al cálculo de hash de una cadena, pero a diferencia de este, los datos provienen de un flujo de archivo al cual se le calcula su valor.

FileStream fs = File.OpenRead(filename);

md5Data  = md5.ComputeHash(fs);
sha1Data = sha1.ComputeHash(fs);

fs.Close ();