Condividi tramite


Utilizzo delle voci del Registro di sistema

Questo esempio si applica solo alle piattaforme Windows.

Poiché le voci del Registro di sistema sono proprietà di chiavi e, di conseguenza, non possono essere esplorate direttamente, è necessario adottare un approccio leggermente diverso quando si lavora con essi.

Elenco delle voci del Registro di sistema

Esistono molti modi diversi per esaminare le voci del Registro di sistema. Il modo più semplice consiste nell'ottenere i nomi di proprietà associati a una chiave. Ad esempio, per visualizzare i nomi delle voci nella chiave del Registro di sistema HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion, usare Get-Item. Le chiavi del Registro di sistema hanno una proprietà con il nome generico "Property" che rappresenta un elenco di voci del Registro di sistema nella chiave. Il comando seguente seleziona la proprietà Property ed espande gli elementi in modo che vengano visualizzati in un elenco:

Get-Item -Path Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion |
    Select-Object -ExpandProperty Property
DevicePath
MediaPathUnexpanded
ProgramFilesDir
CommonFilesDir
ProductId

Per visualizzare le voci del Registro di sistema in un formato più leggibile, usare 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

Le proprietà correlate a Windows PowerShell per la chiave sono precedute tutte dal prefisso "PS", ad esempio PSPath, PSParentPath, PSChildName e PSProvider.

È possibile usare la notazione *.* per fare riferimento al percorso corrente. È possibile usare Set-Location per passare prima al contenitore del Registro di sistema CurrentVersion:

Set-Location -Path Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion

In alternativa, è possibile usare psdrive predefinito HKLM: con Set-Location:

Set-Location -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion

È quindi possibile usare la notazione . del percorso corrente per elencare le proprietà senza specificare un percorso completo:

Get-ItemProperty -Path .
...
DevicePath          : C:\WINDOWS\inf
MediaPathUnexpanded : C:\WINDOWS\Media
ProgramFilesDir     : C:\Program Files
...

L'espansione del percorso funziona come nel file system, quindi da questo percorso è possibile ottenere l'elenco ItemProperty per HKLM:\SOFTWARE\Microsoft\Windows\Help l'uso di Get-ItemProperty -Path ..\Help.

Recupero di una singola voce del Registro di sistema

Per recuperare una voce specifica di una chiave del Registro di sistema, è possibile usare uno dei diversi approcci disponibili. In questo esempio viene trovato il valore di DevicePath in HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion.

Usare Get-ItemProperty con il parametro Path per specificare il nome della chiave e il parametro Name per specificare il nome della voce DevicePath.

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

Questo comando restituisce le proprietà standard di Windows PowerShell oltre alla proprietà DevicePath.

Nota

Anche se Get-ItemProperty dispone di parametri Filter, Include ed Exclude , non possono essere usati per filtrare in base al nome della proprietà. Questi parametri fanno riferimento a chiavi del Registro di sistema, che sono percorsi di elementi, e non a voci del Registro di sistema, che sono invece proprietà di elementi.

Un'altra opzione consiste nell'usare lo strumento da reg.exe riga di comando. Per informazioni su reg.exe, digitare reg.exe /? al prompt dei comandi. Per trovare la voce DevicePath , usare reg.exe come illustrato nel comando seguente:

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

È anche possibile usare l'oggetto COM WshShell per trovare alcune voci del Registro di sistema, anche se questo metodo non funziona con dati binari di grandi dimensioni o con nomi di voce del Registro di sistema che includono caratteri come barra rovesciata (\). Aggiungere il nome di proprietà al percorso dell'elemento con un separatore \:

(New-Object -ComObject WScript.Shell).RegRead("HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\DevicePath")
%SystemRoot%\inf

Impostazione di una singola voce del Registro di sistema

Per modificare una voce specifica di una chiave del Registro di sistema, è possibile usare uno dei diversi approcci disponibili. Questo esempio modificata voce Path in HKEY_CURRENT_USER\Environment. La voce Path specifica dove trovare i file eseguibili.

  1. Recuperare il valore corrente della voce Path tramite Get-ItemProperty.
  2. Aggiungere il nuovo valore, separandolo con ;.
  3. Usare Set-ItemProperty con la chiave, il nome della voce e il valore specificati per modificare la voce del Registro di sistema.
$value = Get-ItemProperty -Path HKCU:\Environment -Name Path
$newpath = $value.Path += ";C:\src\bin\"
Set-ItemProperty -Path HKCU:\Environment -Name Path -Value $newpath

Nota

Anche se Set-ItemProperty dispone di parametri Filter, Include ed Exclude , non possono essere usati per filtrare in base al nome della proprietà. Questi parametri fanno riferimento a chiavi del Registro di sistema, che sono percorsi di elementi, e non a voci del Registro di sistema, che sono invece proprietà di elementi.

Un'altra opzione consiste nell'usare lo strumento da riga di comando Reg.exe. Per informazioni su reg.exe, digitare reg.exe /? al prompt dei comandi.

Nell'esempio seguente la voce Path viene modificata rimuovendo il percorso aggiunto nell'esempio precedente. Get-ItemProperty viene ancora usato per recuperare il valore corrente per evitare la necessità di analizzare la stringa restituita da reg query. I metodi SubString e LastIndexOf vengono usati per recuperare l'ultimo percorso aggiunto alla voce Path.

$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.

Creazione di nuove voci del Registro di sistema

Per aggiungere una nuova voce denominata "PowerShellPath" alla chiave CurrentVersion, usare New-ItemProperty con il percorso della chiave e il nome e il valore della voce. Per questo esempio, verrà usato il valore della variabile $PSHome di Windows PowerShell, in cui è archiviato il percorso della directory di installazione di Windows PowerShell.

È possibile aggiungere la nuova voce alla chiave usando il comando seguente e il comando restituisce anche informazioni sulla nuova voce:

$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 deve essere il nome di un membro dell'enumerazione Microsoft.Win32.RegistryValueKind della tabella seguente:

  • String - Usato per i valori REG_SZ. Passare un [System.String] oggetto al parametro Value .
  • ExpandString - Usato per i valori REG_EXPAND_SZ. Passare un [System.String] oggetto al parametro Value . La stringa deve contenere riferimenti non espansi alle variabili di ambiente espanse quando viene recuperato il valore.
  • Binary - Usato per i valori REG_BINARY. Passare un [System.Byte[]] oggetto al parametro Value .
  • DWord - Usato per i valori REG_DWORD. Passare un [System.Int32] oggetto al parametro Value .
  • MultiString - Usato per REG_MULTI_SZ valori. Passare un [System.String[]] oggetto al parametro Value .
  • QWord - Usato per i valori REG_QWORD. Passare un [System.Int64] oggetto al parametro Value .

È possibile aggiungere una voce del Registro di sistema in più posizioni specificando una matrice di valori nel parametro Path:

$newItemPropertySplat = @{
    Name = 'PowerShellPath'
    PropertyType = 'String'
    Value = $PSHome
    Path = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion',
           'HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion'
}
New-ItemProperty @newItemPropertySplat

È anche possibile sovrascrivere un valore preesistente di una voce del Registro di sistema aggiungendo il parametro Force a qualsiasi comando New-ItemProperty.

Negli esempi seguenti viene illustrato come creare nuove voci del Registro di sistema di vari tipi. I valori del Registro di sistema vengono creati in una nuova chiave denominata MySoftwareKey in HKEY_CURRENT_USER\Software. La $key variabile viene usata per archiviare il nuovo oggetto chiave.

$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

È possibile utilizzare la proprietà PSPath dell'oggetto chiave nei comandi successivi.

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

È anche possibile inviare tramite pipe $key a per New-ItemProperty aggiungere un valore alla chiave.

$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

Visualizzando il contenuto di $key vengono visualizzate le nuove voci.

$key
    Hive: HKEY_CURRENT_USER\Software

Name                           Property
----                           --------
MySoftwareKey                  DefaultFolders : {Home, Temp, Publish}
                               MaxAllowed     : 1024
                               BinaryDate     : {51, 49, 45, 74…}

Nell'esempio seguente viene illustrato il tipo di valore per ogni tipo di voce del Registro di sistema:

$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…}

Ridenominazione delle voci del Registro di sistema

Per rinominare la voce PowerShellPath in "PSHome", usare Rename-ItemProperty:

$renameItemPropertySplat = @{
    Path = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion'
    Name = 'PowerShellPath'
    NewName = 'PSHome'
}
Rename-ItemProperty @renameItemPropertySplat

Per visualizzare il valore rinominato, aggiungere il parametro PassThru al comando.

$renameItemPropertySplat = @{
    Path = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion'
    Name = 'PowerShellPath'
    NewName = 'PSHome'
    PassThru = $true
}
Rename-ItemProperty @renameItemPropertySplat

Eliminazione delle voci del Registro di sistema

Per eliminare le voci del Registro di sistema PSHome e PowerShellPath, usare Remove-ItemProperty:

Remove-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion -Name PSHome
Remove-ItemProperty -Path HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion -Name PowerShellPath