Arbeiten mit Registrierungseinträgen
Dieses Beispiel gilt nur für Windows-Plattformen.
Da Registrierungseinträge Eigenschaften von Schlüsseln sind und daher nicht direkt gesucht werden können, muss für die Arbeit mit diesen ein etwas anderer Ansatz gewählt werden.
Auflisten von Registrierungseinträgen
Es gibt viele verschiedene Möglichkeiten zum Untersuchen von Registrierungseinträgen. Am einfachsten ist es, die Eigenschaftennamen mit einem Schlüssel zu verknüpfen. Wenn Sie beispielsweise die Namen der Einträge im Registrierungsschlüssel HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion
anzeigen möchten, verwenden Sie Get-Item
. Registrierungsschlüssel verfügen über eine Eigenschaft mit dem generischen Namen „Property“, die eine Liste der Registrierungseinträge im Schlüssel ist. Der folgende Befehl wählt die Property-Eigenschaft aus und erweitert die Elemente so, dass sie in einer Liste angezeigt werden:
Get-Item -Path Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion |
Select-Object -ExpandProperty Property
DevicePath
MediaPathUnexpanded
ProgramFilesDir
CommonFilesDir
ProductId
Wenn Sie die Registrierungseinträge in einer besser lesbaren Form anzeigen möchten, verwenden Sie Get-ItemProperty
:
Get-ItemProperty -Path Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion
ProgramFilesDir : C:\Program Files
CommonFilesDir : C:\Program Files\Common Files
ProgramFilesDir (x86) : C:\Program Files (x86)
CommonFilesDir (x86) : C:\Program Files (x86)\Common Files
CommonW6432Dir : C:\Program Files\Common Files
DevicePath : C:\WINDOWS\inf
MediaPathUnexpanded : C:\WINDOWS\Media
ProgramFilesPath : C:\Program Files
ProgramW6432Dir : C:\Program Files
SM_ConfigureProgramsName : Set Program Access and Defaults
SM_GamesName : Games
PSPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWA
RE\Microsoft\Windows\CurrentVersion
PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWA
RE\Microsoft\Windows
PSChildName : CurrentVersion
PSDrive : HKLM
PSProvider : Microsoft.PowerShell.Core\Registry
Die Windows PowerShell-bezogenen Eigenschaften für den Schüssel verfügen alle über das Präfix „PS“, z.B. PSPath, PSParentPath, PSChildName und PSProvider.
Sie können die Notation *.*
zum Verweisen auf den aktuellen Speicherort verwenden. Sie können Set-Location
verwenden, um zuerst in den Registrierungscontainer CurrentVersion zu wechseln:
Set-Location -Path Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion
Alternativ können Sie das integrierte PSDrive HKLM:
mit Set-Location
verwenden:
Set-Location -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion
Anschließend können Sie die Notation .
für den aktuellen Speicherort verwenden, um die Eigenschaften aufzulisten, ohne einen vollständigen Pfad anzugeben:
Get-ItemProperty -Path .
...
DevicePath : C:\WINDOWS\inf
MediaPathUnexpanded : C:\WINDOWS\Media
ProgramFilesDir : C:\Program Files
...
Die Pfaderweiterung funktioniert genauso wie innerhalb des Dateisystems. Sie können daher von diesem Speicherort die ItemProperty-Auflistung für HKLM:\SOFTWARE\Microsoft\Windows\Help
abrufen, indem Sie Get-ItemProperty -Path ..\Help
verwenden.
Abrufen eines einzelnen Registrierungseintrags
Wenn Sie einen bestimmten Eintrag in einem Registrierungsschlüssel abrufen möchten, stehen verschiedene Möglichkeiten zur Verfügung. In diesem Beispiel wird der Wert von DevicePath in HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion
gesucht.
Verwenden Sie mit Get-ItemProperty
den Parameter Path, um den Namen des Schlüssels anzugeben, und den Parameter Name, um den Namen des Eintrags DevicePath anzugeben.
Get-ItemProperty -Path HKLM:\Software\Microsoft\Windows\CurrentVersion -Name DevicePath
DevicePath : C:\WINDOWS\inf
PSPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion
PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\Software\Microsoft\Windows
PSChildName : CurrentVersion
PSDrive : HKLM
PSProvider : Microsoft.PowerShell.Core\Registry
Dieser Befehl gibt die standardmäßigen Windows PowerShell-Eigenschaften sowie die Eigenschaft DevicePath aus.
Hinweis
Obwohl Get-ItemProperty
die Parameter Filter, Include und Exclude aufweist, können sie nicht zum Filtern nach dem Namen der Eigenschaft verwendet werden. Diese Parameter verweisen auf Registrierungsschlüssel (Elementpfade) und nicht auf Registrierungseinträge (Elementeigenschaften).
Eine weitere Option ist die Verwendung des Befehlszeilentools reg.exe
. Um Hilfe zu reg.exe
zu erhalten, geben Sie an einer Eingabeaufforderung reg.exe /?
ein. Mithilfe von reg.exe
finden Sie den Eintrag DevicePath, wie im folgenden Befehl gezeigt:
reg query HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion /v DevicePath
! REG.EXE VERSION 3.0
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion
DevicePath REG_EXPAND_SZ %SystemRoot%\inf
Sie können auch das COM-Objekt WshShell zum Suchen bestimmter Registrierungseinträge verwenden, obwohl diese Methode bei umfangreichen Binärdaten oder bei Registrierungseintragsnamen mit Zeichen wie dem umgekehrten Schrägstrich (\
) nicht funktioniert. Fügen Sie den Namen der Eigenschaft mit einem \
-Trennzeichen zum Elementpfad hinzu:
(New-Object -ComObject WScript.Shell).RegRead("HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\DevicePath")
%SystemRoot%\inf
Festlegen eines einzelnen Registrierungseintrags
Wenn Sie einen bestimmten Eintrag in einem Registrierungsschlüssel ändern möchten, stehen Ihnen verschiedene Möglichkeiten zur Verfügung. In diesem Beispiel wird der Eintrag Path unter HKEY_CURRENT_USER\Environment
geändert. Der Eintrag Path gibt an, wo ausführbare Dateien zu finden sind.
- Rufen Sie den aktuellen Wert des Eintrags Path mit
Get-ItemProperty
ab. - Fügen Sie den neuen Wert hinzu, und trennen Sie ihn mit
;
. - Verwenden Sie
Set-ItemProperty
mit dem angegebenen Schlüssel, Eintragsnamen und Wert, um den Registrierungseintrag zu ändern.
$value = Get-ItemProperty -Path HKCU:\Environment -Name Path
$newpath = $value.Path += ";C:\src\bin\"
Set-ItemProperty -Path HKCU:\Environment -Name Path -Value $newpath
Hinweis
Obwohl Set-ItemProperty
die Parameter Filter, Include und Exclude aufweist, können sie nicht zum Filtern nach dem Namen der Eigenschaft verwendet werden. Diese Parameter verweisen auf Registrierungsschlüssel (das sind Elementpfade und keine Registrierungseinträge), die Elementeigenschaften sind.
Eine weitere Option ist die Verwendung des Befehlszeilentools „Reg.exe“. Um Hilfe zu „reg.exe“ zu erhalten, geben Sie an einer Eingabeaufforderung reg.exe /?
ein.
Im folgenden Beispiel wird der Eintrag Path geändert, indem der im vorstehenden Beispiel hinzugefügte Pfad entfernt wird.
reg query
wird weiterhin zum Abrufen des aktuellen Werts verwendet, um zu vermeiden, dass die aus Get-ItemProperty
zurückgegebene Zeichenfolge analysiert werden muss. Mit den Methoden SubString und LastIndexOf wird der letzte Pfad abgerufen, der dem Eintrag Path hinzugefügt wurde.
$value = Get-ItemProperty -Path HKCU:\Environment -Name Path
$newpath = $value.Path.SubString(0, $value.Path.LastIndexOf(';'))
reg add HKCU\Environment /v Path /d $newpath /f
The operation completed successfully.
Erstellen neuer Registrierungseinträge
Verwenden Sie New-ItemProperty
mit dem Pfad zum Schüssel, dem Eintragsnamen und dem Wert des Eintrags, um einen neuen Eintrag namens „PowerShellPath“ zum Schlüssel CurrentVersion hinzuzufügen. In diesem Beispiel wird der Wert der Windows PowerShell-Variablen $PSHome
verwendet, in der der Pfad zum Installationsverzeichnis für Windows PowerShell gespeichert wird.
Sie können dem Schlüssel mithilfe des folgenden Befehls den neuen Eintrag hinzufügen, und der Befehl gibt auch Informationen zu dem neuen Eintrag zurück:
$newItemPropertySplat = @{
Path = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion'
Name = 'PowerShellPath'
PropertyType = 'String'
Value = $PSHome
}
New-ItemProperty @newItemPropertySplat
PSPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion
PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows
PSChildName : CurrentVersion
PSDrive : HKLM
PSProvider : Microsoft.PowerShell.Core\Registry
PowerShellPath : C:\Program Files\Windows PowerShell\v1.0
PropertyType muss der Namen eines Microsoft.Win32.RegistryValueKind-Aufzählungselements aus der folgenden Tabelle sein:
String
– Wird für REG_SZ-Werte verwendet. Übergeben Sie ein[System.String]
-Objekt an den Parameter Wert.ExpandString
– Wird für REG_EXPAND_SZ-Werte verwendet. Übergeben Sie ein[System.String]
-Objekt an den Parameter Wert. Die Zeichenfolge sollte nicht erweiterte Verweise auf Umgebungsvariablen enthalten, die beim Abrufen des Werts erweitert werden.Binary
– Wird für REG_BINARY-Werte verwendet. Übergeben Sie ein[System.Byte[]]
-Objekt an den Parameter Wert.DWord
– Wird für REG_DWORD-Werte verwendet. Übergeben Sie ein[System.Int32]
-Objekt an den Parameter Wert.MultiString
– Wird für REG_MULTI_SZ-Werte verwendet. Übergeben Sie ein[System.String[]]
-Objekt an den Parameter Wert.QWord
– Wird für REG_QWORD-Werte verwendet. Übergeben Sie ein[System.Int64]
-Objekt an den Parameter Wert.
Sie können einen Registrierungseintrag zu mehreren Speicherorten hinzufügen, indem Sie ein Array von Werten für den Parameter Path angeben:
$newItemPropertySplat = @{
Name = 'PowerShellPath'
PropertyType = 'String'
Value = $PSHome
Path = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion',
'HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion'
}
New-ItemProperty @newItemPropertySplat
Sie können auch einen bereits vorhandenen Registrierungseintragswert überschreiben, indem Sie den Parameter Force an einen beliebigen New-ItemProperty
-Befehl anfügen.
In den folgenden Beispielen wird gezeigt, wie neue Registrierungseinträge verschiedener Typen erstellt werden. Die Registrierungswerte werden in einem neuen Schlüssel namens MySoftwareKey unter HKEY_CURRENT_USER\Software
erstellt. Die $key
-Variable wird verwendet, um das neue Schlüsselobjekt zu speichern.
$key = New-Item -Path HKCU:\Software -Name MySoftwareKey
$newItemPropertySplat = @{
Path = $key.PSPath
Name = 'DefaultFolders'
PropertyType = 'MultiString'
Value = 'Home', 'Temp', 'Publish'
}
New-ItemProperty @newItemPropertySplat
DefaultFolders : {Home, Temp, Publish}
PSPath : Microsoft.PowerShell.Core\Registry::HKEY_CURRENT_USER\Software\MySoftwareKey
PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_CURRENT_USER\Software
PSChildName : MySoftwareKey
PSProvider : Microsoft.PowerShell.Core\Registry
Sie können die PSPath-Eigenschaft des Schlüsselobjekts in nachfolgenden Befehlen verwenden.
New-ItemProperty -Path $key.PSPath -Name MaxAllowed -PropertyType QWord -Value 1024
MaxAllowed : 1024
PSPath : Microsoft.PowerShell.Core\Registry::HKEY_CURRENT_USER\Software\MySoftwareKey
PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_CURRENT_USER\Software
PSChildName : MySoftwareKey
PSProvider : Microsoft.PowerShell.Core\Registry
Sie können auch $key
an New-ItemProperty
senden, um dem Schlüssel einen Wert hinzuzufügen.
$date = Get-Date -Format 'dd-MMM-yyyy'
$newItemPropertySplat = @{
Name = 'BinaryDate'
PropertyType = 'Binary'
Value = ([System.Text.Encoding]::UTF8.GetBytes($date))
}
$key | New-ItemProperty @newItemPropertySplat
BinaryDate : {51, 49, 45, 74…}
PSPath : Microsoft.PowerShell.Core\Registry::HKEY_CURRENT_USER\Software\MySoftwareKey
PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_CURRENT_USER\Software
PSChildName : MySoftwareKey
PSProvider : Microsoft.PowerShell.Core\Registry
Beim Anzeigen des Inhalts von $key
sehen Sie die neuen Einträge.
$key
Hive: HKEY_CURRENT_USER\Software
Name Property
---- --------
MySoftwareKey DefaultFolders : {Home, Temp, Publish}
MaxAllowed : 1024
BinaryDate : {51, 49, 45, 74…}
Im folgenden Beispiel wird der Werttyp für alle Arten von Registrierungseinträgen angezeigt:
$key.GetValueNames() | Select-Object @{n='ValueName';e={$_}},
@{n='ValueKind';e={$key.GetValueKind($_)}},
@{n='Type';e={$key.GetValue($_).GetType()}},
@{n='Value';e={$key.GetValue($_)}}
ValueName ValueKind Type Value
--------- --------- ---- -----
DefaultFolders MultiString System.String[] {Home, Temp, Publish}
MaxAllowed QWord System.Int64 1024
BinaryDate Binary System.Byte[] {51, 49, 45, 74…}
Umbenennen von Registrierungseinträgen
Verwenden Sie Rename-ItemProperty
, um den Eintrag PowerShellPath in „PSHome“ umzubenennen:
$renameItemPropertySplat = @{
Path = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion'
Name = 'PowerShellPath'
NewName = 'PSHome'
}
Rename-ItemProperty @renameItemPropertySplat
Um den umbenannten Wert anzuzeigen, fügen Sie dem Befehl den Parameter PassThru hinzu.
$renameItemPropertySplat = @{
Path = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion'
Name = 'PowerShellPath'
NewName = 'PSHome'
PassThru = $true
}
Rename-ItemProperty @renameItemPropertySplat
Löschen von Registrierungseinträgen
Verwenden Sie Remove-ItemProperty
, um die Registrierungseinträge „PSHome“ und „PowerShellPath“ zu löschen:
Remove-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion -Name PSHome
Remove-ItemProperty -Path HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion -Name PowerShellPath