Imprimantes GPO qui ne se désinstallent pas : solutions, scripts PowerShell et prévention (Windows/AD)

Une imprimante déployée par GPO reste visible alors que vous avez supprimé l’objet et rompu le lien ? Voici un guide opérationnel pour comprendre ces « imprimantes collantes », les supprimer proprement (poste isolé ou parc entier) et éviter qu’elles ne reviennent lors des prochains cycles de stratégie.

Sommaire

Vue d’ensemble du problème

Un GPO de déploiement d’imprimante a été lié par erreur à la racine du domaine ; toutes les stations ont reçu la connexion d’imprimante. Le modèle Computer Configuration > Policies > Windows Settings > Deployed Printers a ensuite été modifié : l’imprimante a été retirée du GPO et le lien GPO a été supprimé. Pourtant :

  • La file reste visible dans Périphériques et imprimantes sur les PC.
  • Le rapport gpresult /h répertorie encore l’entrée sous Printer Connections, alors qu’aucun GPO d’imprimante n’est désormais appliqué.
  • Déplacer l’ordinateur dans une OU sans GPO d’imprimante ne supprime pas la connexion.

Pourquoi cela arrive

Deployed Printers est un mécanisme historique basé sur des « pushed connections ». Il écrit la connexion d’imprimante une fois sur le poste (souvent au niveau utilisateur) mais ne gère pas sa révocation lorsque le GPO disparaît. En conséquence, l’entrée reste en place dans le profil ou dans le magasin d’objets d’impression côté client, d’où les « imprimantes fantômes » qui persist ent. À l’inverse, Group Policy Preferences (GPP) ▸ Printers sait supprimer automatiquement l’élément quand la préférence ne s’applique plus (option « Remove this item when it is no longer applied » en mode Replace).

Solutions & bonnes pratiques (vue synthétique)

ObjectifMéthodeDétails / commandes
1. Nettoyer immédiatement une station isoléeA) Suppression GUI : Panneau de configuration ► Périphériques et imprimantes ► clic droit ► Supprimer.
B) PowerShell (admin) :
Remove-Printer -Name "NomPartage"
Remove-PrinterPort -Name "IP_192.168.x.x"
Agit uniquement sur le poste courant.
2. Forcer l’actualisation des stratégiesgpupdate /force (ou redémarrage)La mise à jour seule ne supprime pas l’imprimante, car « Deployed Printers » ne gère pas la désinstallation automatique ; elle est cependant nécessaire après modification des GPO.
3. Nettoyer les imprimantes “collantes” par registreSupprimer puis redémarrer le spooler :
sc stop spooler
reg delete "HKU\<SID>\SOFTWARE\Policies\Microsoft\Windows NT\Printers\PushedConnections" /f
reg delete "HKU\<SID>\SOFTWARE\Policies\Microsoft\Windows NT\Printers\PushedPrinterConnectionStore" /f
reg delete "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Print\Providers\Client Side Rendering Print Provider\Servers\<Serveur>\Printers" /f
sc start spooler
Méthode proposée quand les objets restent référencés dans le magasin « Pushed Connections ». Toujours sauvegarder le registre avant.
4. Gérer la suppression à grande échelleA) Activer le rôle Print Server sur un serveur (même temporairement) puis retirer l’imprimante via Print Management.mscPrinters ► clic droit ► Delete.
B) Script de logon (GPO ou Intune) qui exécute Remove-Printer si l’imprimante n’est plus souhaitée.
Permet d’éviter une intervention manuelle machine par machine.
5. Éviter le problème à l’avenir• Utiliser Group Policy Preferences ▸ Printers plutôt que « Deployed Printers » : cocher “Remove this item when it is no longer applied” (mode Replace).
• Tester toute GPO dans une OU de pré‑production avant de la lier plus haut.
• Segmenter les imprimantes par OU et filtrage de sécurité ou par Item‑level targeting.
• Documenter et inventorier les GPO afin d’éviter les liens accidentels.
GPP gère la désinstallation automatique et offre un meilleur contrôle granulaire.

Procédures détaillées et pas‑à‑pas

Nettoyage d’une station isolée (administrateur local)

  1. Fermer les applications susceptibles d’imprimer.
  2. GUI : Périphériques et imprimantes ► clic droit sur la file ► Supprimer l’appareil. Si la suppression échoue : redémarrer le service Spouleur d’impression.
  3. PowerShell (élevé) : # Lister pour confirmer le nom exact Get-Printer | Sort-Object Name | Format-Table Name,ShareName,PortName,DriverName,Type # Supprimer la file locale (nom local, pas forcément le ShareName) Remove-Printer -Name "NomLocalDeLaFile" # Facultatif : supprimer le port associé s'il n'est utilisé par aucune autre file $port = "IP_192.168.x.x" if (-not (Get-Printer | Where-Object { $_.PortName -eq $port })) { Remove-PrinterPort -Name $port -ErrorAction SilentlyContinue } Astuce : la propriété ShareName n’est pas toujours renseignée pour les connexions mappées ; vérifiez Name, FullName (s’il existe), et PortName.
  4. Redémarrer le Spooler si nécessaire : Restart-Service -Name spooler -Force

Actualiser les stratégies et clarifier l’état des GPO

  1. Exécuter : gpupdate /force.
  2. Vérifier le périmètre : gpresult /h C:\Temp\gp.html Start-Process C:\Temp\gp.html
  3. Comprendre : même si un GPO est supprimé, une connexion poussée déjà écrite ne s’auto-efface pas.

Quand la suppression GUI/PowerShell ne suffit pas : nettoyage registre

Parfois, la référence persiste dans les magasins « Pushed Connections ». Procédez prudemment (sauvegarde préalable) :

  1. Ouvrir regedit.exe en administrateur et sauvegarder la clé concernée.
  2. Arrêter le spouleur : sc stop spooler.
  3. Supprimer les emplacements suivants (par SID utilisateur) :
reg delete "HKU\<SID>\SOFTWARE\Policies\Microsoft\Windows NT\Printers\PushedConnections" /f
reg delete "HKU\<SID>\SOFTWARE\Policies\Microsoft\Windows NT\Printers\PushedPrinterConnectionStore" /f
reg delete "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Print\Providers\Client Side Rendering Print Provider\Servers\<Serveur>\Printers" /f

Relancer le spouleur : sc start spooler.

Pour traiter tous les profils utilisateur présents sur la machine de façon scriptée :

# Nettoyage des "pushed connections" pour tous les SIDs chargés (HKEY_USERS)
$paths = @(
 'SOFTWARE\Policies\Microsoft\Windows NT\Printers\PushedConnections',
 'SOFTWARE\Policies\Microsoft\Windows NT\Printers\PushedPrinterConnectionStore'
)

Stop-Service spooler -Force
Get-ChildItem Registry::HKEY_USERS | Where-Object { $*.Name -match 'S-1-5-21-\d+-\d+-\d+-\d+$' } | ForEach-Object {
$sid = $*.PSChildName
foreach ($rel in $paths) {
$full = "Registry::HKEY_USERS$sid$rel"
if (Test-Path $full) {
Remove-Item -Path $full -Recurse -Force -ErrorAction SilentlyContinue
}
}
}

# Nettoyage côté machine (files référencées pour un serveur donné)

$server = "SERVEUR_IMPR"
$csrp = "Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Print\Providers\Client Side Rendering Print Provider\Servers$server\Printers"
if (Test-Path $csrp) { Remove-Item -Path $csrp -Recurse -Force -ErrorAction SilentlyContinue }

Start-Service spooler

Important : si des connexions d’imprimante sont recréées au logon, vérifiez qu’aucun autre GPO, script, outil tiers (SCCM/PDQ/Intune) ou stratégie de redirection RDS ne remappe la file.

Suppression à grande échelle (parc complet)

Option Console – Print Management

  1. Sur un serveur (ou un poste admin), activer les outils Print and Document Services si nécessaire.
  2. Ouvrir Print Management (printmanagement.msc).
  3. Dans Deployed Printers, examiner et retirer les associations résiduelles si elles apparaissent encore.
  4. Dans Printers, supprimer la file du serveur si elle n’a plus lieu d’être. Attention : cela supprime la queue côté serveur ; si la file doit vivre mais ne plus être mappée, retirez plutôt le déploiement.

Option Script – Logon/Startup/Intune

Déployez un script idempotent qui détecte et supprime la file non désirée. Exemple minimal :

# Retirer une file connectée à un partage précis
$targetShare = "NomPartage"        # Nom local (souvent égal au ShareName)
$targetServer = "SERVEUR_IMPR"     # Optionnel : pour filtrer FullName \\serveur\partage

Get-Printer |
Where-Object {
$*.Name -eq $targetShare -or
$*.ShareName -eq $targetShare -or
$*.FullName -eq "\$targetServer$targetShare"
} |
ForEach-Object {
"{0}: suppression de {1}" -f $env:COMPUTERNAME,$*.Name | Out-Host
Remove-Printer -InputObject $_ -ErrorAction SilentlyContinue
}

Pour couvrir aussi les ports IP et assurer un nettoyage complet :

# Supprimer le port si non utilisé par d'autres files
$portCandidates = Get-PrinterPort | Where-Object { $_.Name -like "IP_*" }
foreach ($p in $portCandidates) {
    if (-not (Get-Printer | Where-Object { $_.PortName -eq $p.Name })) {
        Remove-PrinterPort -Name $p.Name -ErrorAction SilentlyContinue
    }
}

Option GPO de remédiation

Appliquez temporairement un GPO de correction (par exemple Logon Script utilisateur) qui exécute la suppression pour les utilisateurs ciblés. Dès stabilisation, retirez ce GPO de remédiation.

Prévenir définitivement le retour du problème

Passer de « Deployed Printers » à Group Policy Preferences ▸ Printers

  1. Créer une préférence Shared Printer (User Config ▸ Preferences ▸ Control Panel Settings ▸ Printers).
  2. Définir Action : Replace et cocher Remove this item when it is no longer applied.
  3. Dans l’onglet Common, activer l’Item‑level targeting pour cibler précisément (OU, groupe, nom du site AD, plage IP, etc.).
  4. Tester dans une OU de pré‑prod avant tout déploiement large.

Modèle d’organisation recommandé

  • Une GPP par imprimante ou par zone fonctionnelle (site/étage), avec ciblage fin.
  • Filtres de sécurité (groupes AD) pour limiter l’application aux seules populations.
  • Documentation claire : nom, portée, responsable, date de création/modif, procédure de rollback.

Diagnostic approfondi & contrôle qualité

VérificationOutil/commandeCe qu’il faut observer
GPO effectifsgpresult /r ou gpresult /hAucune stratégie n’alimente l’entrée sous Printer Connections.
Connexions localesGet-PrinterNom local de la file (peut différer du ShareName). Le PortName aide à repérer les files IP.
Événements d’impressionEvent Viewer ► Microsoft‑Windows‑PrintService/OperationalErreurs de port/driver, recréations en boucle au logon.
Pollution registreregedit / scripts PowerShellPrésence de clés PushedConnections et PushedPrinterConnectionStore malgré la suppression du GPO.

Rappels de fonctionnement (à connaître)

  1. Cycle de rafraîchissement : sans gpupdate /force, une machine peut attendre jusqu’à 90 minutes + un aléa de 0–30 minutes pour l’intervalle de stratégie ordinateur.
  2. Limites de « Deployed Printers » : écrit une fois, ne supprime jamais automatiquement — d’où les imprimantes fantômes.
  3. PowerShell de masse : via PDQ Deploy, Intune ou script GPO, la ligne suivante cherche et supprime l’imprimante ciblée sur tous les postes : Get-Printer -ComputerName $env:COMPUTERNAME | Where-Object ShareName -eq "NomPartage" | Remove-Printer
  4. RDS/VDI : les stratégies de redirection d’impression peuvent recréer la file à chaque session. Désactivez/ajustez la redirection si nécessaire ou excluez les connexions redirigées du périmètre de remédiation.

Plan d’action recommandé (résumé opérationnel)

  1. Figer l’état : suspendre tout GPO/script/outil tiers qui pourrait remapper la file.
  2. Appliquer un nettoyage contrôlé :
    • Sur postes pilotes : suppression GUI/PowerShell, puis registre si nécessaire.
    • Au besoin, Script de remédiation (GPO/Intune) pour retirer la file et les ports non utilisés.
  3. Redémarrer le spouleur et forcer gpupdate /force.
  4. Basculer vers GPP avec Replace + Remove this item… et Item‑level targeting.
  5. Contrôler via gpresult, Get-Printer et journaux d’impression.
  6. Documenter : ce qui a été supprimé, où et pourquoi, avec le script et la version.

Scripts prêts à l’emploi (exemples avancés)

1) Détection des files « fantômes » par nom/serveur

# Paramètres
$TargetServers = @("SERVEUR_IMPR1","SERVEUR_IMPR2")
$TargetShares  = @("NomPartageA","NomPartageB")

Get-Printer | Where-Object {
($*.FullName -and ($TargetServers | ForEach-Object { "\$*" }) | ForEach-Object { $_ -and $_ -eq ($*.FullName -replace '\\$','') }) -or
($TargetShares -contains $*.Name) -or
($TargetShares -contains $_.ShareName)
} | Select-Object Name,ShareName,FullName,PortName,DriverName,Type | Format-Table -AutoSize

2) Remédiation complète et idempotente

param(
  [string[]]$SharesToRemove = @("NomPartage"),
  [string[]]$ServersToRemove = @("SERVEUR_IMPR")
)

Write-Host "[$env:COMPUTERNAME] Début remédiation imprimantes…"

# 1) Retrait des files

$printers = Get-Printer
$targets = $printers | Where-Object {
$matchName  = ($SharesToRemove -contains $*.Name) -or ($SharesToRemove -contains $*.ShareName)
$matchFull  = ($*.FullName -and ($ServersToRemove | ForEach-Object { "\$*" }) | ForEach-Object { $_ -and $_ -eq ($_.FullName -replace '\\$','') })
$matchName -or $matchFull
}
foreach ($p in $targets) {
Write-Host (" - Suppression de la file : {0}" -f $p.Name)
Remove-Printer -InputObject $p -ErrorAction SilentlyContinue
}

# 2) Retrait des ports orphelins

$allPorts = Get-PrinterPort
foreach ($port in $allPorts) {
if (-not (Get-Printer | Where-Object { $_.PortName -eq $port.Name })) {
Write-Host (" - Suppression du port orphelin : {0}" -f $port.Name)
Remove-PrinterPort -Name $port.Name -ErrorAction SilentlyContinue
}
}

# 3) Nettoyage registre des pushed connections

Stop-Service spooler -Force
$relPaths = @(
'SOFTWARE\Policies\Microsoft\Windows NT\Printers\PushedConnections',
'SOFTWARE\Policies\Microsoft\Windows NT\Printers\PushedPrinterConnectionStore'
)
Get-ChildItem Registry::HKEY_USERS | Where-Object { $*.Name -match 'S-1-5-21-\d+-\d+-\d+-\d+$' } | ForEach-Object {
$sid = $*.PSChildName
foreach ($rel in $relPaths) {
$full = "Registry::HKEY_USERS$sid$rel"
if (Test-Path $full) {
Write-Host (" - Suppression clé : {0}" -f $full)
Remove-Item -Path $full -Recurse -Force -ErrorAction SilentlyContinue
}
}
}
Start-Service spooler
Write-Host "[$env:COMPUTERNAME] Remédiation terminée."

FAQ & cas particuliers

La file réapparaît après suppression. – Un autre mécanisme la redéploie (GPO oublié, script de logon, outil de gestion, redirection RDS). Désactivez temporairement ces sources le temps du nettoyage et corrigez leur configuration.

Le nom local diffère du nom de partage. – C’est courant ; ciblez via PortName ou FullName (\\serveur\partage) plutôt que Name uniquement.

Multi‑utilisateurs sur la même machine. – Les entrées étant souvent par profil, répétez le nettoyage pour chaque SID sous HKEY_USERS (script fourni ci‑dessus).

RDS/VDI – Les stratégies de redirection peuvent créer une file par session. Stabilisez d’abord la stratégie RDS, puis appliquez la remédiation.

Conclusion

Les imprimantes déployées avec l’ancien modèle Deployed Printers ne se désinstallent pas d’elles‑mêmes : c’est by‑design. Le combo gagnant est de purger les références (registre/ports), forcer l’actualisation et basculer vers GPP avec suppression automatique quand l’élément ne s’applique plus. En procédant par pilotes, postes pilotes puis déploiement graduel, vous éliminez durablement les « imprimantes fantômes » et reprenez la main sur le cycle de vie des connexions d’impression.


Annexes utiles

Checklist d’intervention rapide

  • 📌 Identifier le périmètre : quels serveurs/partages et quelles OU sont impactés.
  • 🧪 Tester sur 2–3 postes pilotes (dont un utilisateur « classique » et un admin local).
  • 🧹 Purger la file + port + clés PushedConnections.
  • 🔁 gpupdate /force + redémarrage du spouleur.
  • 🔐 Migrer vers GPP (Replace + Remove when no longer applied).
  • 🧾 Documenter (qui, quoi, quand, comment, rollback).

Modèle de consignes GPP (exemple)

Type : Shared Printer
Action : Replace
Share Path : \\SERVEUR_IMPR\NomPartage
Common ▸ Remove this item when it is no longer applied : ✓
Common ▸ Item‑level targeting : OU=Site‑Lyon,OU=Postes‑Fixes,DC=exemple,DC=local
Run in logged‑on user’s security context : ✓

Scripts d’inventaire (préventif)

# Export CSV des files contenant "NomPartage" ou pointant vers SERVEUR_IMPR (poste local)
$export = "C:\Temp\inventaire_imprimantes.csv"
Get-Printer |
  Where-Object { $_.Name -like "*NomPartage*" -or $_.FullName -like "\\SERVEUR_IMPR\*" } |
  Select-Object Name,ShareName,FullName,PortName,DriverName,Type |
  Export-Csv -NoTypeInformation -Path $export
Write-Host "Inventaire exporté vers $export"

Bonnes pratiques d’ingénierie

  • Préfixer les files par site (ex : LYN‑HPLJ‑FIN‑01) pour simplifier la détection et le ciblage.
  • Éviter les affectations « globales » ; privilégier le ciblage par groupe de sécurité.
  • Documenter une procédure de rollback (réimport GPP, remise en place temporaire d’une file, etc.).
  • Programmer des health checks périodiques (inventaires, vérifications de ports orphelins).
Sommaire