Title: Utiliser powershell pour supprimer des clés de registres
Category: sysadmin
Tags: Powershell, Windows, script
Date: 2019-06-04 1:30
Status: published

Oui je l'avoue, je fais pas mal de scripts powershell au boulot, et je ne trouves
pas ça déplaisant. Il bien le faut dire : pour automatiser des choses sous
Microsoft Windows, c'est une  étape obligée.

## Modifier des clefs de registres utilisateurs

Une application métier a besoin de changement de paramétrages, ceux ci peuvent
être fait via le chemin `HKLM:\SOFTWARE\WOW6432Node\<application>`. Sauf que
c'est trop simple... Je ne sais pas vraiment pourquoi[^n_defi], mais
l'application écrit aussi ces paramètres dans la ruche de  certains
utilisateurs, plus spécifiquement dans celle stockée dans le fichier
`C:\Users\<user>\AppData\Local\Microsoft\Windows\UsrClass.dat`, utilisée dans
`HKU:\<SID>_classes\VirtualStore\MACHINE\SOFTWARE\WOW6432Node\<application>`.

Ceux-ci "surchargent" les parametres globaux empêchant les nouveaux paramètres
de fonctionner, je dois donc les supprimer **de ces utilisateurs**. Mais j'ai 80
comptes de crées sur cette machine, un peu long à la main.

Ne causons pas trop du registre Windows, [ce site][l_winreg] le fait très bien
(en anglais)

[l_winreg]:https://www.techsupportalert.com/content/deeper-windows-registry.htm

## Avec un script powershell

Mettre en place un script est donc tout indiqué dans ce cas, mais croyez-moi
c'est pas évident de trouver des exemples de codes sur le "montage" des ruches,
voici donc le script réalisé pour ce cas :

```powershell
$dir = "VirtualStore\MACHINE\SOFTWARE\WOW6432Node\mon_appli"
# Récupération des utilisateurs ayant un compte sur le systeme
$sid = Get-WmiObject -Class Win32_UserAccount | Select SID
$profile_list = "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\"
New-PSDrive -PSProvider Registry -Root HKEY_USERS -Name HKU | Out-Null
foreach ($s in $sid) {
    # Recupération du répertoire de l'utilisateur
    $path = Get-ItemPropertyValue -Path "$profile_list$($s)\" -Name "ProfileImagePath" -ErrorAction SilentlyContinue
    if ( -not $path -eq ""){
        try {
            # Chargement de la ruche et supression du chemin
            reg load "HKU\$($s)_classes" "$($path)\AppData\Local\Microsoft\Windows\UsrClass.dat" 2>&1 | Out-Null
            Remove-Item -Path "HKU:\$($s)_Classes\$($dir)" -recurse
        }
        catch {
            write-host "Can't remove for $s"
        }
        [gc]::collect()
        Start-sleep -Seconds 2
        reg unload "HKU\$($s)" 2>&1 | Out-Null
    }
}
Remove-PSDrive -Name HKU
```

Et voilà!

[^n_defi]: enfin si je sais : c'est une application en Windev, ce qui en dit
  beaucoup sur sa qualité générale...
