Identifier et supprimer les GPO sans liaison avec PowerShell
I. Présentation
Lorsque l'on administre, audit, ou reprend la gestion d'une infrastructure basée sur un environnement Microsoft et plus particulièrement un Active Directory, on se retrouve forcément confronté à la gestion des GPO. En fonction du nombre qu'il y en a, cela peut représenter un joli sac de noeuds, il est donc intéressant d'être en mesure d'identifier les GPO "Unlinked" c'est-à-dire les GPO sans liaison.
Une GPO sans liaison n'ayant pas d'utilité puisqu'elle ne s'appliquera sur aucun utilisateur, aucun ordinateur. Un bon moyen de commencer à faire du tri dans l'infrastructure en question.
Il existe des ressources sur Internet à ce sujet, pour ma part, je suis parti d'un script existant que l'on retrouve sur la galerie Microsoft et qui se nomme "Get-UnlinkedGPO". Ce script va lister les GPO sans liaison grâce à la propriété "GPO.LinksTo" du cmdlet Get-GPOReport qui sert à obtenir les liaisons d'une GPO. Le nombre total de GPO unlinked va s'afficher également.
Vous pouvez le récupérer en cliquant sur le lien ci-dessous, il suffit de l'exécuter ensuite pour identifier les stratégies de groupe sans liaison ?
II. Supprimer les GPO sans liaison
Pour la suite, je vous propose de reprendre le script téléchargé précédemment, que l'on va faire évoluer pour apporter deux actions supplémentaires :
- La sauvegarde de chaque GPO sans liaison
- La suppression de chaque GPO sans liaison
Commençons par stocker dans une variable $DC le nom du contrôleur de domaine ciblé pour l'exécution des différentes commandes.
$DC = "SRV-DC.it-connect.local"
Ensuite, je vous propose le bout de code ci-dessous pour traiter chaque GPO sans liaison identifiée par la première phase du traitement (correspondante au script que l'on a récupéré sur le site Microsoft). Le nom des différentes GPO unlinked étant stockés dans la variable $unlinkedGPOs.
? Note : ce bout de code est à ajouter à la suite du script téléchargé précédemment.
Pour chaque GPO, nous allons réaliser une sauvegarde grâce à la commande Backup-GPO (dans le dossier "C:\GPO_Backup") et si la sauvegarde s'effectue correctement, nous procédons à sa suppression via la commande Remove-GPO. Un retour dans la console est effectué à chaque fois.
Foreach($GPO in $unlinkedGPOs){ Write-Host "Traitement de la GPO : $($GPO.DisplayName) ($($GPO.Id))" $Error.Clear() Backup-GPO -Guid $GPO.Id -Path "C:\GPO_Backup" -Server $DC -ErrorVariable BackupGPOState if($error.Count -ieq 0){ Write-Host "Suppression de la GPO : $($GPO.DisplayName) ($($GPO.Id))" -ForegroundColor Green Remove-GPO -Guid $GPO.Id -Server $DC }else{ Write-Host "Echec lors de la suppression de la GPO : $($GPO.DisplayName) ($($GPO.Id))" -ForegroundColor Red } }
Pour chaque GPO traitée, une sortie de ce type sera affichée dans la console :
Traitement de la GPO : Ma_GPO_01 (ff26da7e-5544-45b0-bf45-6689f9d81670) DisplayName : Ma_GPO_01 GpoId : ff26da7e-5544-45b0-bf45-6689f9d81670 Id : 3592da82-89a4-4000-ae28-6087963b0954 BackupDirectory : C:\GPO_Backup CreationTime : 11/03/2020 21:38:43 DomainName : it-connect.local Comment : Suppression de la GPO : Ma_GPO_01 (ff26da7e-5544-45b0-bf45-6689f9d81670)
Voilà, avec ces quelques lignes de code, vous allez pouvoir réaliser un premier niveau de nettoyage au sein de vos GPO, sans perdre la possibilité de les récupérer si besoin puisque nous prenons le soin de les sauvegarder.
Bonjour Florian,
Tout à l’heure sur un PC j’ai remarqué qu’il y’avait un filtre que j’avais mis en place pour bloquer une application via GPO et que cette GPO n’existe plus sur mon serveur.
J’aimerais savoir comment le (filtre) supprimer de ce PC, il n’est certainement pas le seul.
Dois-je re-créer une GPO avec le même nom sur mon serveur ?
Merci d’avance de votre retour.