Trabajando con el registro de Windows desde C# y .NET

Manejar el registro de Windows es algo… en parte tedioso por lo extenso y medianamente documentado que esta lo que contiene. En mi humilde opinión, es algo a evitar siempre que sea posible en virtud de los archivos de configuración; pero en ocasiones necesitamos crear/modificar entradas que afectan al funcionamiento de otros programas ó del propio Windows desde nuestras aplicaciones, asi que hay que arremangarse y meterle mano 😀

Primero un pequeño repaso de como se estructura la información a grandes rasgos. Podemos ver el registro mediante la aplicación regedit.exe. Encontramos 5 elementos principales, que así por encima vienen a ser:

  • HKEY_CLASSES_ROOT (HKCR) : Contiene las realciones entre los identificadores de programa y clases que se usan por COM+, asociaciones de archivo e información de ejecución de aplicaciones.
  • HKEY_USERS (HKU) : Contiene un elemento por cada usuario del sistema y en cada uno se almacenan sus preferencias y configuraciones individuales.
  • HKEY_CURRENT_USER (HKCU) : Es como un enlace simbólico a la entrada en HKU correspondiente al usuario actual.
  • HKEY_LOCAL_MACHINE (HKLM) : Información del sistema y del hardware.
  • HKEY_CURRENT_CONFIG (HKCC) : Es como un enlace simbólico a la entrada en HKLM correspondiente a la configuración hardware actual.

La información esta estructurada en forma de arbol mediante claves y valores. Las claves son como carpetas que puede contener otras claves, y los valores son una pareja key-value donde podemos asignar un valor. Los valores pueden ser de tipo:

  • REG_DWORD : Número de 4 bytes, se usa para almacenar valores boleanos.
  • REG_BINARY : Almacena datos binarios.
  • REG_SZ : Cadena de texto.
  • REG_MULTI_SZ : Almacena arrays de strings.
  • REG_EXPAND_SZ : Almacena una variable en formato de string.

Ahora vamos a meterle mano, lo primero que necesitamos es el namespace Microsoft.Win32 , y nuestras clases para trabajar serán RegistryRegistryKey. Lo primero, es llegar donde vamos a trabajar:

 

// Abrimos la clave del registro con la que queremos trabajar
RegistryKey rk1 = Registry.LocalMachine;
 

Trabajando con claves:

// Nos movemos hasta la subclave donde queremos trabajar.
// El parámetro boleano indica si la abrimos en solo lectura (false)
// ó en lectura/escritura (true).
rk1 = rk1.OpenSubKey(@"SOFTWAREMicrosoftWindows NTCurrentVersionWinlogon",true);
 
// Si devuelve null es que la clave no existe
if (rk1 == null)
    Console.WriteLine("No existe esa clave");
 
// Crear una nueva clave
// El método devuelve un RegistryKey apuntando
// a la nueva entrada.
RegistryKey rk2 = rk1.CreateSubKey("Prueba");
 
// Obtener todas las subclaves contenidas en esta:
String[] subKeys = rk1.GetSubKeyNames();
 
// Borrar una clave vacia:
rk.DeleteSubKey("Prueba");
                
// Borrar una clave recursivamente:
rk.DeleteSubKeyTree("Prueba");
 

Trabajando con key-values:

// Crea un key-value indicando su nombre, valor y tipo:
rk2.SetValue("ValorPrueba", 0,RegistryValueKind.String);
 
// Obtener todos los nombres de key-values que hay en una clave:
String[] values = rk2.GetValueNames();
 
// Obtener el valor de un key-value:
Console.WriteLine(rk2.GetValueKind("ValorPrueba").ToString());
 
// Obtener el tipo de dato de registro 
// que contiene un key-value:
RegistryValueKind rvk = rk2.GetValueKind("ValorPrueba");
 
// Borrar un key-value:
// El parámetro boleano indica que salte una excepción
// si el key-value a borrar no existe.

rk2.DeleteValue("ValorPrueba", true);

 

Aunque los Setup Project que creamos con Visual Studio tiene capacidad para añadir claves y key-values al registro, su funcionalidad esta muy limitada, por ejemplo… no podriamos crear un key-value que contuviese el path de la aplicación que estemos instalando a no ser que lo pusieramos harcodeado.

 

Trabajando con el registro de Windows desde C# y .NET | vtortola.NET

3 comentarios en “Trabajando con el registro de Windows desde C# y .NET”

  1. Creo que te has olvidado de comentar algo muy importante… Para jugar con el registry nada mejor que el ordenador de el curro, o de un “amigo”…. JAMÁS CON EL DE CASA!!!! :DDD

    Como siempre, un gran post! 😉

  2. Gracias Toni.

    Por su puesto, los experimientos con Gaseosa como se suele decir xDD

    Gracias a quien me haya “meneado”, pero veo dificil el tema 😀

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *