Registry-Schlüssel auslesen mit Powershell

    Registry-IconPowershell kann die Registrier­datenbank als Lauf­werk (PSDrive) zugäng­lich machen. Dies erlaubt die Navi­gation durch die hierar­chische Struktur der Registry wie bei einem Ver­zeichnis­system. Dabei las­sen sich Schlüssel und ihre Werte relativ ein­fach auslesen, filtern und in ver­schiedenen For­maten 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 verwendet man die Kurzschreibweise, 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.

    5 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!

    Bild von NTe
    NTe sagt:
    1. Februar 2019 - 17:29

    hallo, kleine späte frage...
    ich bekomme eine abfrage ausschliesslich zum HKLM hin.

    ich möchte aber einen key in HKU ändern.
    wenn ich aber den key auslesen möchte, bekomme ich als fehler "laufwerk nicht vorhanden" zurückgegeben.
    des weiteren bringt ein
    PS C:\Windows\system32> test-path HKEY_CURRENT_USER:\
    False
    PS C:\Windows\system32> test-path HKCU:\
    True
    PS C:\Windows\system32> Test-Path HKEY_USERS:\
    False
    PS C:\Windows\system32> test-path HKU:\
    False

    was mach ich falsch? O.o

    Bild von Wolfgang Sommergut
    1. Februar 2019 - 17:41

    Mit dem Befehl

    Get-PSProvider Registry | select -ExpandProperty Drives

    kann man sich die Hives anzeigen lassen, die als Laufwerke gemountet sind. Das Ergebnis ist HKLM und HKCU.

    Bild von NTe
    NTe sagt:
    1. Februar 2019 - 17:51

    danke ich habs...

    PSNew-PSDrive -PSProvider Registry -Name HKU -Root HKEY_USERS
    test-path hku:\".default\control panel\keyboard"

    allerdings
    warum ist das so?