13/05/2024

PowerShellStratégie de groupe

GPO : Comparer les numéros de version en PowerShell

I. Présentation

Dans un environnement Active Directory, on trouve des contrôleurs de domaine, des postes de travail et bien sûr des stratégies de groupe (GPO) !

Il peut arriver que les GPOs ne s'appliquent pas, d'ailleurs, j'avais parlé de ce phénomène au sein d'un article dédié au debug des GPO. Aujourd'hui, on va s'intéresser de plus au numéro de versions d'une GPO qui peut poser problème... Voyons pourquoi.

En premier lieu, ce tutoriel explique l'importance du numéro de version, et ensuite je vous donnerai un script PowerShell permettant de faire un audit de ses GPOs à ce niveau-là.

II. GPO : Le numéro de version

Ce numéro de version s'incrémente lorsqu'une stratégie de groupe est modifiée, ce qui permet de notifier les autres contrôleurs de domaine d'un changement pour répliquer la modification.

Il y a plusieurs numéros de version, qui sont stockés à deux endroits différents :

  • Group Policy Container (GPC) - Stockage des propriétés liées à la GPO directement dans l'annuaire Active Directory
  • Group Policy Template (GPT) - Stockage des fichiers de la GPO directement dans un répertoire sous SYSVOL (policies)

Qui dit deux endroits différents, dit potentiellement deux valeurs différentes, et c'est bien là le problème !

Pour chaque numéro, il doit avoir une valeur identique dans le GPC et dans le GPT, autrement dit dans l'Active Directory et dans le fichier SYSVOL (fichier GPT). Si la version est différente, alors la GPO ne s'appliquera pas (il peut y avoir une exception s'il s'agit d'une GPO de sécurité), d'où l'intérêt de contrôler cette valeur.

III. Get-GPO vous donne l'info !

Si l'on souhaite prendre connaissance du numéro de version pour une GPO précise, il est possible d'utiliser "Get-GPO" qui est disponible depuis Windows Server 2008 R2.

Sur un contrôleur de domaine, il suffit d'ouvrir une console PowerShell et de saisir la commande suivante :

Get-GPO -Name "Default Domain Controllers Policy"

Les commandlets liés aux GPOs se situent dans le module "GroupPolicy". Revenons à la commande ci-dessus, il suffit de remplacer la valeur pour l'option "Name" en indiquant le nom de la stratégie de groupe que vous souhaitez vérifier.

Note : Si vous préférez, remplacez l'attribut "Name" par "Guid" et indiquez le GUID de la GPO.

La sortie de la commande contiendra deux lignes avec les numéros de version :

Get-GPO
Get-GPO

"AD Version" étant les numéros de version du GPC et "Sysvol Version" les numéros de version du GPT. Dans l'exemple ci-dessus, on remarque que les numéros sont identiques, c'est tout bon !

IV. Script - Versions des GPO de tout l'Active Directory

Pour être plus efficace et automatiser le processus de vérification, j'en ai profité pour écrire un script PowerShell qui pour chacune de vos GPO effectuera une comparaison des numéros de version.

À des fins d'audit, ce script peut être utile ! Libre à vous de l'adapter ensuite, mais sachez que le script peut fonctionner tel quel.

Voici le code du script :

# Comparer les numéros de version des GPO (Version GPC vs Version GPT) - (Version AD vs Version Sysvol)
# Audit - Debug - GPO
Import-Module GroupPolicy
Get-GPO -All | foreach{
   
   # Récupérer les infos liées à la GPO (GUID et Nom)
   $GPOId = $_.Id
   $GPOName = $_.DisplayName

   # Version GPO User
   $NumUserSysvol = (Get-Gpo -Guid $GPOId).User.SysvolVersion
   $NumUserAD = (Get-Gpo -Guid $GPOId).User.DSVersion

   # Version GPO Machine
   $NumComputerSysvol = (Get-Gpo -Guid $GPOId).Computer.SysvolVersion
   $NumComputerAD = (Get-Gpo -Guid $GPOId).Computer.DSVersion

   # USER - Comparer les numéros de version
   if($NumUserSysvol -ne $NumUserAD){ 
        Write-Host "$GPOName ($GPOId) : USER Versions différentes (Sysvol : $NumUserSysvol | AD : $NumUserAD)" -ForegroundColor Red
   }else{
        Write-Host "$GPOName : USER Versions identiques" -ForegroundColor Green
   }

   # COMPUTER - Comparer les numéros de version
   if($NumComputerSysvol -ne $NumComputerAD){ 
        Write-Host "$GPOName ($GPOId) : COMPUTER Versions différentes (Sysvol : $NumComputerSysvol | AD : $NumComputerAD)" -ForegroundColor Red
   }else{
        Write-Host "$GPOName : COMPUTER Versions identiques" -ForegroundColor Green
   }
}

Après exécution, ce script ps1 retournera ce genre de résultat :

audit-gpo-version-2

Si c'est vert, c'est OK ! Si c'est rouge, c'est qu'il y a un problème, on affiche donc le GUID de la GPO en supplément ainsi qu'en bout de ligne le numéro de version Sysvol et le numéro de version AD (pour preuve de la différence).

On s'appuie sur l'affichage des propriétés sous "User" et "Computer" pour obtenir les numéros de version via "User.DSVersion" pour l'Active Directory et "User.SysvolVersion" pour Sysvol. Pour Computer on remplacement seulement "User" par "Computer".

Liste des propriétés
Liste des propriétés

V. GPO - Dépanner une différence de version

Si vous êtes confronté à une différence (mismatch) de version, sachez que deux solutions existent (au moins). Une recommandée par Microsoft, et une autre à utiliser en dernier recourt.

  • La solution recommandée

À partir de la console de Gestion des stratégies de groupe, éditez la GPO qui pose problème. Modifiez un paramètre ("non critique") dans cette GPO afin de déclencher une incrémentation du numéro de version.

Cette modification doit avoir pour effet de synchroniser les différents éléments, et vous devriez vous retrouver avec un numéro de version à nouveau identique !

Si ce n'est pas le cas...

  • La solution facultative

Non recommandée par Microsoft, mais qui doit fonctionner, vous éditez directement le fichier GPT situé à la racine du dossier de la GPO dans SYSVOL. Il suffit de repérer le GUID de votre GPO (Get-GPO vous donnera cette info), et d'accéder à son dossier dans SYSVOL, pour rappel le chemin par défaut est :

C:\Windows\SYSVOL\domain\Policies

Fichier GPT
Fichier GPT

Avec ceci vous devriez vous en sortir ! En tout cas, je vous le souhaite.

Ce tutoriel est désormais terminé, n'hésitez pas à ajouter des compléments d'information et à apporter vos remarques quant à ce script, qui peut sûrement être amélioré 🙂

author avatar
Florian BURNEL Co-founder
Ingénieur système et réseau, cofondateur d'IT-Connect et Microsoft MVP "Cloud and Datacenter Management". Je souhaite partager mon expérience et mes découvertes au travers de mes articles. Généraliste avec une attirance particulière pour les solutions Microsoft et le scripting. Bonne lecture.
Partagez cet article Partager sur Twitter Partager sur Facebook Partager sur Linkedin Envoyer par mail

2 commentaires sur “GPO : Comparer les numéros de version en PowerShell

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.