Utilisation d’entrées de Registre
Cet exemple s’applique uniquement aux plateformes Windows.
Les entrées de Registre étant des propriétés de clés, il est impossible de les parcourir directement. Il est donc nécessaire d’adopter une approche légèrement différente pour pouvoir les utiliser.
Affichage de la liste des entrées de Registre
Vous pouvez examiner les entrées de Registre de plusieurs manières. La façon la plus simple consiste à obtenir les noms des propriétés associées à une clé. Par exemple, pour afficher les noms des entrées dans la clé de Registre HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion
, utilisez Get-Item
. Les clés de Registre possèdent une propriété avec le nom générique « Property » qui contient la liste des entrées de Registre dans la clé. La commande suivante sélectionne la propriété Property et développe les éléments pour les afficher dans une liste :
Get-Item -Path Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion |
Select-Object -ExpandProperty Property
DevicePath
MediaPathUnexpanded
ProgramFilesDir
CommonFilesDir
ProductId
Pour afficher les entrées de Registre dans un format plus lisible, utilisez 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
Les propriétés liées à Windows PowerShell pour la clé possèdent toutes le préfixe « PS », comme PSPath, PSParentPath, PSChildName et PSProvider.
Pour faire référence à l’emplacement actuel, vous pouvez utiliser la notation *.*
. Pour passer d’abord au conteneur de Registre CurrentVersion, vous pouvez utiliser Set-Location
:
Set-Location -Path Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion
Vous pouvez également utiliser le PSDrive HKLM:
intégré avec Set-Location
:
Set-Location -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion
Vous pouvez ensuite utiliser la notation .
pour l’emplacement actuel pour répertorier les propriétés sans spécifier de chemin d’accès complet :
Get-ItemProperty -Path .
...
DevicePath : C:\WINDOWS\inf
MediaPathUnexpanded : C:\WINDOWS\Media
ProgramFilesDir : C:\Program Files
...
L’expansion de chemin fonctionne de la même façon que dans le système de fichiers. Ainsi, à partir de cet emplacement, vous pouvez obtenir la liste ItemProperty pour HKLM:\SOFTWARE\Microsoft\Windows\Help
en utilisant Get-ItemProperty -Path ..\Help
.
Obtention d’une entrée de Registre unique
Si vous souhaitez récupérer une entrée spécifique d'une clé de Registre, plusieurs options s'offrent à vous. Cet exemple détermine la valeur de DevicePath dans HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion
.
Utilisez Get-ItemProperty
avec le paramètre Path pour spécifier le nom de la clé, et avec le paramètre Name pour spécifier le nom de l’entrée 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
Cette commande retourne les propriétés Windows PowerShell standard, ainsi que la propriété DevicePath.
Notes
Bien que Get-ItemProperty
dispose des paramètres Filter, Include et Exclude, vous ne pouvez pas les utiliser pour filtrer par nom de propriété. Ces paramètres référencent des clés de Registre qui sont des chemins d’éléments, et non des entrées de Registre, qui sont des propriétés d’éléments.
Une autre option consiste à utiliser l’outil en ligne de commande reg.exe
. Pour obtenir de l’aide sur reg.exe
, tapez reg.exe /?
à l’invite de commandes. Pour rechercher l’entrée DevicePath, utilisez reg.exe
comme indiqué dans la commande suivante :
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
Vous pouvez aussi utiliser l’objet COM WshShell pour rechercher des entrées de Registre. Toutefois, cette méthode ne fonctionne ni avec des données binaires volumineuses, ni avec des noms d’entrées de Registre contenant des caractères tels que la barre oblique inverse (\
). Ajoutez le nom de la propriété au chemin de l’élément avec un séparateur \
:
(New-Object -ComObject WScript.Shell).RegRead("HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\DevicePath")
%SystemRoot%\inf
Définition d’une entrée de Registre unique
Si vous souhaitez modifier une entrée spécifique d’une clé de Registre, plusieurs options s’offrent à vous. Cet exemple modifie l’entrée Path sous HKEY_CURRENT_USER\Environment
. L’entrée Path indique où trouver les fichiers exécutables.
- Récupérez la valeur actuelle de l’entrée Path à l’aide de
Get-ItemProperty
. - Ajoutez la nouvelle valeur, en la séparant avec un
;
. - Utilisez
Set-ItemProperty
avec la clé spécifiée, le nom de l’entrée et la valeur pour modifier l’entrée de Registre.
$value = Get-ItemProperty -Path HKCU:\Environment -Name Path
$newpath = $value.Path += ";C:\src\bin\"
Set-ItemProperty -Path HKCU:\Environment -Name Path -Value $newpath
Notes
Bien que Set-ItemProperty
dispose des paramètres Filter, Include et Exclude, vous ne pouvez pas les utiliser pour filtrer par nom de propriété. Ces paramètres font référence aux clés de Registre (qui sont des chemins d'accès à des éléments) et non à des entrées de Registre (qui sont des propriétés d'éléments).
Une autre option consiste à utiliser l'outil en ligne de commande Reg.exe. Pour obtenir de l’aide sur reg.exe, tapez reg.exe /?
à l’invite de commandes.
L’exemple suivant modifie l’entrée Path en supprimant le chemin d’accès ajouté dans l’exemple ci-dessus.
Get-ItemProperty
est toujours utilisé pour récupérer la valeur actuelle pour éviter d’avoir à analyser la chaîne retournée par reg query
. Les méthodes SubString et LastIndexOf sont utilisées pour récupérer le dernier chemin d’accès ajouté à l’entrée 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.
Création d’entrées de Registre
Pour ajouter une nouvelle entrée nommée « PowerShellPath » à la clé CurrentVersion, utilisez New-ItemProperty
avec le chemin de la clé, le nom de l’entrée et la valeur de l’entrée. Pour cet exemple, nous allons prendre la valeur de la variable Windows PowerShell $PSHome
, qui stocke le chemin d’accès au répertoire d’installation de Windows PowerShell.
Vous pouvez ajouter la nouvelle entrée à la clé à l’aide de la commande suivante. La commande retourne également des informations sur la nouvelle entrée :
$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 doit être le nom d'un membre d'énumération Microsoft.Win32.RegistryValueKind figurant dans le tableau suivant :
String
– Utilisé pour les valeurs REG_SZ. Passez un objet[System.String]
au paramètre Value.ExpandString
– Utilisé pour les valeurs REG_EXPAND_SZ. Passez un objet[System.String]
au paramètre Value. La chaîne doit contenir des références non développées à des variables d’environnement qui sont développées quand la valeur est récupérée.Binary
– Utilisé pour les valeurs REG_BINARY. Passez un objet[System.Byte[]]
au paramètre Value.DWord
– Utilisé pour les valeurs REG_DWORD. Passez un objet[System.Int32]
au paramètre Value.MultiString
– Utilisé pour les valeurs REG_MULTI_SZ. Passez un objet[System.String[]]
au paramètre Value.QWord
– Utilisé pour les valeurs REG_QWORD. Passez un objet[System.Int64]
au paramètre Value.
Vous pouvez ajouter une entrée de Registre à plusieurs emplacements en spécifiant un tableau de valeurs pour le paramètre Path :
$newItemPropertySplat = @{
Name = 'PowerShellPath'
PropertyType = 'String'
Value = $PSHome
Path = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion',
'HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion'
}
New-ItemProperty @newItemPropertySplat
Vous pouvez aussi remplacer une valeur d’entrée de Registre préexistante en ajoutant le paramètre Force à toute commande New-ItemProperty
.
Les exemples suivants montrent comment créer des entrées de Registre de différents types. Les valeurs de Registre sont créées dans une nouvelle clé nommée MySoftwareKey sous HKEY_CURRENT_USER\Software
. La variable $key
est utilisée pour stocker le nouvel objet clé.
$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
Vous pouvez utiliser la propriété PSPath de l’objet clé dans les commandes suivantes.
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
Vous pouvez également envoyer $key
à New-ItemProperty
en utilisant le pipe pour ajouter une valeur à la clé.
$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
L’affichage du contenu de $key
montre les nouvelles entrées.
$key
Hive: HKEY_CURRENT_USER\Software
Name Property
---- --------
MySoftwareKey DefaultFolders : {Home, Temp, Publish}
MaxAllowed : 1024
BinaryDate : {51, 49, 45, 74…}
L’exemple suivant montre le type de valeur pour chaque genre d’entrée de Registre :
$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…}
Affectation d’un nouveau nom à des entrées de Registre
Pour affecter le nom « PSHome » à l’entrée PowerShellPath, utilisez Rename-ItemProperty
:
$renameItemPropertySplat = @{
Path = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion'
Name = 'PowerShellPath'
NewName = 'PSHome'
}
Rename-ItemProperty @renameItemPropertySplat
Pour afficher la valeur renommée, ajoutez le paramètre PassThru à la commande.
$renameItemPropertySplat = @{
Path = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion'
Name = 'PowerShellPath'
NewName = 'PSHome'
PassThru = $true
}
Rename-ItemProperty @renameItemPropertySplat
Suppression d’entrées de Registre
Pour supprimer les entrées de Registre PSHome et PowerShellPath, utilisez Remove-ItemProperty
:
Remove-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion -Name PSHome
Remove-ItemProperty -Path HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion -Name PowerShellPath