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 ?
Merci Florian, cela marche nickel ! 😉
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!
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.
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
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 »
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
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