Registry-Schlüssel auslesen mit Powershell

Powershell kann mit Hilfe des mitgelieferten Providers die Registrierdatenbank wie ein Laufwerk zugänglich machen. Dies erlaubt die Navigation durch die hierarchische Struktur der Registry wie bei einem Verzeichnissystem. Bei dieser Gelegenheit lassen sich Schlüssel und ihre Werte relativ einfach auslesen, filtern und in verschiedenen Formaten darstellen.

Pfade innerhalb der Registry notiert man, indem das root-Verzeichnis eines Hives (also eines von jenen, die mit "HKEY_ " beginnen) als Laufwerk markiert, sprich daran einen Doppelpunkt anfügt, gefolgt vom Verzeichnispfad, der die Schlüssel wie im File-System durch einen Backslash trennt. Dabei ist auch die Kurzschreibweise zulässig, also beispielsweise HKLM statt HKEY_LOCAL_MACHINE.

Sub-Schlüssel mit get-ChildItem anzeigen

Im einfachsten Fall lässt man sich Sub-Schlüssel eines Verzeichnisses anzeigen, indem man mit Hilfe von set-Location (alias cd) an die gewünschte Position wechselt und diese mit get-ChildItem auflistet. Hier stehen die Powershell-üblichen Formatierungsoptionen zur Verfügung, um die Ausgabe als Tabelle oder Liste darzustellen. Zum Beispiel zeigt

Get-ChildItem HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion|Format-List

alle Unterschlüssel von CurrentVersion als Liste an. Auf diese Weise kann man bis zu den untersten Knoten eines Registry-Baums wandern, aber es ist dann nicht möglich, mit diesem Cmdlet den Wert eines Schlüssels auszulesen.

Werte mit get-ItemProperty auslesen

Zu diesem Zweck muss man den Output von get-Item bzw. von get-ChildItem über eine Pipe an das Cmdlet Get-ItemProperty übergeben, das man bei Bedarf auch über mehrere Schlüssel iterieren lassen kann. Ein einfacher Aufruf, um den Wert des aktuellen Schlüssels anzuzeigen, sieht so aus:

get-Item -path .|get-ItemProperty

Für einfache Aufgaben reicht auch reg.exe

Für solche relativ simplen Abfragen könnte man statt der Powershell natürlich auch das Kommandozeilen-Tool reg.exe heranziehen, das sogar in der Lage ist, ganze Teilbäume nach bestimmten Schlüsseln abzusuchen:

reg query HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion /f uninstallstring /s

Einzelne Werte ausfiltern

Wenn man jedoch die Werte von zwei Sub-Schlüsseln auf einmal auslesen möchte, beispielsweise jene von DisplayName und UninstallString unterhalb von uninstall, weil der UninstallString alleine keine Auskunft über das deinstallierbare Programm gibt, dann ist Powershell überlegen:

Get-ChildItem hklm:\software\microsoft\windows\currentversion\uninstall | ForEach-Object {Get-ItemProperty $_.pspath|select -property DisplayName, UninstallString|Format-List}

Dieses Beispiel filtert aus der umfangreichen Liste an Schlüsseln, die sich in den Unterverzeichnissen von uninstall findet, die gewünschten DisplayName und UninstallString heraus. Weil es sich dabei teilweise um lange Zeichenketten handelt, die bei der standardmäßigen Anzeige als Tabelle abgeschnitten würden, kann man mit Hilfe einer Liste jede von ihnen in einer eigenen Zeile ausgeben.

2 Kommentare

Bild von David Rees-Clark
David Rees-Clark (Besucher) sagt:

Hallo!
Danke für diesen informativen Artikel.
Es steckt nur ein kleiner Fehler darin: Der Alias "dir" ist dem Commandlet get-childitem zugeordnet, nicht set-location.
Freundliche Grüße,
David Rees-Clark

Bild von Wolfgang Sommergut

David, danke für den Hinweis, ist korrigiert!

Kommentar hinzufügen

Der Inhalt dieses Feldes wird nicht angezeigt. Wenn mit Ihrer angegebenen Mail-Adresse ein Gravatar verknüpft ist, dann wird dieser neben Ihrem Kommentar eingeblendet.
  • Internet- und E-Mail-Adressen werden automatisch umgewandelt.
  • Zulässige HTML-Tags: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Zeilen und Absätze werden automatisch erzeugt.
  • Mail-Adressen werden im Seitenquelltext unkenntlich gemacht, um sie vor dem automatischen Erfassen durch Spammer zu schützen.

Weitere Informationen über Formatierungsoptionen