Autor: Ángel González Berdasco
Fecha: 12 de mayo de 2008
Este trabajo detalla cómo conservar el registro de un usuario limitado en un sistema Windows XP.
Este trabajo tiene como finalidad la divulgación de mi investigación personal para que pueda servir a otros. No doy ninguna garantía de éxito. Todos los cambios que realice son bajo su responsabilidad. No se lo recomiendo a menos que sea un usuario experto.
El sistema utilizado es Windows XP. Aunque es probable que funcione en otras versiones de Windows, es terreno inexplorado
.
Suponemos un sistema Windows XP independiente (no conectado a ningún dominio) con un usuario de nombre PocaCosa que trabaja como usuario limitado (tal y como se debe hacer).
Debido a jugarretas del destino (o del SO), tiene que reinstalar el sistema operativo, perdiendo con ello la configuración personalizada del sistema, que busca mantener.
Nota: Nada impide efectuar las operaciones descritas en este documento en un sistema que hubiera sido reinstalado hace tiempo, o incluso incluyendo datos el registro de usuario desde otro ordenador, no obstante tomamos esta situación de partida debido a que:
El registro es un lugar, cerca del caos, donde cientos de programas escriben y leen los datos que les parece.
En él hay almacenados datos que van desde la información del hardware o los programas instalados hasta la configuración de ventanas, el fondo de escritorio y los últimos documentos abiertos por el programa X. Nuestro objetivo es restaurar estos últimos datos, que son los relativos al usuario, de HKEY_CURRENT_USER. Cuando se reinstala Windows encima de otra versión, ya se conserva parte de los datos del sistema (HKEY_LOCAL_MACHINE) y sería imprudente cambiarlos por una versión potencialmente incorrecta (el motivo original para la reinstalación pueden haber sido perfectamente unos valores no válidos en el registro).
En principio no. No son más que datos. Configuraciones como en qué posición dejaste abierta la ventana del programa para ponerla en el mismo sitio al volver a abrirlo, o el último programa abierto. Obviamente no hay ningún peligro si se pierden estos datos, y los daños que pueden causar no pasan de una inconveniencia. La posibilidad de problemas aumenta debido a que el registro también se usa para localizar programas a ejecutar (principalmente ActiveX y componentes críticos para el arranque de Windows).
La forma más sencilla de explorar el contenido del registro es abriendo el programa C:\WINDOWS\regedit.exe
1.
Como se puede observar en la imagen anterior, el registro se divide en cinco ramas: HKEY_CLASSES_ROOT, HKEY_CURRENT_USER. HKEY_LOCAL_MACHINE, HKEY_USERS, HKEY_CURRENT_CONFIG, a menudo abreviadas HKCR, HCKCU, HKLM, HKU y HKCC respectivamente. Existen además las claves virtuales2 HKEY_PERFORMANCE_DATA, HKEY_PERFORMANCE_NLSTEXT y HKEY_PERFORMANCE_TEXT que sirven de interfaz para obtener información sobre rendimiento.
Contiene información que asocia las extensiones de los ficheros con su icono, los programas que los abren, etc. En su clave CLSID contiene los GUIDs del sistema asociándolos con la situación en disco y configuración del servicio que proveen. Forma parte del corazón de OLE y COM, de hecho la consulta de estas subclaves es automática por parte de CoCreateInstance 3.
Originalmente, era la única clave del registro y se almacenaba en REG.DAT4. En la actualidad, HKEY_CLASSES_ROOT monta la clave HKEY_LOCAL_MACHINE\SOFTWARE\Classes
combinada -en las últimas versiones de Windows- con la de HKEY_CURRENT_USER\SOFTWARE\Classes
5.
Contiene información relativa al usuario actual del programa. Es el sitio donde los programas deberían guardar las preferencias del usuario. Conviene tener en cuenta que no está disponible cuando aún no ha iniciado sesión el usuario, situación en la que están por ejemplo los programas que se ejecutan automáticamente al arrancar el sistema.
Si la información del perfil no está disponible (por ejemplo se trata de un perfil remoto y no tenemos conexión de red), se cargan los datos del usuario por defecto6.
Contiene información general para la máquina. Desde datos de arranque del Sistema Operativo hasta los valores predeterminados de programas. En las nuevas versiones de Windows, sólo tienen permiso para modificarla usuarios del grupo Administradores.
En este subárbol se montan los perfiels de cada usuario. Por cada usuario se montan dos claves. La primera con el SID del usuario y la segunda con el SID del usuario con el sufijo "_Classes". Esta última es en realidad un alias de \SOFTWARE\Classes
dentro de la anterior.
Contiene las diferencias entre el hardware actual y el predeterminado. Monta el contenido de HKEY_LOCAL_MACHINE\System\CurrentControlSet\Hardware Profiles\Current
7.
El subárbol HKEY_PERFORMANCE_DATA contiene información de rendimiento (contadores)8. Se trata únicamente de una interfaz, los datos se obtienen del origen en cada llamada, no son guardados en el registro. HKEY_PERFORMANCE_TEXT y HKEY_PERFORMANCE_NLSTEXT contienen la descripción de los contadores en inglés y el idioma local del usuario, respectivamente 7.
En las versiones de Win9x HKEY_LOCAL_MACHINE y HKEY_CURRENT_USER se amacenaban respectivamente en C:\WINDOWS\SYSTEM.DAT
y C:\WINDOWS\USER.DAT
. En Windows Millenium se añadió C:\WINDOWS\CLASS.DAT
9.
En las versiones de Windows NT dentro de una serie de ficheros en C:\WINDOWS\system32\Config Los archivos SECURITY SAM software system
contienen sus respectivas claves dentro de HKEY_LOCAL_MACHINE , mientras que el archivo default contiene HKEY_USERS\.DEFAULT
. Por su parte, almacena HKEY_CURRENT_USER en el archivo NTUSER.DAT del directorio del usuario, normalmente C:\Documents and settings\NombreDeUsuario\NTUSER.DAT
10.
Tras reinstalar Windows, queremos restaurar una cuenta incluyendo sus datos almacenados en el registro. Esto es, restaurar HKEY_CURRENT_USER. No recomiendo intentar restaurar HKEY_LOCAL_MACHINE. Tras importar en una máquina dicha clave de otra, dejó de arrancar 11.
El primer paso a la hora de reinstalar Windows para mantener la cuenta de usuario PocaCosa es que no vamos a crearla directamente o durante la instalación. Veamos un poco por qué.
Los programas y las rutas de configuración que queremos restaurar apuntarán a la carpeta del usuario (su HOMEPATH 12). Por lo tanto nos interesa que se mantenga el mismo. Puesto que estas rutas son del tipo C:\Documents and Settings\NombreDeUsuario
, en principio al crear un usuario cuya carpeta de perfil ya exista podríamos esperar que lo aprovechase, incluso aunque sobreescribiese los datos del registro. Pero Windows XP toma un enfoque distinto: al crear una nueva cuenta, se asegura de que todo sea nuevo, estableciendo como carpeta de usuario una que no exista 13. Cuando se crea un usuario a la hora de asignarle una carpeta a su perfil se intenta con las siguientes rutas:
Cuando llega a C:\Documents and Settings\NombreUsuario.NombreMáquina.999 no puede crearlo y pasa a usar perfiles temporales, que utilizan el mismo patrón:
Llegados a 999, muestra un mensaje avisando que no puede crear un directorio de perfil temporal y no se puede entrar con la cuenta hasta que se borre alguna de las carpetas.
Se hace preciso por tanto engañar a Windows para que use como carpeta de perfil la que ya existe. Una forma de hacerlo sería modificar el sitio donde Windows almacena la situación de la carpeta de perfil para que apunte a la carpeta inicial. O bien hacer que la carpeta inicial ya tenga el nombre apropiado.
La situación de las carpetas de perfil de usuario se encuentra
En HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\
hay una clave por cada usuario del sistema. Dentro de ella el valor ProfileImagePath
indica la situación de la carpeta del perfil de usuario. Por lo tanto basta con cambiar en la clave en que se encuentre %SystemDrive%\Documents and Settings\NombreUsuario.NombreMáquina
por %SystemDrive%\Documents and Settings\NombreUsuario
.
También podemos renombrar las carpetas para que la cree con el nombre apropiado:
Con cualquiera de ambas alternativas, si a continuación iniciamos sesión deberíamos encontrarnos con la antigua configuración de la cuenta.
Desgraciadamente, si convertimos la cuenta en limitada, perdemos la configuración 14, aparece la configuración por defecto. De nuevo hay dos alternativas:
¿Qué es lo que diferencia a un usuario limitado de uno administrador? Los permisos que tiene. Aunque no se nos muestre ningún error, al iniciar sesión como usuario limitado se está denegando el acceso a una serie de archivos a los que como administradores teníamos acceso.
Bien, no exactamente. En la configuración original el usuario PocaCosa tenía acceso, pero el nuevo usuario PocaCosa no. Esto es así debido a que aunque tengan el mismo nombre, son usuarios diferentes. El sistema operativo no identifica a las cuentas por el nombre, sino usando un identificador. En los sistemas de tipo unix se trata de un entero, a veces de 16 bits, a veces de 32. Windows NT utiliza SIDs (Security IDs), de 96 bits.
Windows identifica los ordenadores y las cuentas de usuario mediante SIDs. Cada máquina tiene un identificador de 96 bits, al cual se le agrega un contador (que empieza en ) por cada cuenta que se crea en el sistema. Las cuentas de usuarios normales tienen el SID de la forma S-1-5-21-<SID máquina>-<contador usuarios>
, por ejemplo S-1-5-21-1234567890-0987654321-0123456789-1002
. El prefijo S-1-5-21 indica que se trata de una cuenta de usuario. Otros prefijos tienen diferente significado. Así, la cuenta del sistema tiene de SID S-1-5-18
, la de servicios locales S-1-5-19
y los de red S-1-5-19
15. Si en vez de identificar a un grupo, identifica a un grupo predeterminado, el identificador será de la forma S-1-5-32-<contador>
Otros valores especiales son que el SID del usuario Administrador acaba en 500 (S-1-5-21-1234567890-0987654321-0123456789-500) y el del Invitado en 501. 16 17.
Podemos ver por tanto que el código de la máquina toma un importante valor en los SID. Que es precisamente el que ha sido sobreescrito al reinstalar windows. Si sigue habiendo acceso como administrador es simplemente porque el SID del grupo administradores, S-1-5-32-544
, no contiene el id de la máquina sino que es fijo.
Nos encotnramos los SIDs en todos sitios, en los permisos, en las claves del registro... En HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\
hay una clave por cada usuario que tienen de nombre el número en hexadecimal del contador de la cuenta en el sistema, y en HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\Names
tenemos los nombres, almacenando ese númeroi en el tipo del valor predeterminado.
Si miramos en el dato binario V de la carpeta con el código del usuario, por ejemplo HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\000001F4
, tenemos al final —en Unicode— el nombre de la cuenta y su descripción, en este caso "Administrator - Built-in account for administering the computer/domain", y un poco más arriba (offset 158), el SID de la cuenta, pero en binario.
Para pasar a binario el SID18 basta con calcular el valor hexadecimal de cada segmento e invertir los bytes (esto es, almacenar el número en little endian). Así, el SID S-1-5-21-1234567890-0987654321-0123456789-500 correspondería a la cuenta de administrador de la máquina 1234567890-0987654321-0123456789.
1234567890 = 0x499602D2 -> D2029649 0987654321 = 0x3ADE68B1 -> B168DE3A 0123456789 = 0x075BCD15 -> 15CD5B07 Cuenta de usuario: 500 = 0x1F4
Por lo que en el offset 158 del valor binario HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\000001F4\V
aparecerá D2029649B168DE3A15CD5B07F401
.
No obstante, de poco sirve saber cómo trabajar con SIDs si no sabemos cómo obtrenerlos. Hay programas específicos para ello, como PsGetSid, pero no necesitamos tanto. La manera más sencilla de mirar el SID del usuario actual es mirar la clave de usuario (se distingue por su longitud) montada en HKEY_USERS
cuando sólo ha iniciado sesión un usuario. Para averiguar el antiguo SID basta con mirar los permisos que tiene una carpeta en la que tuviera privilegios. Puesto que el SID ya no está a asociado a un nombre de usuario, se mostrara tal cual.
Al reinstalar Windows, cambia el SID de la máquina. Por lo tanto, también cambian los SIDs de las cuentas locales y los usuarios que antes tenían permisos para acceder ya no lo tienen. Tenemos dos opciones, adaptar el entorno existente a los nuevos SIDs o intentar recuperar los antiguos.
Dado que los SIDs de los usuarios están basados en el SID de la máquina, cambiando el SID de la máquina por el anterior. Si a continuación creamos los usuarios en el mismo orden en que fueron creados en la máquina original, les serán asignados los mismos SIDs.
No hay demasiadas utilidades que permitan modificar el SID de una máquina, estando la mayoría de ellas dentro de paquetes de clonación. Una buena opción es NewSID19 de Mark Russinovich y Bryce Cogswell, que nos permite cambiar el SID por el que queramos (en este caso el SID anterior).
El mayor inconveniente es que se trata de un proceso crítico (no se debe interrumpir) y —cuando el disco duro es grande— muy largo (días). Por lo que si pensando que se ha colgado interrumpes el proceso, puedes encontrarte en una situación como esta:
Esta opción resulta más segura al no tener que cambiar datos por toda la máquina.
Para empezar, hay que darle permisos al nuevo dueño a todas las carpetas que vaya a usar, como mínimo C:\Documents and Settings\PocaCosa
. Preferiblemente, mediante la GUI de la pestaña seguridad de las propiedades de carpeta (sólo aparece si está desactivado el uso compartido simple de archivos20).
Desgraciadamente, esta opción sólo está disponible en las versión Profesional de Windows XP. Si podemos usarla tendremos que conformarnos con ejecutar en una ventana de comandos:
cacls "C:\Documents and Settings\PocaCosa" /T /E /C /G PocaCosa:F 21
El resultado es igualmente satisfactorio, otorga permisos completos a PocaCosa dentro de su carpeta de perfil, pero es menos eficiente ya que en vez de aprovechar las normas de herencia efectuará una recursión, y puede tardar cierto tiempo 22.
Ventana de permisos. Puede observarse cómo tiene permisos sobre ella un SID del cual no conocemos su cuenta.
Una vez hayamos otorgado permisos al nuevo usuario en su carpeta, tendremos una experiencia mucho más satisfactoria, pero no obstante seguimos sin haber recuperado las preferencias del registro, pese a que ahora tenemos permisos sobre el archivo ntuser.dat que contiene el registro de usuario. ¿Por qué seguimos sin poder acceder a nuestro HKEY_CURRENT_USER? Sencillo. Tenemos permiso sobre el archivo del registro, pero no sobre el registro.
El registro tiene su propia serie de permisos:
Nos interesa cambiar tres cosas en el registro:
Podemos hacerlo a mano, montando la antigua clave de usuario23 y modificándola24. Puesto que los permisos se obtienen en su mayoría por herencia, seguramente sería factible. La opción de Buscar en el registro resulta útil (no hay opción reemplazar), pero si en algún sitio hay referencias al SID por su código binario, o por nombre dentro de valores binarios, no las encontraremos.
Por lo tanto, yo me inclino por una opción más arriesgada, que es reemplazar con un editor hexadecimal todos los valores del SID, tanto en decimal como en binario↑, por el del nuevo. Este no es un procedimiento kosher, ya que al modificar a ciegas un archivo binario podemos estar dañando irrecuperablemente25 su estructura.
No obstante, jugamos con dos importantes factores a nuestro favor:
Por lo tanto, si queremos sustituir el SID antiguo S-1-5-21-1234567890-0987654321-0123456789-1002 por el nuevo S-1-5-21-5566778899-3344221100-3246897510-1002, reemplazaríamos las cadenas S-1-5-21-1234567890-0987654321-0123456789-1002 por S-1-5-21-5566778899-3344221100-3246897510-1002 y D2029649B168DE3A15CD5B07 por 53747486ACC354C766B987C1.
Mi experiencia es positiva al respecto, pero YMMV, los datos de cada registro son diferentes, incluso con los mismos contenidos, variarán timestamps, datos borrados...
Estoy escribiendo esto en una cuenta a la que se le ha aplicado el anterior procedimiento hace ya cerca de un año, sin que haya producido ningún problema. Únicamente hay un efecto colateral, probablemente debido a que quedaría algún paso por dar, y es que en la cuenta donde se realiza fallan las verificaciones de certificados de wintrust. La llamada WinVerifyTrust devuelve TRUST_E_SYSTEM_ERROR
en cada archivo firmado. En la práctica, no limita el uso normal del ordenador, aparte de ejemplos27, sólo he visto que afecte a la pestaña Firmas digitales de los programas firmados digitalmente y a la versión Live de MSN Messenger28. Se recomienda utilizar una cuenta original para la realización de comprobaciones criptográficas con Wintrust.
Hemos analizado con bastante profundidad el sistema de cuentas y permisos de Windows, junto detalles de bajo nivel de su implementación, lo cual da un mayor conocimiento de cómo se está comportando la máquina. Ello nos ha permitido, partiendo de una serie de conocimientos generales sobre el registro y los perfiles, recuperar unos datos que podían considerarse perdidos al haber sido almacenados en el registro de Windows en lugar de en ficheros independientes.
Como ampliación, podría considerarse mejorar el proceso mediante una aplicación que automatice la conversión de los SIDs, respetando las estructuras internas del registro29.
Escritorio
, Mis Documentos
o Datos de programa
. Puede obtenerse de las variables del entorno con %HOMEDRIVE%%HOMEPATH%
.TRUST_E_SYSTEM_ERROR
fallará con el críptico error 8004888d.Este trabajo está disponible bajo una licencia dual Creative Commons Reconocimiento-CompartirIgual 3.0 y GNU Free Documentation License 1.2 o posterior.