Erst mal schauen...

Die Registry wird innerhalb der PowerShell als Laufwerk behandelt. Einen einfachen Überblick zu allen Laufwerken gibt das Commandlet (kurz CmdLet) Get-PSDrive. Da wir uns hier nur mit der Registry beschäftigen begrenzen wir die Auswahl durch die Verwendung von Get-PSDrive -PSProvider Registry. Es werden zwei mögliche Laufwerke angezeigt:

  • HKCU für den aktuellen Nutzer (HKEY_CURRENT_USER)
  • HKLM für die lokale Maschine (HKEY_LOCAL_MACHINE)

Der Zugriff auf die Laufwerke erfolgt wie bei jedem Laufwerk durch die Laufwerkskennzeichnung und einen Doppelpunkt über das CmdLet Set-Location, also über Set-Location HKLM: als Befehl. Alternativ bietet sich der Alias CD an, wodurch sich ein vertrautes CD HKLM: ergibt.

Innerhalb der Registry stehen unterschiedlichen CmdLets zur Verfügung. Einige davon werden wir hier genauer betrachten.

  • Get-Item zeigt den ausgewählten Schlüssel an, wobei mindestens der Pfad anzugeben ist. Get-Item -Path . zeigt den aktuellen Schlüssel an. Über Get-Item -Path * werden die im aktuellen Pfad vorhandenen Schlüssel angezeigt.
  • Get-ChildItem zeigt auch ohne Pfadangaben die Unterschlüssel des aktuellen Pfades an.

Wie bei einer normalen Ordnerstruktur erhalten wir auch in der Registry keinen Zugriff auf Schlüssel ohne Zugriffsrechte. Dies erklärt die unterschiedliche Anzeige in der PowerShell im Verglich zu RegEdit. Dort werden alle Schlüssel unmittelbar angezeigt.

  • Set-Location ermöglicht die Navigation innerhalb der Registry analog zur Ordnerstruktur.

    • Set-Location HKLM:\system\CurrentControlSet\services\TCPIP6\Parameters bringt uns direkt zu den IPv6-Einstllungen der lokalen Maschine.

    • In Richtung Root geht es wie gewohnt über Set-Location .. oder Set-Location \

    • Natürlich kann auch hier der Alias CD wie folgt verwendet werden: CD.. oder CD \

Den Zugriff auf die  enthaltenen Eigenschaften im Schlüssel "Parameters" unseres Beispiels erhalten wir wieder durch Get-Item -Path . als Befehl. Der in diesem Beispiel verwendete Eigenschaft DisabledComponents ist in einer Standardumgebung nicht vorhanden. Näheres zum dieser Eigenschaft gibt es hier zu lesen.

  • Über Get-ItemProperty -Path . -Name DisabledComponents lässt sich die Eigenschaft "DisabledComponents" direkt abfragen.
  • Der eigentliche Wert kann dann einfach über

    (Get-ItemProperty -Name DisabledComponents -Path .).DisabledComponents ausgelesen werden.

Schlüsselsuche

Schön, wenn man immer weiß, wo der Schlüssel liegt. In der Registry sieht es da häufig anders aus. Im Folgenden zeigen wir, wie Schlüssel in der Registry gefunden werden können. Die Suche nach einem Schlüssel innerhalb der Registrierung kommt nach unserer Erfahrung recht selten vor. In den meisten Fällen ist der Schlüssel nebst Pfad bekannt. Sollte dies dennoch einmal nicht der Fall sein bietet das CmdLet Get-ChildItem eine passende Lösung an.

  • Get-ChildItem -path Parameters -Recurse

Der obige Befehl durchsucht die gesamte Registrierung ab dem aktuelle Pfad nach dem Schlüssel Parameters. Die Rückgabe kann sehr zeitintensiv sein, zumindest wenn selbige ab Root durchgeführt wird.

Suche von Eigenschaften

Jetzt, wo der Schlüssel bekannt ist, können die Eigenschaften des selbigen untersucht werden. Das folgende Script verdeutlicht den Unterschied von Get-ChildItem und Get-Item am Beispiel der TCPIPv6 Parameter.

Code

cls

cd HKLM:

Set-Location HKLM:\system\CurrentControlSet\services\TCPIP6

Write-Host "Get-ChildItem -path Parameters"

Get-ChildItem -path Parameters

Write-Host "Get-Item -Path Parameters"

Get-Item -Path Parameters

Eigenschaften & Werte finden $ setzen

In der realen Welt sieht die Suche oft anders aus. Entweder ist ein Wert bekannt, der "irgendwo in der Registry" zu finden ist und angepasst werden soll oder es soll überprüft werden, ob eine Eigenschaft vorhanden und/oder welcher Wert dafür hinterlegt ist.

Im ersten Szenario prüfen wir, ob eine Eigenschaft (Property) in einem bestimmten Schlüssel (Item) vorhanden ist und mit dem korrekten Wert (Value) versehen ist. Wie arbeiten hier, wie schon so oft, mit den TVPIPv6-Einstellungen. Der Pfad zum Schlüssel ist uns ja bereits bekannt.

Alternativ zur zweiten Zeile im Code kann der Wert auch über GetValue abgefragt werden:

  • (Get-Item -path "HKLM:\system\CurrentControlSet\services\TCPIP6\Parameters" -ErrorAction SilentlyContinue).GetValue("DisabledComponents")

Die möglichen Methoden können mit dem CmdLet Get-Member ermittelt werden. Je nach Vorliebe gibt es hier also mehrere Varianten, deren Unterschiede im Einzelfall recht interessant sein können...

Code

$RegExists = Get-ItemProperty -path "HKLM:\system\CurrentControlSet\services\TCPIP6\Parameters" -Name "DisabledComponents" -ErrorAction SilentlyContinue

$RegRightValue = (Get-ItemProperty -path "HKLM:\system\CurrentControlSet\services\TCPIP6\Parameters" -Name "DisabledComponents" -ErrorAction SilentlyContinue).DisabledComponents

If ($RegExists -eq $Null){New-ItemProperty -Path "HKLM:\system\CurrentControlSet\services\TCPIP6\Parameters" -PropertyType "DWord" -Value "255" -Name "DisabledComponents"}

If($RegRightValue -ne "255"){Set-ItemProperty -Path "HKLM:\system\CurrentControlSet\services\TCPIP6\Parameters" -Value "255" -Name "DisabledComponents"}

Gerne mal mit Mühe...

Im folgenden Beispiel soll der Gerätename einer Netzwerkkarte in der Registrierung gesucht werden. In den letzten Jahren haben wir einige Hyper-V Umgebungen installiert. Dabei stießen wir immer wieder auf das Problem, dass im SCVMM die Netzwerkkarten der einzelnen Hosts nur mit Ihrem Gerätenamen angezeigt werden. Gerade die Management-Nic sollte aber auf keinen Fall für andere Zwecke als das Management konfiguriert werden. Ein Erkennbarer Gerätename ist hier durchaus wünschenswert. Das folgende Script bietet eine einfache Unterstützung an.

Code

#Die gesuchte Eigenschaft und der Zielwert werden definiert.

$RegKeyTypeName = "FriendlyName"

$RegKeyValue = "VMM Service"

#Diese Angaben dienen lediglich dazu RegEdit im korrekten Pfad zu öffnen

$RegEditStartBase = "HKCU:\Software\Microsoft\Windows\CurrentVersion\Applets\Regedit"

$RegEditStartKey = "LastKey"

#In diesem Pfad befinden sich die gesuchten Einstellungen zur Nic. Durch die Verwendung der Basis beschleunigt sich die Suche

$RegSearchBase = "HKLM:\SYSTEM\ControlSet001\Enum\PCI"

#Anzeige alle Netzwerkkarten mit relevanten Parametern

Get-NetAdapter | Sort-Object -Property InterfaceDescription | Format-Table -Property Name,InterfaceIndex,InterfaceAlias,InterfaceDescription -AutoSize

#Abfrage des anzupassenden Adapters

$NicIndex = Read-Host "Geben Sie die InterfaceIndex-ID des zu bearbeitenden Interfaces ein"

$NicIntDesc = (Get-NetAdapter -InterfaceIndex $NicIndex).InterfaceDescription

#Ermittlung des Pfades, in welchem der gesuchte Schlüssel steht

Set-Location $RegSearchBase $RegNicPath = Get-ChildItem -Path . -Recurse -ErrorAction SilentlyContinue | ForEach-Object { If((Get-ItemProperty -Path $_.PsPath) -match $NicIntDesc) { $_.PsPath} }

Set-Location $RegNicPath

#Hier öffnet sich REGEDIT im gesuchten Abschnitt. Die Zugriffsrechte auf den Schlüssel verhindern eine automatisierte Rechteanpassung und müssen nach Übernahme des Besitzes angepasst werden.

$RegEditOpenPath = "Computer\" + $RegNicPath.Substring(36)

Set-ItemProperty -Name $RegEditStartKey -Value $RegEditOpenPath -Path $RegEditStartBase

regedit

#Die Anpassung funktioniert nur bei oben korrekt eingerichteter Berechtigung auf den Schlüssel

Set-ItemProperty -Name $RegKeyTypeName -Value $RegKeyValue -Path $RegNicPath

Oder ganz anders...

Nicht selten bringt ein genauer Blick auf die Objekte und Eigenschaften der PowerShell eine simplere Lösung zum Vorschein:

Code

 

#Die gesuchte Eigenschaft und der Zielwert werden definiert.

$RegPropertyName = "FriendlyName"

$RegPropertyValue = "VMM Service"

#Diese Angaben dienen lediglich dazu RegEdit im korrekten Pfad zu öffnen

$RegEditStartBase = "HKCU:\Software\Microsoft\Windows\CurrentVersion\Applets\Regedit"

$RegEditStartKey = "LastKey"

$RegEditStartKeyPraefix = "Computer\HKEY_Local_Machine\SYSTEM\ControlSet001\Enum\"

#In diesem Pfad befinden sich die gesuchten Einstellungen zur Nic

$NicSearchBase = "HKLM:\SYSTEM\ControlSet001\Enum\"

#Auswahl der anzupassenden Nic

Get-NetAdapter | Sort-Object -Property InterfaceDescription | Format-Table -Property Name,InterfaceAlias,InterfaceDescription,InterfaceIndex -AutoSize

$NicIndex = Read-Host "Geben Sie die InterfaceIndex-ID des zu bearbeitenden Interfaces ein"

$NicPNPDeviceID = (Get-NetAdapter -InterfaceIndex $NicIndex).PnPDeviceID

$NicItemPropertyPath = $NicSearchBase + $NicPNPDeviceID

#Berechtigungsanmpassung: Besitzrechte und Vollzugriff werden auf dem Schlüssel benötigt

$RegEditStartKeyValue = $RegEditStartKeyPraefix + $NicPNPDeviceID

Set-ItemProperty -Path $RegEditStartBase -Name $RegEditStartKey -Value $RegEditStartKeyValue

Regedit

#Setzen der neuen Gerätebezeichnung

Set-ItemProperty -Path $NicItemPropertyPath -Name $RegPropertyName -Value $RegPropertyValue

#Kontrolle der Einstellungen

Get-NetAdapter -InterfaceIndex $NicIndex

Sollten Sie weitere Informationen benötigen oder sich Fehler im Script befinden, wären wir über ein kurzes Feedback erfreut: Seminar@il-iT.de

  •  il-it Services GmbH
  • Hier gelangen Sie auf die StartseiteHome
  • Rücksprung auf die vorherige Seitezurück
  • Nur wo Impressum drauf steht, ist auch Impressum drin... 
  • Unsere Kontaktdaten und ein Kontaktformular finden Sie hier. 
  • Wer suchet der findet...auf Basis einer Volltextsuche. 
  • Unser Team, Profile, Zertifizierungen und Kontaktdaten. 
  • Absolut sichere Referenzen. 
  • SOS, wenn es in der IT wieder einmal "brennt"... 
  • Aufruf dieser HilfeinformationBedeutung anzeigen
© 2013 - 2021 il-it Services GmbH