Freigeben über


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.

  1. Rufen Sie den aktuellen Wert des Eintrags Path mit Get-ItemProperty ab.
  2. Fügen Sie den neuen Wert hinzu, und trennen Sie ihn mit ;.
  3. 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