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
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:
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.
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 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.
(Get-ItemProperty -Name DisabledComponents -Path .).DisabledComponents ausgelesen werden.
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.
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.
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
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"}
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
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