Articles Tagués ‘Gérer GPO via PowerShell’

 

Aujourd’hui, nous allons découvrir une technique qui va vous permettre d’optimiser votre infrastructure G(roup) P(olicy) O(bjects) : scanner, détecter, lister et supprimer toutes les GPOs « Orphelins/Non Linkés »

 

HowTo : Lister les GPOs Orphelins

Commencez par importer le module PowerShell GroupPolicy en exécutant la commande suivante :

Import-Module GroupPolicy

Pour collecter des informations sur toutes les GPOs, le paramètre -All est utilisé avec la Cmd-let Get-GPO.

Nous exportons ensuite le résultat vers un fichier XML qui sera traité et analysé pour savoir quelle GPO n’as pas de Link vers des OUs (sous-OUs) ou Domaine AD : lecture du fichier XML ligne par ligne pour connaitre les lignes sans le mot « LinkTo »

So, CTRL+C /CTRL+V la commande suivante et notez le résultat :

Get-GPO -All | Sort-Object displayname | Where-Object {If ( $_ | Get-GPOReport -ReportType XML | Select-String -NotMatch « <LinksTo> » ) {$_.DisplayName }}

Si vous souhaitez avoir un output au format tableau, exécutez la commande suivante :

Get-GPO -All | Sort-Object displayname | Where-Object {If ( $_ | Get-GPOReport -ReportType XML | Select-String -NotMatch « <LinksTo> » ) {$_.DisplayName }} | ft -AutoSize

Pour optimiser le résultat (Output), nous allons dans l’exemple suivant, afficher uniquement les deux valeurs des deux attributs suivants :

  • DisplayName (Nom d’affichage)
  • ID (GUID* de la GPO)

 

*: GUID pour Globally Unique IDentifier

Pour ce faire, exécutez la commande suivante :

Get-GPO -All | Sort-Object displayname | Where-Object {If ( $_ | Get-GPOReport -ReportType XML | Select-String -NotMatch « <LinksTo> » ) {$_.DisplayName }} | select DisplayName,Id | ft -AutoSize

Nous allons maintenant exécuter la commande suivante pour connaître le nombre de GPO non linkés (à aucun Domaine ou OU/sous-OUs) :

(Get-GPO -All | Sort-Object displayname | Where-Object {If ( $_ | Get-GPOReport -ReportType XML | Select-String -NotMatch « <LinksTo> » ) {$_.DisplayName }}).Count

Dans mon cas, 11 GPOs au total sont actuellement stockées/hébergées dans mon annuaire AD (HKCorp.Lan : AD de LAB o_O) alors qu’elles sont ni Linkées au Domaine (HKCorp.Lan) ni aux OUs ou sous-OUs !

Pour confirmer le résultat obtenu, je vais simplement lancer l’outil/console GPMC.msc (Group Policy Management Console) et vérifier le Scope de la GPO HKCRP-POC-LAPS (GPO retournée par la commande comme étant « Orphelin ») :

Comme montré dans la screenshot ci-dessus, le scope de la GPO HKCRP-POC-LAPS est en effet vide, cela veut simplement dire que cette GPO n’a aucun Link. Cela confirme donc le résultat retourné par la commande PS ci-haut.

HowT: GPO Orphelins – Reporting

Si vous souhaitez « Journaliser » et exporter la liste des GPOs Orphelins retournés par les commandes PS précédentes, vous pouvez exécuter les commandes suivantes :

Export vers un fichier texte (.TXT File)

Get-GPO -All | Sort-Object displayname | Where-Object {If ( $_ | Get-GPOReport -ReportType XML | Select-String -NotMatch « <LinksTo> » ) {$_.DisplayName }} | Out-File C:\GPO_Orphs.txt

Vers un fichier CSV (.CSV File)

Get-GPO -All | Sort-Object displayname | Where-Object {If ( $_ | Get-GPOReport -ReportType XML | Select-String -NotMatch « <LinksTo> » ) {$_.DisplayName }} | Export-CSV C:\GPO_Orphs.csv

HowTo : Supprimer les GPOs « Orphelins »

Si après vérification, vous confirmez qu’effectivement les GPOs non linkés remontés par les commandes PS sont « obsolètes » et n’ont simplement plus besoin d’exister dans votre annuaire AD, vous pouvez les supprimer directement depuis le snap-in GPMC.msc ou en exécutant la commande suivante :

Get-GPO -All | Sort-Object displayname | Where-Object {If ( $_ | Get-GPOReport -ReportType XML | Select-String -NotMatch « <LinksTo> » ) {$_.DisplayName }} | Remove-GPO 

je vous recommande tout de même de sauvegarder toutes les GPOs Orphelins avant de les supprimer (histoire d’avoir un moyen de Rollback :)), cela peut être réalisé en exécutant les commande suivantes.

Dans l’exemple suivant, je vais sauvegarder mes 11 GPOs dans C:\GPO_Backups

$Emplacement_GPOsBackup = « C:\GPO_Backups »

Get-GPO -All | Sort-Object displayname | Where-Object {If ( $_ | Get-GPOReport -ReportType XML | Select-String -NotMatch « <LinksTo> » ) {$_.DisplayName }} | Backup-GPO -Path $Emplacement_GPOsBackup

Une entrée par GPO « sauvegardée » vous est retournée :

Les fichiers de Backups (11 au total pour les 11 GPOs) sont générés et stockés dans l’emplacement spécifié lors de l’exécution de la commande (C:\GPO_Backups » :

 

Note importante

Comme mentionné à plusieurs reprises dans ce post, les techniques expliquées ici ne couvrent pas les GPOs linkées au niveau site AD.

Notez donc que les résultats qui vont vous être retournés après exécution des différentes commandes concernent uniquement les GPOs Orphelins non « Linkées » au Domaine AD ou OUs et sous-OUs.

J’espère que cette technique pourra vous être utile lors de la réalisation de vos audits AD/GPOs.

Keep in touch, d’autres HowTo GPOs arrivent prochainement :).

#HK

Publicité