====== Gérer le registre Windows ====== --- //[[nekan@shyrkasystem.com|Nicolas THOREZ]] 2019/05/20 20:35// Le registre Windows stocke les paramètres du système et de bon nombre d'applications. Powershell peut créer, récupérer, modifier et supprimer des informations dans cette base et ainsi répondre à vos différents besoins. Le registre est une zone sensible. Sa modification ne peut être effectuée qu'avec des droits d'administrateur et l'ajout, la modification et/ou la suppression de certaines informations peuvent entraîner l'instabilité de votre système. A ne manipuler qu'en connaissance de cause donc. Windows organise son registre comme une arborescence de fichier : * Chaque registre est représenté comme un lecteur. * Chaque clé est représentée comme un dossier. * Chaque propriété est représentée comme un fichier. * Chaque valeur est représentée comme le contenu d'un fichier (d'une propriété en l’occurrence). Powershell va donc traiter les de registre de la même manière et avec les mêmes commandes que pour des dossiers sur le disque. Il utilisera quelques commandes supplémentaires pour les propriétés et les valeurs. ===== Les différents registres ===== Windows possèdent 6 registres. L'ensemble des ces registres est appelé ''ruche'' ou ''hive'' en anglais (d'où le HKEY pour Hive Key). Powershell naviguera dans la ruche avec le paramètre //-Path// dont la valeur sera de type ''Registre:\Chemin''. Les valeurs pour ''Registre'' ne sont rien d'autres que les initiales des différents registres : * HKEY_CLASSES_ROOT = HKCR * HKEY_CURRENT_USER = HKCU * HKEY_LOCAL_MACHINE = HKLM * HKEY_USERS = HKU * HKEY_CURRENT_CONFIG = HKCC * HKEY_PERFORMANCE_DATA = HKPD ===== Gestion des clés ===== Les clés sont gérées avec les commandes de type //Verb//-Item. La commande Get-ChildItem peut aussi avoir son utilité. * Référence Microsoft : [[https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/new-item?view=powershell-6|New-Item]] * Référence Microsoft : [[https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/get-item?view=powershell-6|Get-Item]] * Référence Microsoft : [[https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/Set-item?view=powershell-6|Set-Item]] * Référence Microsoft : [[https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/rename-item?view=powershell-6|Rename-Item]] * Référence Microsoft : [[https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/copy-item?view=powershell-6|Copy-Item]] * Référence Microsoft : [[https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/move-item?view=powershell-6|Move-Item]] * Référence Microsoft : [[https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/remove-item?view=powershell-6|Remove-Item]] * Référence Microsoft : [[https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/get-childitem?view=powershell-6|Get-ChildItem]] ==== Créer une clé ==== Pour créer la clé ''Test'' dans le registre ''HKEY_LOCAL_MACHINE'' et en tant que sous-clé de ''SOFTWARE\ShyrkaSystem'', on utilise la commande **New-Item** : New-Item -Path "HKLM:\SOFTWARE\ShyrkaSystem\Test" On pourrait aussi utiliser le paramètre //-Value// afin de définir la valeur par défaut des propriétés de la clé, par exemple : New-Item -Path "HKLM:\SOFTWARE\ShyrkaSystem\Test" -Value "valeur test" La console nous renvoie alors : Hive: HKEY_LOCAL_MACHINE\SOFTWARE\ShyrkaSystem Name Property ---- -------- Test (default) : valeur test ==== Lire une clé ==== Après avoir créé des propriétés à notre nouvelle clé (voir plus bas) pour les besoins de la démonstration, on peut lire le contenu d'une clé avec la commande **Get-Item** suive de //-Path// pour indiquer son chemin : Get-Item -Path "HKLM:\SOFTWARE\ShyrkaSystem\Test" La console nous renvois alors : Name Property ---- -------- Test Property1 : Value1 Property2 : 10 ==== Définir la valeur par défaut d'une clé ==== Chaque clé est créée avec une valeur par défaut. Si cette valeur n'est pas définie à la création de la clé ou si ou souhaite la modifier, on peu faire appel à la commande **Set-Item** suivi des paramètres //-Path// pour indiquer le chemin de la clé et //-Value// pour définir la nouvelle valeur : Set-Item -Path "HKLM:\SOFTWARE\ShyrkaSystem\Test" -Value "DefaultValue" Aucun retour console. ==== Renommer une clé ==== Renommer une clé est possible grâce à la commande **Rename-Item** suivi de //-Path// pour indiquer son chemin et //-NewName// pour son nouveau nom : Rename-Item -Path "HKLM:\SOFTWARE\ShyrkaSystem\Test" -NewName "Test2" Aucun retour console. ==== Copier une clé ==== La copie de clés s'obtient via la commande **Copy-Item**. On utilisera le paramètre //-Path// pour indiquer le chemin de la source et //-Destination// pour le chemin et le nom de la cible : Copy-Item -Path "HKLM:\SOFTWARE\ShyrkaSystem\Test" -Destination "HKLM:\SOFTWARE\ShyrkaSystem\Test2" Aucun retour console. ==== Déplacer une clé ==== Utiliser la commande **Move-Item** permet de déplacer une clé définie par son chemin (//-Path//) vers une autre chemin (//-Destination//) : Move-Item -Path "HKLM:\SOFTWARE\ShyrkaSystem\Test2" -Destination "HKLM:\SOFTWARE\ShyrkaSystemTemp" Aucun retour console. ==== Supprimer une clé ==== La suppression d'un clé passe par la commande **Remove-Item** associé au paramètre //-Path// pour indiquer le chemin de la clé à supprimer. On devra y ajouter //-Recurse// pour supprimer les sous-clés : Remove-Item -Path "HKLM:\SOFTWARE\ShyrkaSystemTemp" -Recurse Aucun retour console. ==== Lister les clés ==== A l'instar de **Get-Item** qui lit les propriétés d'une clé, la commande **Get-ChildItem** lira pour une clé définie par //-Path//, l'ensemble des propriétés de chaque sous-clé : Get-ChildItem -Path "HKLM:\SOFTWARE\ShyrkaSystem" Ce qui renvoie dans la console : Name Property ---- -------- Test Property1 : Value1 Property2 : 10 Test2 QW : 5411 Alors que : Get-Item -Path "HKLM:\SOFTWARE\ShyrkaSystem" Renvoie : Name Property ---- -------- ShyrkaSystem bin : 0 ===== Gestion des propriétés ===== Les propriétés sont gérées avec les commandes de type //Verb//-ItemProperty. * Référence Microsoft : [[https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/new-itemproperty?view=powershell-6|New-ItemProperty]] * Référence Microsoft : [[https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/get-itemproperty?view=powershell-6|Get-ItemProperty]] * Référence Microsoft : [[https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/set-itemproperty?view=powershell-6|Set-ItemProperty]] * Référence Microsoft : [[https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/rename-itemproperty?view=powershell-6|Rename-ItemProperty]] * Référence Microsoft : [[https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/clear-itemproperty?view=powershell-6|Clear-ItemProperty]] * Référence Microsoft : [[https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/copy-itemproperty?view=powershell-6|Copy-ItemProperty]] * Référence Microsoft : [[https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/move-itemproperty?view=powershell-6|Move-ItemProperty]] * Référence Microsoft : [[https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/remove-itemproperty?view=powershell-6|Remove-ItemProperty]] ==== Les types de propriétés ==== Les propriétés sont définies selon des types bien précis qui détermine la nature de sa valeur : * **String** (REG_SZ) : la valeur est une chaîne de caractères qui se termine par le caractère ''null''. * **Binary** (REG_BINARY) : la valeur contient des données binaires. * **DWord** (REG_DWORD) : la valeur contient un nombre binaire de 32bits. * **QWord** (REG_QWORD) : la valeur contient un nombre binaire de 64bits. * **MultiString** (REG_MULTI_SZ) : la valeur est un tableau de plusieurs chaînes de caractères terminé par deux caractères ''null''. * **ExpandString** (REG_EXPAND-SZ) : comme ''String'' à la différence que la chaîne peut contenir des références à des variables d'environnement qui seront traduites lors de la récupération de la valeur de la propriété. * Réf : [[https://docs.microsoft.com/en-us/windows/desktop/sysinfo/registry-value-types|Microsoft]] ==== Créer une propriété ==== Pour créer une propriété, la commande **New-ItemProperty** sera utilisée en indiquant le chemin avec le paramètre //-Path//, le nom avec //-Name// et la valeur avec //-Value//. Cela nous donne : New-ItemProperty -Path "HKLM:\SOFTWARE\ShyrkaSystem\Test" -Name "Property1" -Value "Test1" -PropertyType String Ce qui renvoie dans la console :Property1 : Test1 PSPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\ShyrkaSystem\Test PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\ShyrkaSystem PSChildName : Test PSDrive : HKLM PSProvider : Microsoft.PowerShell.Core\Registry ==== Lire une propriété ==== La commande **Get-ItemProperty** lit les informations de la proriété indiquée par //-Name// au chemin défini par //-Path//. Get-ItemProperty -Path "HKLM:\SOFTWARE\ShyrkaSystem\Test" -Name "Property1" Ce qui nous renvoie :Property1 : Test1 PSPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\ShyrkaSystem\Test PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\ShyrkaSystem PSChildName : Test PSDrive : HKLM PSProvider : Microsoft.PowerShell.Core\Registry On remarque qu'une des "propriétés" de cette propriété est elle-même et qu'elle contient sa valeur. C'est donc en l'appelant elle-même que l'on peut obtenir la valeur d'une propriété : (Get-ItemProperty -Path "HKLM:\SOFTWARE\ShyrkaSystem\Test" -Name "Property1").Property1 Ce qui nous renvoie :Test1 ==== Modifier la valeur d'une propriété ==== Pour modifier la valeur d'une propriété, on utilise la commande **Set-ItemProperty**. Après avoir indiqué les informations //-Path// et //-Name//, on utilisera le paramètre //-Value// pour indiquer la nouvelle valeur : Set-ItemProperty -Path "HKLM:\SOFTWARE\ShyrkaSystem\Test" -Name "Property1" -Value "Test2" Aucun retour console. ==== Renommer une propriété ==== **Rename-ItemProperty** permet de renommer une propriété. Là aussi, on utilisera //-Path// et //-Name// pour définir la propriété cible puis //-NewName// pour le nouveau nom : Rename-ItemProperty -Path "HKLM:\SOFTWARE\ShyrkaSystem\Test" -Name "Property1" -NewName "Property2" Aucun retour console. ==== Supprimer la valeur d'une propriété ==== Pour supprimer la valeur d'une propriété sans supprimer la propriété en question, la commande **Clear-ItemProperty** avec les paramètres //-Path// et //-Name// est là pour ça : Clear-ItemProperty -Path "HKLM:\SOFTWARE\ShyrkaSystem\Test" -Name "Property2" Aucun retour console. ==== Copier une propriété ==== **Copy-ItemProperty** permet de copier une propriété (//-Name//) situé dans une clé (//-Path//) vers une nouvelle clé (//-Destination//) : Copy-ItemProperty -Path "HKLM:\SOFTWARE\ShyrkaSystem\Test" -Name "Property2" -Destination "HKLM:\SOFTWARE\ShyrkaSystem\Test2" On ne peut pas se servir de cette commande pour dupliquer les propriétés dans une même clé. Aucun retour console. ==== Déplacer une propriété ==== Cette fois-ci, pour déplacer une propriété (//-Name//) de la clé d'origine (//-Path//) vers une nouvelle clé (//-Destination//), **Move-ItemProperty** sera utilisé : Move-ItemProperty -Path "HKLM:\SOFTWARE\ShyrkaSystem\Test2" -Name "Property2" -Destination "HKLM:\SOFTWARE\ShyrkaSystem\Test3" Aucun retour console. ==== Supprimer une propriété ==== Finalement, pour supprimer une propriété, on utilisera **Remove-ItemProperty** suivi des paramètre //-Path// et //-Name// : Remove-ItemProperty -Path "HKLM:\SOFTWARE\ShyrkaSystem\Test" -Name "Property2" Aucun retour console. ~~DISCUSSION~~