Utiliser powershell pour supprimer des clés de registres

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 pourquoi1, 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 le fait très bien (en anglais)

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 :

$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à!


  1. enfin si je sais : c’est une application en Windev, ce qui en dit beaucoup sur sa qualité générale…