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 sagt:
    24. Mai 2012 - 11:01

    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
    24. Mai 2012 - 11:56

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