PowerShell-Provider: durch Registry, Zertifikate & Env navigieren wie durch Ordner
Registry, Zertifikatsspeicher und Umgebungsvariablen sind in PowerShell ganz normale Laufwerke - navigiere sie mit dir, cd und Copy-Item statt reg.exe oder MMC.
PowerShell macht aus Datenspeichern wie der Registry, dem Zertifikatsspeicher und den Umgebungsvariablen hierarchische Laufwerke. Das Prinzip: Ein Provider stellt einen Datenspeicher als PSDrive bereit, und du bedienst ihn mit denselben Item-Cmdlets, die du vom Dateisystem kennst - Get-ChildItem (dir/ls), Set-Location (cd), Copy-Item, Remove-Item. Dieses Tutorial richtet sich an Profis, die reg.exe, certmgr.msc und die System-Eigenschaften loswerden und alles skriptbar in einer Shell erledigen wollen.
Provider und Laufwerke entdecken
Verschaffe dir zuerst einen Ueberblick, welche Provider und Laufwerke deine Session anbietet:
Get-PSProvider # zeigt Registry, Certificate, Environment, FileSystem, Alias, Function, Variable
Get-PSDrive # alle Laufwerke ueber alle Provider
Get-PSDrive -PSProvider Registry # nur Registry-Laufwerke (HKLM:, HKCU:)
- Registry liefert standardmaessig die Laufwerke
HKLM:undHKCU:. - Certificate liefert
Cert:(nur Windows - der Provider existiert auf Linux/macOS nicht). - Environment liefert
Env:. - Der entscheidende Punkt: Sobald du
Get-ChildItemim Dateisystem beherrschst, kannst du Registry, Zertifikate und Variablen genauso durchsuchen.
Registry: HKLM:\ und HKCU:\ wie Ordner
Schluessel sind Container (wie Ordner), Werte sind Eigenschaften des Schluessel-Items. Das ist die zentrale Besonderheit der Registry - deshalb gibt es eigene *-ItemProperty-Cmdlets.
- Hineinnavigieren und auflisten:
Set-Location HKCU:\Software Get-ChildItem HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion - Werte (Eigenschaften) eines Schluessels lesen:
Get-ItemProperty -Path 'HKCU:\Environment' Get-ItemPropertyValue -Path 'HKCU:\Environment' -Name 'Path' - Neuen Schluessel und Wert anlegen (Backslash
\oder Slash/als Trenner):New-Item -Path 'HKCU:\Software\ZAIOS' New-ItemProperty -Path 'HKCU:\Software\ZAIOS' -Name 'Stufe' -Value 1 -PropertyType DWord - Bestehenden Wert aendern bzw. einen Wert entfernen:
Set-ItemProperty -Path 'HKCU:\Software\ZAIOS' -Name 'Stufe' -Value 2 Remove-ItemProperty -Path 'HKCU:\Software\ZAIOS' -Name 'Stufe'
Gueltige -PropertyType-Werte entsprechen den Registry-Typen: String (REG_SZ), ExpandString (REG_EXPAND_SZ), Binary (REG_BINARY), DWord, QWord, MultiString (REG_MULTI_SZ). Weitere Hives wie HKEY_CLASSES_ROOT oder HKEY_USERS haengst du selbst als Laufwerk ein:
New-PSDrive -PSProvider Registry -Root HKEY_CLASSES_ROOT -Name HKCR
New-PSDrive -PSProvider Registry -Root HKEY_USERS -Name HKU
Cert:\ - Zertifikatsspeicher durchsuchen
Die Hierarchie ist Cert:\, also z. B. Cert:\LocalMachine\My oder Cert:\CurrentUser\Root. Listen, filtern, exportieren:
- Speicherorte und Speicher auflisten:
Get-ChildItem Cert:\ # CurrentUser, LocalMachine Get-ChildItem Cert:\LocalMachine # My, Root, CA, TrustedPublisher ... - Zertifikate inkl. Thumbprint und Ablaufdatum:
Get-ChildItem Cert:\LocalMachine\My | Format-Table Thumbprint, Subject, NotAfter - Provider-eigene Filter-Parameter (kein nachgelagertes
Where-Objectnoetig):Get-ChildItem Cert:\LocalMachine\My -ExpiringInDays 30 Get-ChildItem Cert:\LocalMachine\My -DNSName '*zaios*' Get-ChildItem Cert:\LocalMachine\My -SSLServerAuthentication - Auf einem entfernten Host gilt dieselbe Syntax:
Invoke-Command -ComputerName srv01 -ScriptBlock { Get-ChildItem Cert:\LocalMachine\My }
Env:\ - Umgebungsvariablen und die Persistenz-Falle
Das Env:-Laufwerk und die Kurzform $env: arbeiten nur im Prozess-Scope der aktuellen Session:
Get-ChildItem Env: # alle Variablen der Session
$env:PATH # eine einzelne lesen
$env:MEINE_VAR = 'wert' # nur fuer diese Session
Remove-Item Env:\MEINE_VAR # nur aus dieser Session entfernen
- Aenderungen ueber
$env:/Env:gehen beim Schliessen der Shell verloren - sie landen nicht in der Registry. - Fuer dauerhafte Variablen nutzt du die .NET-Methode mit Scope
UseroderMachine:[Environment]::SetEnvironmentVariable('MEINE_VAR','wert','User') [Environment]::SetEnvironmentVariable('MEINE_VAR','wert','Machine') # erfordert Admin - User-Variablen ueberschreiben gleichnamige Machine-Variablen. Persistente Aenderungen wirken erst in neu gestarteten Prozessen, nicht in der laufenden Shell.
Profi-Warnung: Remove-Item HKLM:\... -Recurse loescht einen Registry-Teilbaum sofort und ohne Rueckfrage - es gibt keinen Papierkorb. Teste destruktive Pfade vorher mit -WhatIf und arbeite an HKLM grundsaetzlich in einer elevierten Session; ohne Admin-Rechte oder bei geschuetzten Schluesseln bekommst du sonst "Requested registry access is not allowed". Und merke dir die Asymmetrie: Bei der Registry sind Schluessel Items, aber Werte sind Eigenschaften - Remove-Item entfernt den ganzen Schluessel, fuer einen einzelnen Wert brauchst du Remove-ItemProperty.