diff --git a/content/articles/2019/powershell-changer-registre-userclass/index.md b/content/articles/2019/powershell-changer-registre-userclass/index.md new file mode 100644 index 0000000..aec3b37 --- /dev/null +++ b/content/articles/2019/powershell-changer-registre-userclass/index.md @@ -0,0 +1,65 @@ +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 script 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\`. 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 +l'utilisateurs, plus spécifiquement dans celle stockée dans le fichier +`C:\Users\\AppData\Local\Microsoft\Windows\UsrClass.dat`, utilisée dans +`HKU:\_classes\VirtualStore\MACHINE\SOFTWARE\WOW6432Node\`. + +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éaliser 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...