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

by Valeriano Tortola 27. marzo 2008 00:50

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 :D

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(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon",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.

Tags:

Windows | .NET 2.0 | C# 2.0

Comentarios

27/03/2008 0:53:00 #

trackback

Trackback from Pensando en asíncrono

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

Pensando en asíncrono |

27/03/2008 0:53:46 #

trackback

Trackback from vtortola

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

vtortola |

27/03/2008 5:59:20 #

Nicolas

Muy buen material Amigo. Aun así, la tarea de limpieza de registro se la dejo al ccleaner. Me faltan muchos libros como para editar el registro manualmente.


Exitos!

Nicolas Argentina |

27/03/2008 11:33:16 #

vtortola

Gracias! Todo es cuestión de ponerse (pero haciendo un backup antes Tong )

vtortola España |

30/03/2008 12:27:16 #

Lucas

Trabajar con el reg de Win no es simple, sobre todo con la cantidad de info que se almacena allí. Excelente sitio, con buen material. Saludos!!

Lucas Argentina |

Comentarios no permitidos