Tags: PowerShell, Registry
Powershell kann die Registrierdatenbank als Laufwerk (PSDrive) zugänglich machen. Dies erlaubt die Navigation durch die hierarchische Struktur der Registry wie bei einem Verzeichnissystem. Dabei 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 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.
Täglich Know-how für IT-Pros mit unserem Newsletter
Verwandte Beiträge
- Installationsvarianten (Nano, Core, Desktop) und Editionen von Windows Server erkennen
- Registry offline bearbeiten mit regedit.exe oder PowerShell
- Ausstehende Reboots nach Updates prüfen mit PowerShell und reg.exe
- Registry-Schlüssel hinzufügen und löschen mit Powershell
- PowerShellGet-Modul aktualisieren, auf PSResourceGet umsteigen
Weitere Links
5 Kommentare
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
David, danke für den Hinweis, ist korrigiert!
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
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.
danke ich habs...
PSNew-PSDrive -PSProvider Registry -Name HKU -Root HKEY_USERS
test-path hku:\".default\control panel\keyboard"
allerdings
warum ist das so?