Supervision : Comment checker l’état de la synchronisation WSUS ?

I. Présentation

Au sein d'un tutoriel précédent, on avait vu comment exécuter des scripts PowerShell avec NRPE, je vous propose d'exploiter cette possibilité offerte par NSClient++ pour vérifier l'état de la synchronisation de votre serveur WSUS afin de l'intégrer à votre supervision.

Il est indispensable de s'assurer que son serveur WSUS synchronise correctement car sans cela, il ne va pas récupérer les dernières mises à jour auprès des serveurs Windows Update de Microsoft. Par conséquent, les mises à jour ne seront pas déployées auprès de vos clients.

Pour parvenir à cela, j'ai développé un script PowerShell qui récupère l'état de la synchronisation et qui retourne un état à la solution de supervision. En fonction de cet état, on peut générer une alerte si besoin. Cette solution s'appuie sur NSClient++ et NRPE.

II. Récupérer l'état de la synchronisation

Directement depuis le serveur WSUS, grâce à la commande "Get-WsusServer" on va pouvoir récupérer des informations sur l'état de la dernière synchronisation. En fait, il faut vérifier deux choses :

  • L'état de la dernière synchronisation, elle doit être réussie
  • La date de la dernière synchronisation, car la dernière peut être réussie mais elle peut dater de 10 jours, ce qui n'est pas normal

Grâce à la commande ci-dessous on va accéder à un ensemble de propriétés qui vont répondre à notre besoin :

(Get-WsusServer).GetSubscription().GetLastSynchronizationInfo()

En cas d'échec de synchronisation :

En cas de synchronisation réussie : 

Ce sont les propriétés "Result" et "EndTime" que nous allons utiliser dans notre script.

III. Le script pour la vérification

Maintenant, il est temps de voir le script complet et que je vous fournisse quelques explications :

La variable $NumberOfDaysWithoutSync indique le nombre de jours sans synchronisation que l'on tolère. Par exemple, si la dernière synchronisation réussie remonte à plus de 7 jours, il y aura une alerte. Modifiez la valeur en fonction de vos besoins.

La variable $ExitCode retourne un code à NRPE qui sera ensuite renvoyé à votre solution de supervision. Si l'état est sur "0" alors c'est OK, si l'on retourne "2" c'est qu'il y a un problème de synchronisation.

Voici le code complet du script :

# Synopsys : Check status of WSUS Synchronization

# Initial state
$ExitCode = 0

# Variables
$NumberOfDaysWithoutSync = 7

# Get the status of the last synchronization
$WsusLastSyncOutput = (Get-WsusServer).GetSubscription().GetLastSynchronizationInfo()

## CHECK SYNC STATE
# Normal state : Result = Succeeded
if(!($WsusLastSyncOutput.Result -eq "Succeeded")){

  $ExitCode = 2
  Write-Output "CRITICAL: The last sync $($WsusLastSyncOutput.EndTime) state is $($WsusLastSyncOutput.Result)"
}

## CHECK THE DATE OF THE LAST SYNC
# Get the datetime of the last synchronization
$WsusLastTimeOutput = (Get-WsusServer).GetSubscription().LastSynchronizationTime

# Calculate the reference date
$DateReference = (Get-Date).AddDays(-$NumberOfDaysWithoutSync)

# If the last sync time is older than the calculate date (= date of the day - $NumberOfDaysWithoutSync) it's critical
if($DateReference -gt $WsusLastTimeOutput){

  $ExitCode = 2 
  Write-Output "CRITICAL: Last sync is older than $NumberOfDaysWithoutSync days and his state is $($WsusLastSyncOutput.Result)" 
}

# Evaluate final exit code result for all passed checks.
if ($ExitCode -eq 0) { Write-Output "OK: The last sync $($WsusLastSyncOutput.EndTime) state is $($WsusLastSyncOutput.Result)" }

exit $ExitCode

Enregistrez ce bout de code dans un fichier et enregistrez-le dans le dossier "scripts" de NSClient++, par exemple avec le nom "Check-WsusSyncState.ps1". Vous pouvez personnaliser les messages de retour si vous le souhaitez, ce sont les messages qui s'afficheront sur l'interface de votre solution de monitoring.

IV. Configuration de NSClient++ pour ajouter le script

Maintenant, on va intégrer ce script à NSClient++ pour que l'on puisse l'appeler depuis notre solution de supervision, Centreon par exemple. Editez le fichier de configuration NSClient.ini et ajoutez cette ligne sous le bloc "[/settings/external scripts/scripts]". Pensez à vous référer à l'article mentionné au début de celui-ci pour la configuration de NRPE si nécessaire.

Sur la ligne ci-dessous, adaptez le nom de votre script PowerShell si nécessaire. Le premier terme, c'est à dire "Check-WsusSyncState" correspond au nom de la commande qu'il faudra appeler depuis Centréon, ensuite NSClient fait le lien entre ce nom de commande et le script à exécuter.

Check-WsusSyncState=cmd /c echo scripts\Check-WsusSyncState.ps1; exit($lastexitcode) | powershell.exe -command -

Pour finir, redémarrez le service NSClient++ pour prendre en compte cette nouvelle configuration.

V. Intégration à la supervision

En fonction de votre système de supervision, vous devrez ensuite effectuer la configuration pour appeler notre script via NRPE, votre commande de check ressemblera à ceci :

.\check_nrpe -H 192.168.1.150 -c Check-WsusSyncState

Lorsque tout sera prêt, vous allez obtenir un bel état de votre synchronisation WSUS dans votre Centréon (ou autre) :

Voilà, ce tutoriel est terminé ! Que pensez-vous de cette vérification ? Allez-vous l'implémenter ?

Partagez cet article Partager sur Twitter Partager sur Facebook Partager sur Linkedin Partager sur Google+ Envoyer par mail

Florian BURNEL

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.

Nombre de posts de cet auteur : 5552.Voir tous les posts

9 thoughts on “Supervision : Comment checker l’état de la synchronisation WSUS ?

  • Super le script, j’essaye ça dès demain
    Merci

    Répondre
      • Lors du (Get-WsusServer).GetSubscription().GetLastSynchronizationInfo()
        C’est un W2012KR2, https est activé (obligatoire pour W10 je crois)

        Répondre
        • Tu peux essayer d’ajouter -UseSsl au cmdlet Get-WsusServer et/ou le numéro de port avec -Port.

          Répondre
          • Bien joué ! j’ai du rajouter aussi -Name (j’utilisais un virtual host pour ce serveur) ce qui donne cette commande (Get-WsusServer -Name wsus.int.domain.tld -UseSsl -Port 443).GetSubscription().GetLastSynchronizationInfo()
            Merci

            Répondre
  • Super, ca marche bien
    Un grand merci …

    Répondre
  • Super si tu en à d’autres de ce type je prends

    Répondre

Répondre à chru Annuler la réponse

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.