Registry Zugriff unter C#

Seit .Net 1.1 ist es möglich mittels C# auf die Windows Registry zuzugreifen und viele Programme verwenden diese jeher auch als alternativen Speicherort für Informationen und Einstellungen. Allerdings gibt es wie in jedem System üblich die eine oder andere Seltsamkeit und so ist auch der Registry-Zugriff unter C# keine Ausnahme.

Mit Hilfe der Registry Klasse im Microsoft.Win32 Namespace erhalt man Zugriff auf die Root Keys der lokalen Registry. Folgende Keys stehen einem damit also direkt zur Verfügung:

Schlüssel Besonderheit
ClassesRoot Keine Schreibrechte
CurrentConfig Keine Schreibrechte
CurrentUser -
DynData Nicht länger unterstützt
LocalMachine Keine Schreibrechte
PerformanceData Keine Schreibrechte
Users Keine Schreibrechte

Hier trifft man nun auf die erste Hürde: wie man der Tabelle recht einfach entnehmen kann hat man zunächst bei fast keinen der Root Keys schreibrechte. Dies trifft auch auf alle jeweils untergeordneten Keys zu, da die Rechte hierarchisch vererbt werden. Um in diesen Keys zu schreiben zu können muss das entsprechende Programm mit Admin Rechten gestartet sein. Ist das nicht der Fall wird bei jedwedem Schreibzugriff eine SecurityException geworfen.

Navigation

   1: var key = Registry.CurrentUser.OpenSubKey(@"Printers\Settings\Wizard");

Mittels der OpenSubKey Methode kann man auf jeden beliebigen Key zugreifen, der sich in der Hierarchie unterhalb des gewählten Root Keys befindet. Man benötigt lediglich einen gültigen Registry-Pfad allerdings ohne zusätzliche Angabe des Root Keys. Achtung: Sollte der Pfad ungültig sein bekommt man null statt des gewünschten Keys zurück.

Wichtig: Man hat bei dem abgebildeten Zugriff keine Schreibrechte! Um den Schreibzugriff für den Key zu aktivieren muss man zusätzlich zum Pfad einen 2ten Parameter mit true übergeben. Sollten man dies vergessen bekommt man selbst mit Admin Rechten eine SecurityException.

Werte Lesen

Die Registry besteht im Kern aus nur zwei Elementen: der hierarchischen Key Struktur und den Named Values von denen ein Key beliebig viele enthalten kann. Die Named Values selbst bestehen lediglich aus einem Namen, einem Typ und dem eigentlichen Wert.

Für eine Übersicht welche Named Values im aktuellen Schlüssel zur Verfügung stehen ruft man die GetValueNames Methode auf:

   1: var names = key.GetValueNames();

Mittels des zurückgelieferten String Arrays kann man nun auf die eigentlichen Werte zugreifen:

   1: foreach (var name in names)
   2: {
   3:     var type = key.GetValueKind(name);
   4:     var value = (???)key.GetValue(name);
   5: }

Hier stellt die API nun die nächste Hürde auf: der Rückgabetyp von GetValue ist Object da die Registry ihre Werte intern nicht als String sondern typisiert speichert. Um den erhaltenen Wert verwenden zu können muss also zunächst der Typ des Wertes identifiziert werden. GetValueKind gibt einem hierfür per Enum den Typen des Wertes in der Registry zurück. Anschließend kann der Wert in das korrekte .Net Äquivalent gecastet werden. Nun muss man nur noch zuordnen:

Value Kind C# Type
Binary byte []
DWord int
QWord long
String String
ExpandString String (mit Platzhaltern im Text)
MultiString String []

Achtung - Sonderfall: In jedem Key darf es genau einen Wert geben der keinen Namen hat. Im Windows Registrierungseditor wird dieser Wert der Lesbarkeit halber mit “(Standart)” betitelt. Möchten man im Code auf diesen Wert zuzugreifen muss man an die jeweiligen Zugriffs Methoden entweder null oder einen leeren String übergeben, also “” oder String.Empty.

Werte Bearbeiten

Um neue Keys zu erstellen ruft man die CreateSubKey Methode auf. Hier sollte darauf geachtet werden dass der angegebene Name nicht bereits für einen anderen Subkey verwendet worden ist. Ebenfalls wichtig ist dass Subkeys nicht umbenannt werden können. Sollte dies doch mal nötig sein muss man leider von Hand den gesamten Inhalt in einen neuen Key transferieren und dann den Alten löschen.

Um einen Key zu löschen verwendet man entweder die DeleteSubKey oder DeleteSubKeyTree Methode. Erstere kann nur leere Keys löschen wohingegen Zweitere alle untergeordneten Keys jeweils mitlöscht.

Mittels der SetValue Methode legt man neue Named Values an oder editiert bestehende Einträge. Um hier zu verhindern das man beim editieren versehentlich neue Named Value anlegt empfiehlt es sich vorher mit GetValue noch mal zu überprüfen ob ein entsprechender Eintrag bereits vorhanden ist. Abschließend kann man mit DeleteValue ein Named Value auch wieder vollständig aus der Registry löschen.

   1: try
   2: {
   3:     using (var key = Registry.CurrentUser.OpenSubKey("Pfad", true))
   4:     {
   5:         using(var subkey = key.CreateSubKey("sub")) // Schlüssel Anlegen
   6:         {
   7:             var typ = RegistryValueKind.DWord;
   8:             subkey.SetValue("Zahl", 42, typ); // Wert Anlegen
   9:             subkey.SetValue("Zahl", 84, typ); // Wert Editieren
  10:             subkey.DeleteValue("Zahl"); // Wert Löschen
  11:         }
  12:         key.DeleteSubKeyTree("sub"); // Schlüssel Löschen
  13:     }
  14: }
  15: catch (Exception ex)
  16: {
  17:     // Etwas sinnvolles im Fehlerfall tun zb. den Fehler loggen.
  18: }

Vorsicht: Die Key Klasse schreibt Änderungen nicht zwingend sofort zurück in die Registry. Ähnlich wie bei relationalen Datenbanken werden Änderungen zunächst gesammelt und danach über einen separaten Befehl comittet. Die Windows Registry kommt einem hier zwar entgegen indem sie in einem extern definiertem Intervall regelmäßig selbst Änderungen comittet aber auf dieses Intervall sollte man sich besser nicht verlassen.

Um diese letzte Hürde zu nehmen und Änderungen manuell zu comitten verwendet man die Flush Methode des aktuellen Keys. Diese Methode schreibt alle bisher gesammelten Änderungen sofort in die Registry. Da man das aber nicht jedes Mal von Hand machen möchte empfiehlt sich die Verwendung eines using Blocks. Dieser Block ruft implizit die Dispose Methode auf welche unter der Haube Flush aufruft und gleich noch sauber aufräumt. Damit schlägt man zwei Fliegen mit einer Klappe und hat nun alle nötigen Werkzeuge zusammen um die Windows Registry effektiv für sich einzusetzen.

Wer noch mehr erfahren möchte, ist mit diesem C# Kurs genau an der richtigen Adresse.

Kommentare sind geschlossen