17/11/2024

Active DirectoryPowerShellStratégie de groupe

Quelles sont les GPO modifiées dans les 24 dernières heures ?

I. Présentation

L'audit et la surveillance de son infrastructure sont essentiels, l'Active Directory n'échappe pas à cette règle, que ce soit pour journaliser les actions de création, modification et suppression d'un utilisateur, la connexion d'un utilisateur sur un poste, etc... Il peut être également intéressant de garder un œil sur les stratégies de groupe (GPO), notamment sur les dernières GPO modifiées. Sait-on jamais, s'il y avait une modification anormale...

Avec la méthode que l'on va voir, par script PowerShell, vous pourrez ensuite le faire tourner en automatique sur l'un de vos contrôleurs de domaine, et, pourquoi pas vous envoyer un rapport chaque jour ou semaine pour savoir quelles sont les GPO modifiées récemment.

II. Voir les GPO modifiées via PowerShell

Pour parvenir à visualiser de manière simple quelles sont les GPO modifiées récemment, il est nécessaire de passer par un script, car la console graphique de gestion des GPO ne permet pas d'avoir cette vue d'ensemble.

Pour ma part, j'ai pris le temps de coder une fonction pour afficher les GPO modifiées sur les X derniers jours, je vous glisse le code de cette fonction ci-dessous, accompagnée de son lot d'explications.

function Show-GPOEditLastXDays{
     
     # Deux paramètres obligatoires, le premier pour le nom complet du domaine
     # et le second pour le nombre de jours à prendre en compte pour détecter les modifs
     param(
     [parameter(Mandatory=$true)][string]$DomainName,
     [parameter(Mandatory=$true)][int]$LastXDays
     )

# Création d'un objet COM pour utiliser l'API de la console GPMC
$GPM = New-Object -ComObject GPMgmt.GPM

try{

  # Etablir la connexion avec le domaine AD
  $GPMDomain =$GPM.GetDomain("$DomainName", "", $GPMConstants.UseAnyDC)
 
  # Définir un critère de recherche, en l'occurrence vide car on voudra toutes les GPO
  $GPMSearchCriteria = $GPM.CreateSearchCriteria()
 
  # Récupérer la liste de toutes les GPO du domaine
  $GPMAllGpos = $GPMDomain.SearchGPOs($GPMSearchCriteria)

  # Initialiser le compteur, sera incrémenté pour compter le nombre de GPO modifiées
  $Counter = 0

  # Pour chaque GPO, on regarde si elle a été modifiée depuis les X derniers jours
  # Selon la valeur du paramètre "$LastXDays"
  foreach ($GPO in $GPMAllGpos) {

    if ($GPO.ModificationTime -ge (Get-Date).AddDays(-$LastXDays)) {

    # Pour chaque GPO qui matche, on crée un objet custom
    # contenant le nom de la GPO et la date de dernière modification
    [PSCustomObject] @{
    "GPOName" = $GPO.DisplayName ;
    "GPOModificationTime" = $GPO.ModificationTime
    }

    $Counter++
    }

  } # foreach ($GPO in $GPMAllGpos)
 
  # Si le compteur est égal à 0 c'est qu'il n'y a pas eu de GPO modifiées
  # donc on donne l'info dans la console, pour éviter une sortie vide
  if($Counter -eq 0){
     Write-Output "0 GPO modified in the last $LastXDays day(s)"
  } # if($Counter -eq 0)

}catch{

  Write-Output "ERROR ! Impossible to get the list of edited GPO, it's possible that the domain name is incorrect"
 
 }
}

Maintenant, si l'on exécute la fonction, avec les bons arguments, par exemple :

Show-GPOEditLastXDays -DomainName "it-connect.local" -LastXDays 7

On voit qu'un tableau est retourné avec 2 colonnes correspondantes au nom de la GPO et à la date de dernière modification. Bien entendu, la liste contient uniquement les GPO modifiées lors des 7 derniers jours, pour obtenir les GPO modifiées sur les dernières 24 heures, il suffit d'indiquer "1" pour l'option LastXDays.

Par curiosité, on peut ouvrir la console des GPO sur le serveur pour vérifier que les infos sont bonnes, ce qui est bien le cas ! 🙂

Avec cette API très puissante pour la gestion des GPO, il est possible de faire beaucoup de choses... comme créer une GPO ou dupliquer une GPO, en plus de pouvoir explorer toutes les propriétés. Il y a possibilité de faire de belles choses notamment en matière d'audit. 🙂

Retrouvez le script sur mon GitHub : Audit - Quelles sont les GPO modifiées lors des X derniers jours ?

author avatar
Florian BURNEL Co-founder of IT-Connect
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

7 commentaires sur “Quelles sont les GPO modifiées dans les 24 dernières heures ?

  • Avoir un contrôle de ses GPO est essentiel, et la méthode consistant à s’informer sur d’éventuelles modifications des GPO de sont Contrôleur de domaine est essentiel. Le script peut éventuellement être également configuré pour envoyer les mail et où que l’on soit, on peut continuer à monitorer son AD.

    Merci pour tous!

    Répondre
    • Bonjour,

      Merci pour le tutoriel Florian.

      Si l’on souhaite que les rapports soient envoyés par mail, comment faut-il procéder dans le script Powershell ?

      Merci par avance.
      Bonne journée.

      Répondre
  • Merci pour le tutoriel, ça fonctionne très bien.

    Comment faut-il s’y prendre si l’on souhaite que le rapport soit envoyé par mail ?

    Merci

    Répondre
    • Bonjour Julien,

      Si ta question est toujours d’actualité, voici une solution :

      1- Exporte ton résultat avec Out-file :

      Out-file C:\Users\*****\Documents\Rapports\nom_de_ton_fichier.txt

      2- Met le en pièce jointe avec SendmailMessage et -Attachments :

      $encodingMail = [System.Text.Encoding]::UTF8
      $to = @(« [email protected] »)
      $from = « [email protected] »
      $subject = « Rapport hebdomadaire modifications GPO »
      $smtpServer = « IP ou nom du serveur smtp »
      $body = « Rapports hebdomadaire en pj »

      Send-MailMessage -to $to -From $from -Subject $subject -SmtpServer $smtpServer -BodyAsHtml $body -Encoding $encodingMail -Attachments « C:\Users\*****\Documents\Rapports\nom_de_ton_fichier.txt »

      Répondre
  • Bonjour, je débute alors mes questions seront peut-être stupides.

    j’ai copié le script dans un fichier .ps1

    puis ne sachant pas comment faire, j’ai cherché un peu et j’ai trouvé qu’il fallait peut être l’éxécuter avec la commande .\script.ps1

    Puis ensuite lancer en ligne de commande Show-GPOEditLastXDays -DomainName « it-connect.local » -LastXDays 7

    Sauf que çà ne doit pas être comme cela car j’obtiens un message d’erreur : (que je n’arrive pas à copier) : Show-GPOEditLastXDays : le terme n’est pas reconnu come nom d’applet de commande……….

    Que faut-il faire pour que cela fonctionne ?

    merci

    Répondre
    • Bonjour,
      Est-ce que le répertoire courant de ta console PowerShell (qui s’affiche à gauche du prompt) correspond bien au dossier dans lequel se situe le script Show-GPOEditLastXDays ? Sinon, tu dois te déplacer avec la commande : cd c:\chemin\dossier
      Cordialement,
      Florian

      Répondre

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.