$flagFolder = "C:\ProgramData\PrinterHKeyClean" $flagFile = "${flagFolder}\v1.flag" if (!(Test-Path $flagFolder)) { New-Item -Path $flagFolder -ItemType Directory -Force | Out-Null } if (Test-Path $flagFile) { Write-Host "Script has already run. Exiting." exit } $profileListKey = 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList' $sids = Get-ChildItem $profileListKey $printerPaths = @( '\Printers\Connections', '\Printers\ConvertUserDevModesCount', '\Software\Xerox\PrinterDriver', '\Software\Microsoft\Windows NT\CurrentVersion\Devices' ) $HKLMPrinterPaths = @( 'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Print\Providers', 'HKEY_LOCAL_MACHINE\SOFTWARE\Xerox\PrinterDriver' ) net stop spooler foreach ($printerPath in $HKLMPrinterPaths) { try { Remove-Item -Path "Registry::$printerPath" -Recurse -Force -ErrorAction Stop } catch { Write-Host "Error: $($_.Exception.Message)" } } foreach ($sidKey in $sids) { $sid = $sidKey.PSChildName $profilePath = (Get-ItemProperty -Path $sidKey.PSPath -Name ProfileImagePath).ProfileImagePath foreach ($printerPath in $printerPaths) { try { Remove-Item -Path "Registry::HKEY_USERS\$sid$printerPath" -Recurse -Force -ErrorAction Stop } catch { Write-Host "Error: $($_.Exception.Message)" } } if (-not $mounted) { $unloadResult = & reg.exe unload "HKU\$sid" 2>&1 } } net start spooler gpupdate /force New-Item -Path $flagFile -ItemType File -Force