ANAVEM
Référence
Languageen
Comment surveiller la santé d'Active Directory avec des scripts PowerShell

Comment surveiller la santé d'Active Directory avec des scripts PowerShell

Créer une surveillance de santé automatisée pour les contrôleurs de domaine Active Directory en utilisant des scripts PowerShell, des rapports planifiés et des notifications par e-mail pour une gestion proactive de l'infrastructure AD.

Emanuel DE ALMEIDAEmanuel DE ALMEIDA
17 mars 2026 15 min 9
mediumactive-directory 8 étapes 15 min

Pourquoi surveiller la santé d'Active Directory avec PowerShell ?

Active Directory est l'épine dorsale de la plupart des environnements d'entreprise Windows, gérant l'authentification, l'autorisation et les services d'annuaire pour des milliers d'utilisateurs et d'ordinateurs. Lorsque AD échoue, l'ensemble des opérations commerciales peut s'arrêter. La surveillance traditionnelle repose souvent sur des approches réactives - attendre que les utilisateurs signalent des problèmes ou vérifier les journaux après l'apparition de problèmes.

La surveillance de la santé basée sur PowerShell transforme cette approche réactive en une stratégie proactive. En automatisant des vérifications complètes sur les contrôleurs de domaine, le statut de réplication, la fonctionnalité DNS et les services critiques, vous pouvez identifier et résoudre les problèmes avant qu'ils n'affectent les utilisateurs. Le script Get-ADHealth.ps1 d'ALI TAJRAN fournit une base robuste, effectuant des tests DCDiag, des vérifications de ping, une validation DNS et une surveillance des services tout en générant des rapports HTML codés par couleur.

Que réaliserez-vous avec la surveillance automatisée d'AD ?

Ce tutoriel vous guide dans la mise en œuvre d'une solution complète de surveillance de la santé d'AD à l'aide de scripts PowerShell. Vous apprendrez à configurer des vérifications de santé automatisées quotidiennes et hebdomadaires, à configurer des notifications par e-mail pour les problèmes critiques et à créer une journalisation centralisée pour l'analyse historique. Le système de surveillance comprend des fonctions personnalisées pour des composants AD spécifiques comme la réplication SYSVOL et la validation des rôles FSMO.

À la fin de ce tutoriel, vous aurez un système de surveillance planifié qui fonctionne automatiquement, envoie des alertes lorsque des problèmes surviennent et fournit à la fois des rapports détaillés et un tableau de bord visuel pour un aperçu rapide de l'état. Cette approche proactive aide à maintenir la fiabilité de l'infrastructure AD et réduit le temps moyen de résolution des problèmes de services d'annuaire.

Guide de mise en oeuvre

Procédure complète

01

Installer le module PowerShell Active Directory

Tout d'abord, assurez-vous que le module Active Directory PowerShell est installé sur votre contrôleur de domaine. Ce module fournit les cmdlets nécessaires pour la surveillance de la santé d'AD.

Add-WindowsCapability -Online -Name Rsat.ActiveDirectory.DS-LDS.Tools~~~~0.0.1.0

Si vous exécutez cela sur une machine cliente Windows 10/11 au lieu d'un serveur, utilisez cette commande alternative :

Get-WindowsCapability -Name RSAT* -Online | Add-WindowsCapability -Online

Vérifiez que le module est installé et disponible :

Get-Module -Name ActiveDirectory -ListAvailable
Astuce pro : Le module ActiveDirectory est automatiquement installé sur les contrôleurs de domaine, mais vous devrez l'installer manuellement sur les serveurs membres ou les machines clientes.
02

Téléchargez et préparez le script de vérification de la santé AD

Téléchargez le script complet Get-ADHealth.ps1 depuis le dépôt d'ALI TAJRAN. Ce script effectue des tests DCDiag, des vérifications de ping, une validation DNS et une surveillance des services.

# Créer le répertoire des scripts
New-Item -Path "C:\scripts" -ItemType Directory -Force

# Télécharger le script (remplacer par la méthode de téléchargement réelle)
Invoke-WebRequest -Uri "https://www.alitajran.com/active-directory-health-check-powershell-script/" -OutFile "C:\scripts\Get-ADHealth.ps1"

Débloquez le script téléchargé pour éviter les problèmes de politique d'exécution :

Unblock-File -Path "C:\scripts\Get-ADHealth.ps1"

Définissez la politique d'exécution pour autoriser l'exécution des scripts :

Set-ExecutionPolicy RemoteSigned -Scope CurrentUser

Vérifiez que le script est prêt à être exécuté :

Get-Content "C:\scripts\Get-ADHealth.ps1" | Select-Object -First 10
Avertissement : Examinez toujours les scripts téléchargés avant de les exécuter. Analysez le code pour comprendre ce qu'il fait et assurez-vous qu'il provient d'une source fiable.
03

Exécuter une vérification de base de la santé AD

Exécutez votre premier contrôle de santé pour tester la fonctionnalité du script et générer un rapport de référence. Cela vérifiera tous les contrôleurs de domaine dans votre forêt.

# Naviguer vers le répertoire des scripts
Set-Location "C:\scripts"

# Exécuter un contrôle de santé de base avec un rapport HTML
.\Get-ADHealth.ps1 -ReportFile

Pour un domaine spécifique uniquement :

.\Get-ADHealth.ps1 -DomainName "yourdomain.com" -ReportFile

Le script génère un rapport HTML avec un horodatage. Vérifiez la sortie :

# Lister les rapports générés
Get-ChildItem -Path "C:\scripts" -Filter "dc_health_report_*.html" | Sort-Object LastWriteTime -Descending

Ouvrez le dernier rapport pour examiner les résultats :

# Ouvrir le rapport le plus récent
$latestReport = Get-ChildItem -Path "C:\scripts" -Filter "dc_health_report_*.html" | Sort-Object LastWriteTime -Descending | Select-Object -First 1
Invoke-Item $latestReport.FullName
Astuce pro : Le rapport HTML utilise un code couleur - vert pour les tests réussis, rouge pour les échecs, et jaune pour les avertissements. Concentrez-vous d'abord sur les éléments rouges car ils indiquent des problèmes critiques.
04

Configurer les notifications par e-mail

Modifiez le script pour envoyer des rapports par email automatisés. Ouvrez le fichier Get-ADHealth.ps1 et localisez la section des paramètres SMTP, puis personnalisez-la pour votre environnement.

# Modifiez le script pour configurer les paramètres SMTP
$smtpsettings = @{
    To = 'admin@yourdomain.com'
    From = 'adhealth@yourdomain.com'
    Subject = "Rapport de santé AD - $(Get-Date -Format 'yyyy-MM-dd HH:mm')"
    SmtpServer = "mail.yourdomain.com"
    Port = "25"
    # Credential = (Get-Credential)  # Décommentez pour l'authentification
    # UseSsl = $true                 # Décommentez pour SSL
}

Testez la fonctionnalité d'envoi d'email avant de planifier :

# Testez l'envoi d'email
Send-MailMessage -To "admin@yourdomain.com" -From "adhealth@yourdomain.com" -Subject "Test de santé AD" -Body "Email de test de la surveillance de la santé AD" -SmtpServer "mail.yourdomain.com"

Exécutez le script avec notification par email :

.\Get-ADHealth.ps1 -DomainName "yourdomain.com" -SendEmail

Vérifiez que l'email a été envoyé en consultant votre boîte de réception et la sortie PowerShell pour tout message d'erreur.

Avertissement : Stockez les identifiants SMTP en toute sécurité. Envisagez d'utiliser un compte de service dédié avec des privilèges minimaux pour l'envoi d'emails de surveillance.
05

Créer des fonctions de vérification de santé personnalisées

Améliorez la surveillance en ajoutant des fonctions personnalisées pour des composants AD spécifiques. Créez un script supplémentaire pour des vérifications supplémentaires.

# Créer des fonctions de santé AD personnalisées
function Test-ADReplication {
    param([string]$DomainController)
    
    $replStatus = repadmin /replsummary $DomainController
    $errors = $replStatus | Where-Object { $_ -match "error" }
    
    return @{
        DC = $DomainController
        HasErrors = ($errors.Count -gt 0)
        ErrorCount = $errors.Count
        Details = $replStatus
    }
}

function Test-SysvolReplication {
    $sysvolPath = "\\$env:COMPUTERNAME\SYSVOL"
    $accessible = Test-Path $sysvolPath
    
    return @{
        Path = $sysvolPath
        Accessible = $accessible
        LastWrite = if ($accessible) { (Get-Item $sysvolPath).LastWriteTime } else { "N/A" }
    }
}

function Test-ADServices {
    $services = @("ADWS", "DNS", "DFS Replication", "Intersite Messaging", "Kerberos Key Distribution Center", "NetLogon", "Active Directory Domain Services")
    $results = @()
    
    foreach ($service in $services) {
        $svc = Get-Service -DisplayName "*$service*" -ErrorAction SilentlyContinue
        if ($svc) {
            $results += @{
                ServiceName = $svc.DisplayName
                Status = $svc.Status
                StartType = $svc.StartType
            }
        }
    }
    return $results
}

Enregistrez ces fonctions dans un fichier séparé et testez-les :

# Enregistrer les fonctions dans un fichier
$functions | Out-File "C:\scripts\AD-CustomFunctions.ps1"

# Charger et tester les fonctions
. "C:\scripts\AD-CustomFunctions.ps1"

# Tester la réplication
Test-ADReplication -DomainController $env:COMPUTERNAME

# Tester SYSVOL
Test-SysvolReplication

# Tester les services
Test-ADServices
Astuce pro : Créez des fonctions modulaires pour des vérifications spécifiques. Cela facilite le dépannage et vous permet d'exécuter des tests individuels lors de l'investigation de problèmes spécifiques.
06

Planifier des vérifications de santé automatisées

Configurez le Planificateur de tâches Windows pour exécuter automatiquement des vérifications de santé. Cela garantit une surveillance cohérente sans intervention manuelle.

# Créer une tâche planifiée pour les vérifications de santé quotidiennes
$action = New-ScheduledTaskAction -Execute "powershell.exe" -Argument "-NoProfile -ExecutionPolicy Bypass -File 'C:\scripts\Get-ADHealth.ps1' -ReportFile -DomainName 'yourdomain.com'"

$trigger = New-ScheduledTaskTrigger -Daily -At "02:00AM"

$settings = New-ScheduledTaskSettingsSet -AllowStartIfOnBatteries -DontStopIfGoingOnBatteries -StartWhenAvailable

$principal = New-ScheduledTaskPrincipal -UserId "SYSTEM" -LogonType ServiceAccount -RunLevel Highest

Enregistrez la tâche planifiée :

Register-ScheduledTask -TaskName "AD-HealthCheck-Daily" -Action $action -Trigger $trigger -Settings $settings -Principal $principal -Description "Surveillance quotidienne de la santé Active Directory"

Créez une vérification hebdomadaire complète avec email :

# Vérification hebdomadaire complète avec email
$weeklyAction = New-ScheduledTaskAction -Execute "powershell.exe" -Argument "-NoProfile -ExecutionPolicy Bypass -File 'C:\scripts\Get-ADHealth.ps1' -SendEmail -DomainName 'yourdomain.com'"

$weeklyTrigger = New-ScheduledTaskTrigger -Weekly -WeeksInterval 1 -DaysOfWeek Monday -At "06:00AM"

Register-ScheduledTask -TaskName "AD-HealthCheck-Weekly-Email" -Action $weeklyAction -Trigger $weeklyTrigger -Settings $settings -Principal $principal -Description "Vérification hebdomadaire de la santé AD avec notification par email"

Vérifiez que les tâches planifiées sont créées :

Get-ScheduledTask -TaskName "AD-HealthCheck*" | Format-Table TaskName, State, NextRunTime
Avertissement : Exécutez les tâches planifiées avec les autorisations appropriées du compte de service. Le compte SYSTEM fonctionne pour les vérifications locales, mais les opérations spécifiques au domaine peuvent nécessiter un compte de service de domaine.
07

Configurer la journalisation centralisée et les alertes

Créer un système de journalisation centralisé pour suivre les résultats des vérifications de santé au fil du temps et mettre en œuvre des alertes pour les problèmes critiques.

# Créer une fonction de journalisation centralisée
function Write-ADHealthLog {
    param(
        [string]$Message,
        [string]$Level = "INFO",
        [string]$LogPath = "C:\logs\ADHealth.log"
    )
    
    $timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
    $logEntry = "[$timestamp] [$Level] $Message"
    
    # S'assurer que le répertoire de journalisation existe
    $logDir = Split-Path $LogPath -Parent
    if (!(Test-Path $logDir)) {
        New-Item -Path $logDir -ItemType Directory -Force
    }
    
    # Écrire dans le fichier de journal
    Add-Content -Path $LogPath -Value $logEntry
    
    # Écrire également dans le journal des événements pour les problèmes critiques
    if ($Level -eq "ERROR" -or $Level -eq "CRITICAL") {
        Write-EventLog -LogName "Application" -Source "AD Health Monitor" -EventId 1001 -EntryType Error -Message $Message
    }
}

Créer une fonction d'alerte pour les problèmes critiques :

function Send-ADHealthAlert {
    param(
        [string]$AlertMessage,
        [string]$Severity = "High",
        [array]$Recipients = @("admin@yourdomain.com")
    )
    
    $subject = "[AD ALERT - $Severity] Problème de santé Active Directory"
    $body = @"
Alerte de santé Active Directory

Gravité : $Severity
Horodatage : $(Get-Date)
Contrôleur de domaine : $env:COMPUTERNAME

Détails du problème :
$AlertMessage

Veuillez enquêter immédiatement.
"@
    
    try {
        Send-MailMessage -To $Recipients -From "adalert@yourdomain.com" -Subject $subject -Body $body -SmtpServer "mail.yourdomain.com"
        Write-ADHealthLog "Alerte envoyée avec succès : $AlertMessage" "INFO"
    }
    catch {
        Write-ADHealthLog "Échec de l'envoi de l'alerte : $($_.Exception.Message)" "ERROR"
    }
}

Intégrer la journalisation dans vos vérifications de santé :

# Exemple d'intégration avec les résultats de DCDiag
$dcdiagResults = dcdiag /test:DNS /test:FSMOCheck /v

if ($dcdiagResults -match "failed") {
    $failedTests = $dcdiagResults | Where-Object { $_ -match "failed" }
    $alertMessage = "Les tests DCDiag ont échoué:`n" + ($failedTests -join "`n")
    
    Write-ADHealthLog $alertMessage "ERROR"
    Send-ADHealthAlert -AlertMessage $alertMessage -Severity "High"
}
else {
    Write-ADHealthLog "Tous les tests DCDiag ont réussi" "INFO"
}

Tester le système de journalisation et d'alerte :

# Tester la journalisation
Write-ADHealthLog "Entrée de journal de test" "INFO"

# Tester l'alerte
Send-ADHealthAlert -AlertMessage "Message d'alerte de test" -Severity "Low"

# Vérifier le fichier de journal
Get-Content "C:\logs\ADHealth.log" -Tail 5
Astuce pro : Configurez la rotation des journaux pour éviter que les fichiers de journal ne deviennent trop volumineux. Utilisez PowerShell pour archiver automatiquement les journaux de plus de 30 jours.
08

Créer un tableau de bord de surveillance des performances

Construisez un tableau de bord HTML simple qui affiche l'état de santé actuel d'AD et les tendances historiques. Cela fournit un aperçu visuel rapide de votre infrastructure AD.

# Créer une fonction de génération de tableau de bord
function New-ADHealthDashboard {
    param(
        [string]$OutputPath = "C:\scripts\dashboard.html",
        [int]$DaysHistory = 7
    )
    
    # Obtenir les contrôleurs de domaine actuels
    $domainControllers = Get-ADDomainController -Filter * | Select-Object Name, IPv4Address, OperatingSystem, IsGlobalCatalog
    
    # Obtenir les résultats récents des vérifications de santé
    $recentReports = Get-ChildItem "C:\scripts" -Filter "dc_health_report_*.html" | 
        Where-Object { $_.LastWriteTime -gt (Get-Date).AddDays(-$DaysHistory) } |
        Sort-Object LastWriteTime -Descending
    
    # Générer le tableau de bord HTML
    $html = @"



    Tableau de bord de santé Active Directory
    


    

Tableau de bord de santé Active Directory

Dernière mise à jour : $(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')

Aperçu des contrôleurs de domaine

"@ foreach ($dc in $domainControllers) { $pingResult = Test-Connection -ComputerName $dc.Name -Count 1 -Quiet $status = if ($pingResult) { "En ligne" } else { "Hors ligne" } $html += "" } $html += @"
NomAdresse IPSystème d'exploitationCatalogue globalStatut
$($dc.Name)$($dc.IPv4Address)$($dc.OperatingSystem)$($dc.IsGlobalCatalog)$status

Rapports de santé récents

    "@ foreach ($report in $recentReports) { $html += "
  • $($report.Name) - $(($report.LastWriteTime).ToString('yyyy-MM-dd HH:mm'))
  • " } $html += @"

Métriques rapides

Total des DC : $($domainControllers.Count)

Catalogues globaux : $(($domainControllers | Where-Object IsGlobalCatalog).Count)

Rapports récents : $($recentReports.Count)

"@ $html | Out-File -FilePath $OutputPath -Encoding UTF8 Write-Host "Tableau de bord créé : $OutputPath" }

Générez et visualisez le tableau de bord :

# Créer le tableau de bord
New-ADHealthDashboard

# Ouvrir le tableau de bord dans le navigateur
Invoke-Item "C:\scripts\dashboard.html"

Planifiez les mises à jour du tableau de bord :

# Ajouter la génération de tableau de bord à la tâche planifiée
$dashboardAction = New-ScheduledTaskAction -Execute "powershell.exe" -Argument "-NoProfile -ExecutionPolicy Bypass -Command 'New-ADHealthDashboard'"

$dashboardTrigger = New-ScheduledTaskTrigger -Once -At (Get-Date).AddMinutes(5) -RepetitionInterval (New-TimeSpan -Hours 1)

Register-ScheduledTask -TaskName "AD-Dashboard-Update" -Action $dashboardAction -Trigger $dashboardTrigger -Settings $settings -Principal $principal
Astuce pro : Hébergez le tableau de bord sur un serveur web ou un partage réseau pour que plusieurs administrateurs puissent y accéder. Envisagez d'ajouter des graphiques à l'aide de bibliothèques JavaScript pour une meilleure visualisation.

Questions Fréquentes

À quelle fréquence devrais-je effectuer des vérifications de l'état d'Active Directory avec PowerShell ?+
Effectuez des vérifications de base de l'état de santé quotidiennement et des vérifications complètes chaque semaine. Les vérifications quotidiennes doivent se concentrer sur les services critiques, le statut de réplication et la disponibilité des DC. Les vérifications hebdomadaires peuvent inclure des tests DCDiag détaillés, la validation de SYSVOL et des métriques de performance. Pour les environnements à haute disponibilité, envisagez d'effectuer des vérifications légères toutes les 4 à 6 heures avec une alerte immédiate en cas de défaillances critiques.
Quels sont les indicateurs de santé Active Directory les plus importants à surveiller ?+
Surveiller la disponibilité des contrôleurs de domaine (ping/connectivité), la santé de la réplication entre les DC, la fonctionnalité DNS, l'état des services AD critiques (NTDS, DNS, NetLogon), la réplication SYSVOL, la disponibilité des détenteurs de rôles FSMO et les temps de réponse d'authentification. Suivre également les erreurs du journal des événements, l'espace disque sur les DC et la connectivité réseau entre les sites.
Les scripts de surveillance de la santé AD PowerShell peuvent-ils s'exécuter sur des serveurs non contrôleurs de domaine ?+
Oui, mais avec des limitations. Installez le module PowerShell Active Directory (RSAT-AD-PowerShell) sur les serveurs membres ou les machines clientes. La surveillance à distance nécessite des autorisations appropriées et une connectivité réseau aux contrôleurs de domaine. Certains tests comme DCDiag fonctionnent mieux lorsqu'ils sont exécutés directement sur les DC, tandis que d'autres comme la surveillance de la réplication peuvent être effectués à distance.
Comment résoudre les erreurs de stratégie d'exécution PowerShell lors de l'exécution de scripts de santé AD ?+
Utilisez 'Set-ExecutionPolicy RemoteSigned -Scope CurrentUser' pour autoriser les scripts distants créés et signés localement. Pour les scripts téléchargés, exécutez d'abord 'Unblock-File'. Dans les tâches planifiées, utilisez le paramètre '-ExecutionPolicy Bypass'. Pour les environnements d'entreprise, configurez la stratégie d'exécution via la stratégie de groupe pour autoriser les scripts signés tout en maintenant la sécurité.
Que dois-je faire lorsque les vérifications de santé AD PowerShell détectent des échecs de réplication ?+
Tout d'abord, exécutez 'repadmin /replsummary' et 'repadmin /showrepl' pour identifier les partenaires de réplication spécifiques et les erreurs. Vérifiez la connectivité réseau entre les DC, vérifiez la résolution DNS et assurez-vous de la synchronisation correcte de l'heure. Les correctifs courants incluent le redémarrage du service NTDS, la forçage de la réplication avec 'repadmin /syncall', ou la réinitialisation des canaux sécurisés avec 'nltest /sc_reset'. Pour les problèmes persistants, consultez les journaux d'événements pour obtenir des codes d'erreur détaillés.
Emanuel DE ALMEIDA
Écrit par

Emanuel DE ALMEIDA

Microsoft MCSA-certified Cloud Architect | Fortinet-focused. I modernize cloud, hybrid & on-prem infrastructure for reliability, security, performance and cost control - sharing field-tested ops & troubleshooting.

Discussion

Partagez vos réflexions et analyses

Vous devez être connecté pour commenter.

Chargement des commentaires...