Ceci est une ancienne révision du document !


Get-AntiVirusState - Connaître l'état des antivirus d'un parc

Connaître l'état de protection de l'ensemble des PC dans un domaine est très important pour un administrateur afin de garantir la sécurité d'un parc informatique. Dans le cas où les antivirus sont gérés de manière centralisée par un logiciel tel que Kaspersky Security Center, cela est assez facile. Dans les cos où on n'a pas ce genre d'outil, cela devient légèrement plus compliqué. On pourrait faire régulièrement le tour de chaque poste mais cela coûte énormément en temps et en moyen surtout si la structure est imposante. Partons donc sur le principe que "Un administrateur qui n'a pas recours à des scripts est condamné à refaire sans cesse les mêmes choses".

Le script suivant s'inscrit dans cette optique. Il interroge les PC du domaine afin de connaître l'antivirus qui y est installé, l'état de ses mises à jour ainsi que le statut de sa protection en temps réel.

Comme souvent, j'y rajoute une sortie sous forme de rapport afin de traiter ce dernier avec une vérification Nagios.

#
<#
.SYNOPSIS
 
#############################################################################################################
#                                                                                                           #
# Script de récupération de l'état des antivirus des postes                                                 #
#                                                                                                           #
# Par Nicolas THOREZ                                                                                        #
#                                                                                                           #
#############################################################################################################
 
.DESCRIPTION
 
Ce script permet d'interroger à distance un et plusieurs PC du domaine afin de connaître le nom de son antivirus et son état.
 
.PARAMETER PC
 
Indique le ou les noms (séparé par des virgules (,)) des PC à interroger. Si le paramètre n'est pas renseigner, la requête sera lancée sur tous les PC contenus dans les OU PC Fixes, PC Portables et Direction.
 
.PARAMETER n
 
Si le paramètre -n est indiqué, un fichier de réponse pour un traitement par Nagios sera créé (C:\Scripts\AntivirusState\Report.dat)
 
.EXAMPLE
 
Get-AntiVirusState.ps1 -PC PC-7,PC-49 -n
 
Lance la requête d'interrogation de l'état des antivirus des PC PC-7 et PC-49. A la fin, un rapport pour Nagios sera créer.
 
Affichage dans la console : 
2019-02-13 16:25:06     INFO     Création du fichier log.
2019-02-13 16:25:06     INFO     Suppression des logs vieux de 7 jours.
2019-02-13 16:25:06     INFO     Début de la vérification des antivirus.
2019-02-13 16:25:06     INFO     Début de traitement de PC-7.
2019-02-13 16:25:06     INFO     PC Online.
2019-02-13 16:25:06     INFO     Antivirus détecté : Avast Antivirus.
2019-02-13 16:25:06     INFO     Fournisseur d'informations : Antivirus.
2019-02-13 16:25:06     INFO     Protection en temps réel active.
2019-02-13 16:25:06     INFO     Bases de définitions de virus à jour.
2019-02-13 16:25:06     INFO     Début de traitement de PC-49.
2019-02-13 16:25:07     INFO     PC Online.
2019-02-13 16:25:07     INFO     Antivirus détecté : Kaspersky Free.
2019-02-13 16:25:07     INFO     Fournisseur d'informations : Antivirus.
2019-02-13 16:25:07     INFO     Protection en temps réel active.
2019-02-13 16:25:07     INFO     Bases de définitions de virus à jour.
----------------------------------------------------------
2019-02-13 16:25:07     INFO     Total des PC : 2.
2019-02-13 16:25:07     INFO     PC interrogés : 0.
2019-02-13 16:25:07     INFO     PC hors-ligne : 0.
2019-02-13 16:25:07     INFO     Aucun avertissement détecté.
2019-02-13 16:25:07     INFO     Aucun critique détecté.
2019-02-13 16:25:07     INFO     Création du rapport pour Nagios.
 
.NOTES
 
NOM :      Get-AntiVirusState.ps1
AUTEUR :   Nicolas THOREZ
VERSION :  1.1.1
 
HISTORIQUE :
 
0.0     2019-02-12      Début du projet
 
0.1     2019-02-13      Etude du routine existante
                        Création du script
 
1.0     2019-02-13      Version mis en production
 
1.1     2019-02-13      Ajout de la création du rapport pour Nagios
 
1.1.1   2019-02-14      Correction d'erreurs dans le rapport Nagios
 
 
#>
 
# Paramètres d'entrée
 
Param(
    [String[]]$PC='All',
    [Switch]$n
)
 
# Déclaration des variables
 
If ($PC -eq 'All')
    {
        # Création de la liste des PC à traiter par interrogation des OU correspondantes dans l'AD
        $ListPC = (Get-ADComputer -SearchBase "OU=PC Fixe,OU=Ordinateurs,DC=TEST,DC=LOCAL" -Filter *).Name
        $ListPC += (Get-ADComputer -SearchBase "OU=PC Portable,OU=Ordinateurs,DC=TEST,DC=LOCAL" -Filter *).Name
        $ListPC += (Get-ADComputer -SearchBase "OU=Ordinateurs,OU=Direction,DC=TEST,DC=LOCAL" -Filter *).Name
    }
Else
    {
        $ListPC = $PC
    }
$CheckDate = Get-Date -UFormat %Y-%m-%d
$LogFile = "C:\Scripts\AntivirusState\AntivirusState-$CheckDate.log"
$Old = 7
$TotalPC = 0
$PCOnline = 0
$PCOffline = 0
$CritCount = 0
$WarnCount = 0
$Result = @()
$PCWithManyAV = "n/a"
$PCWithoutAV = "n/a"
$PCWithFaultyRT = "n/a"
$PCWithObsoleteBase = "n/a"
$FQDN = 'test.local'                           # Indiquer ici le nom du domaine au format DNS
 
 
# Déclacation des fonctions
Function Get-PCOnlineStatus($PC)
    {
        # On interroge le PC via Get-WmiObject plutôt que par ping pour éviter les erreurs de pare-feu
        $OnlineTest = (Get-WmiObject -Comp $PC -CL Win32_ComputerSystem -ErrorAction SilentlyContinue -WarningAction SilentlyContinue -InformationAction SilentlyContinue).Domain
        If ($OnlineTest -eq $FQDN)
            {
                $CheckTime = Get-Date -UFormat "%Y-%m-%d %H:%M:%S"
                Write-Host "$CheckTime     " -NoNewline
                Write-Host "INFO     " -NoNewline -ForegroundColor Green
                Write-Host "PC Online."
                Add-Content -Path $LogFile -Value "$CheckTime     INFO     PC Online."
                Return $true
            }
        Else
            {
                $CheckTime = Get-Date -UFormat "%Y-%m-%d %H:%M:%S"
                Write-Host "$CheckTime     " -NoNewline
                Write-Host "WARN     " -NoNewline -ForegroundColor Yellow
                Write-Host "PC Offline."
                Add-Content -Path $LogFile -Value "$CheckTime     WARN     PC Offline."
                Return $false
            }
    }
 
 
# Création du fichier log et suppression des anciens logs
If (Test-Path $LogFile)
    {
        $CheckTime = Get-Date -UFormat "%Y-%m-%d %H:%M:%S"
        Write-Host "$CheckTime     " -NoNewline
        Write-Host "INFO     " -NoNewline -ForegroundColor Green
        Write-Host "Fichier log existant, inscription des nouvelles informations à la suite."
        $CheckTime = Get-Date -UFormat "%Y-%m-%d %H:%M:%S"
        Write-Host "$CheckTime     " -NoNewline
        Write-Host "INFO     " -NoNewline -ForegroundColor Green
        Write-Host "Début de la vérification des antivirus."
        Add-Content -Path $LogFile -Value "----------------------------------------------------------"
        Add-Content -Path $LogFile -Value "$CheckTime     INFO     Début de la vérification des antivirus."
    }
Else
    {
        $CheckTime = Get-Date -UFormat "%Y-%m-%d %H:%M:%S"
        Write-Host "$CheckTime     " -NoNewline
        Write-Host "INFO     " -NoNewline -ForegroundColor Green
        Write-Host "Création du fichier log."
        $CheckTime = Get-Date -UFormat "%Y-%m-%d %H:%M:%S"
        Write-Host "$CheckTime     " -NoNewline
        Write-Host "INFO     " -NoNewline -ForegroundColor Green
        Write-Host "Suppression des logs vieux de $Old jours."
        $CheckTime = Get-Date -UFormat "%Y-%m-%d %H:%M:%S"
        Write-Host "$CheckTime     " -NoNewline
        Write-Host "INFO     " -NoNewline -ForegroundColor Green
        Write-Host "Début de la vérification des antivirus."
        New-Item -Path $LogFile > $null
        Get-ChildItem –Path "C:\Scripts\AntivirusState" –Recurse | Where-Object CreationTime –lt (Get-Date).AddDays(-$Old) | Where-Object Name -ne Get-AVState.ps1 | Remove-Item -Force > $null
        Add-Content -Path $LogFile -Value "Log de la vérification de l'état des antivirus du domaine."
        Add-Content -Path $LogFile -Value "----------------------------------------------------------"
        Add-Content -Path $LogFile -Value "$CheckTime     INFO     Suppression des logs vieux de $Old jours."
        Add-Content -Path $LogFile -Value "----------------------------------------------------------"
        Add-Content -Path $LogFile -Value "$CheckTime     INFO     Début de la vérification des antivirus."
    }
 
# Traitement
ForEach($PC in $ListPC)
    {
        $TotalPC += 1
        $CheckTime = Get-Date -UFormat "%Y-%m-%d %H:%M:%S"
        Write-Host "$CheckTime     " -NoNewline
        Write-Host "INFO     " -NoNewline -ForegroundColor Green
        Write-Host "Début de traitement de $PC."
        Add-Content -Path $LogFile -Value "$CheckTime     INFO     Début de traitement de $PC."
 
        # On teste si la machine est en ligne
        $OnlineStatus = Get-PCOnlineStatus($PC)
 
        # Si oui on continue le traitement
        If ($OnlineStatus -eq $true)
            {
                $PCOnline += 1
                #On vérifie le nombre d'antivirus
                $AntiVirusCount = (Get-WmiObject -Namespace "root\SecurityCenter2" -Class AntiVirusProduct  -ComputerName $PC).Count
                $AntiVirusProduct = Get-WmiObject -Namespace "root\SecurityCenter2" -Class AntiVirusProduct  -ComputerName $PC
 
                If ($AntiVirusCount.Count -gt 2)
                    {
                        # Erreur plus de 2 antivirus présents
                        $CheckTime = Get-Date -UFormat "%Y-%m-%d %H:%M:%S"
                        Write-Host "$CheckTime     " -NoNewline
                        Write-Host "CRIT     " -NoNewline -ForegroundColor Red
                        Write-Host "$PC possède plusieurs antivirus. Veuillez vérifier."
                        Add-Content -Path $LogFile -Value "$CheckTime     CRIT     $PC possède plusieurs antivirus. Veuillez vérifier."
                        $CritCount += 1
                        If ($PCWithManyAV -eq "n/a")
                            {
                                $PCWithManyAV = "$PC"
                            }
                        Else
                            {
                                $PCWithManyAV += ", $PC"
                            }
                        Continue
                    }
                Elseif ($AntiVirusCount -eq 2)
                    {
                        # Filtre pour supprimer Windows Defender qui doit être désactivé et création de la liste d'état de l'antivirus présent
                        $AntiVirusProduct = Get-WmiObject -Namespace "root\SecurityCenter2" -Class AntiVirusProduct  -ComputerName $PC | Where-Object {$_.displayname -ne "Windows Defender"}
                    }
                If ($AntiVirusProduct -eq '')
                    {
                        # Erreur pas d'antivirus
                        $CheckTime = Get-Date -UFormat "%Y-%m-%d %H:%M:%S"
                        Write-Host "$CheckTime     " -NoNewline
                        Write-Host "CRIT     " -NoNewline -ForegroundColor Red
                        Write-Host "$PC ne possède aucun antivirus. Veuillez vérifier."
                        Add-Content -Path $LogFile -Value "$CheckTime     CRIT     $PC ne possède aucun antivirus. Veuillez vérifier."
                        $CritCount += 1
                        If ($PCWithoutAV -eq "n/a")
                            {
                                $PCWithoutAV = "$PC"
                            }
                        Else
                            {
                                $PCWithoutAV += ", $PC"
                            }
                        Continue
                    }
 
                # Affichage de l'antivirus détecté
                $AVName = $AntiVirusProduct.displayName
                $CheckTime = Get-Date -UFormat "%Y-%m-%d %H:%M:%S"
                Write-Host "$CheckTime     " -NoNewline
                Write-Host "INFO     " -NoNewline -ForegroundColor Green
                Write-Host "Antivirus détecté : $AVName."
                Add-Content -Path $LogFile -Value "$CheckTime     INFO     Antivirus détecté : $AVName."
 
                # Extraction des données de l'antivirus 
                $productState = $AntiVirusProduct.productState 
 
                # Conversion en hexadecimal (avec ajout de 0 si nécessaire pour avoir une chaîne de 6 caractères) 
                $Hexa = [Convert]::ToString($productState, 16).PadLeft(6,'0') 
 
                # Séparation des indicateurs (les 2 premiers caractères puis les 2 suivants et enfin les 2 derniers)
                $WSC_SECURITY_PROVIDER = $Hexa.Substring(0,2) 
                $WSC_SECURITY_PRODUCT_STATE = $Hexa.Substring(2,2) 
                $WSC_SECURITY_SIGNATURE_STATUS = $Hexa.Substring(4,2)
 
                # Création de la valeur correspondant au type de protection
                $Provider = ""
                While ($WSC_SECURITY_PROVIDER)
                    {
                        If ([Int]$WSC_SECURITY_PROVIDER -ge 64)
                            {
                                [Int]$WSC_SECURITY_PROVIDER = [Int]$WSC_SECURITY_PROVIDER - 64
                                $Provider += "Service"
                                $CheckTime = Get-Date -UFormat "%Y-%m-%d %H:%M:%S"
                                Write-Host "$CheckTime     " -NoNewline
                                Write-Host "INFO     " -NoNewline -ForegroundColor Green
                                Write-Host "Fournisseur d'informations : Service."
                                Add-Content -Path $LogFile -Value "$CheckTime     INFO     Fournisseur d'informations : Service."
                            }
                        ElseIf ([Int]$WSC_SECURITY_PROVIDER -ge 32)
                            {
                                [Int]$WSC_SECURITY_PROVIDER = [Int]$WSC_SECURITY_PROVIDER - 32
                                If ($Provider -eq "")
                                    {
                                        $Provider += "User Controlled"
                                    }
                                Else
                                    {
                                        $Provider += ", User Controlled"
                                    }
                                $CheckTime = Get-Date -UFormat "%Y-%m-%d %H:%M:%S"
                                Write-Host "$CheckTime     " -NoNewline
                                Write-Host "INFO     " -NoNewline -ForegroundColor Green
                                Write-Host "Fournisseur d'informations : User Controlled."
                                Add-Content -Path $LogFile -Value "$CheckTime     INFO     Fournisseur d'informations : User Controlled."
                            }
                        ElseIf ([Int]$WSC_SECURITY_PROVIDER -ge 16)
                            {
                                [Int]$WSC_SECURITY_PROVIDER = [Int]$WSC_SECURITY_PROVIDER - 16
                                If ($Provider -eq "")
                                    {
                                        $Provider += "Internet Settings"
                                    }
                                Else
                                    {
                                        $Provider += ", Internet Settings"
                                    }
                                $CheckTime = Get-Date -UFormat "%Y-%m-%d %H:%M:%S"
                                Write-Host "$CheckTime     " -NoNewline
                                Write-Host "INFO     " -NoNewline -ForegroundColor Green
                                Write-Host "Fournisseur d'informations : Internet Settings."
                                Add-Content -Path $LogFile -Value "$CheckTime     INFO     Fournisseur d'informations : Internet Settings."
                            }
                        ElseIf ([Int]$WSC_SECURITY_PROVIDER -ge 8)
                            {
                                [Int]$WSC_SECURITY_PROVIDER = [Int]$WSC_SECURITY_PROVIDER - 8
                                If ($Provider -eq "")
                                    {
                                        $Provider += "AntiSpyware"
                                    }
                                Else
                                    {
                                        $Provider += ", AntiSpyware"
                                    }
                                $CheckTime = Get-Date -UFormat "%Y-%m-%d %H:%M:%S"
                                Write-Host "$CheckTime     " -NoNewline
                                Write-Host "INFO     " -NoNewline -ForegroundColor Green
                                Write-Host "Fournisseur d'informations : AntiSpyware."
                                Add-Content -Path $LogFile -Value "$CheckTime     INFO     Fournisseur d'informations : AntiSpyware."
                            }
                        ElseIf ([Int]$WSC_SECURITY_PROVIDER -ge 4)
                            {
                                [Int]$WSC_SECURITY_PROVIDER = [Int]$WSC_SECURITY_PROVIDER - 4
                                If ($Provider -eq "")
                                    {
                                        $Provider += "Antivirus"
                                    }
                                Else
                                    {
                                        $Provider += ", Antivirus"
                                    }
                                $CheckTime = Get-Date -UFormat "%Y-%m-%d %H:%M:%S"
                                Write-Host "$CheckTime     " -NoNewline
                                Write-Host "INFO     " -NoNewline -ForegroundColor Green
                                Write-Host "Fournisseur d'informations : Antivirus."
                                Add-Content -Path $LogFile -Value "$CheckTime     INFO     Fournisseur d'informations : Antivirus."
                            }
                        ElseIf ([Int]$WSC_SECURITY_PROVIDER -ge 2)
                            {
                                [Int]$WSC_SECURITY_PROVIDER = [Int]$WSC_SECURITY_PROVIDER - 2
                                If ($Provider -eq "")
                                    {
                                        $Provider += "AutoUpdate"
                                    }
                                Else
                                    {
                                        $Provider += ", AutoUpdate"
                                    }
                                $CheckTime = Get-Date -UFormat "%Y-%m-%d %H:%M:%S"
                                Write-Host "$CheckTime     " -NoNewline
                                Write-Host "INFO     " -NoNewline -ForegroundColor Green
                                Write-Host "Fournisseur d'informations : AutoUpdate."
                                Add-Content -Path $LogFile -Value "$CheckTime     INFO     Fournisseur d'informations : AutoUpdate."
                            }
                        ElseIf ([Int]$WSC_SECURITY_PROVIDER -ge 1)
                            {
                                [Int]$WSC_SECURITY_PROVIDER = [Int]$WSC_SECURITY_PROVIDER - 1
                                If ($Provider -eq "")
                                    {
                                        $Provider += "FireWall"
                                    }
                                Else
                                    {
                                        $Provider += ", FireWall"
                                    }
                                $CheckTime = Get-Date -UFormat "%Y-%m-%d %H:%M:%S"
                                Write-Host "$CheckTime     " -NoNewline
                                Write-Host "INFO     " -NoNewline -ForegroundColor Green
                                Write-Host "Fournisseur d'informations : FireWall."
                                Add-Content -Path $LogFile -Value "$CheckTime     INFO     Fournisseur d'informations : FireWall."
                            }
                    }
                If ($Provider -eq "")
                    {
                        $Provider = "None"
                        $CheckTime = Get-Date -UFormat "%Y-%m-%d %H:%M:%S"
                        Write-Host "$CheckTime     " -NoNewline
                        Write-Host "WARN     " -NoNewline -ForegroundColor Yellow
                        Write-Host "Aucun fournisseurs d'informations, veuillez vérifier l'état de l'antivirus."
                        Add-Content -Path $LogFile -Value "$CheckTime     INFO     Aucun fournisseurs d'informations, veuillez vérifier l'état de l'antivirus."
                    }
 
                # Création de la valeur correspondant au status de la protection en temps réel
                Switch ($WSC_SECURITY_PRODUCT_STATE)
                    {
                        "00"
                            {
                                $RTStatus = "Inactif"
                                $CheckTime = Get-Date -UFormat "%Y-%m-%d %H:%M:%S"
                                Write-Host "$CheckTime     " -NoNewline
                                Write-Host "CRIT     " -NoNewline -ForegroundColor Red
                                Write-Host "Protection en temps réel inactive, veuillez vérifier l'état de l'antivirus."
                                Add-Content -Path $LogFile -Value "$CheckTime     CRIT     Protection en temps réel inactive, veuillez vérifier l'état de l'antivirus."
                                $CritCount += 1
                                If ($PCWithFaultyRT -eq "n/a")
                                    {
                                        $PCWithFaultyRT = "$PC"
                                    }
                                Else
                                    {
                                        $PCWithFaultyRT += ", $PC"
                                    }
                            }
                        "01"
                            {
                                $RTStatus = "En arrêt"
                                $CheckTime = Get-Date -UFormat "%Y-%m-%d %H:%M:%S"
                                Write-Host "$CheckTime     " -NoNewline
                                Write-Host "WARN     " -NoNewline -ForegroundColor Yellow
                                Write-Host "Protection en temps réel en cours d'arrêt, veuillez vérifier l'état de l'antivirus."
                                Add-Content -Path $LogFile -Value "$CheckTime     WARN     Protection en temps réel en cours d'arrêt, veuillez vérifier l'état de l'antivirus."
                                $WarnCount += 1
                                If ($PCWithFaultyRT -eq "n/a")
                                    {
                                        $PCWithFaultyRT = "$PC"
                                    }
                                Else
                                    {
                                        $PCWithFaultyRT += ", $PC"
                                    }
 
                            }
                        "10"
                            {
                                $RTStatus = "Actif"
                                $CheckTime = Get-Date -UFormat "%Y-%m-%d %H:%M:%S"
                                Write-Host "$CheckTime     " -NoNewline
                                Write-Host "INFO     " -NoNewline -ForegroundColor Green
                                Write-Host "Protection en temps réel active."
                                Add-Content -Path $LogFile -Value "$CheckTime     INFO     Protection en temps réel active."
                            }
                        "11"
                            {
                                $RTStatus = "En veille"
                                $CheckTime = Get-Date -UFormat "%Y-%m-%d %H:%M:%S"
                                Write-Host "$CheckTime     " -NoNewline
                                Write-Host "INFO     " -NoNewline -ForegroundColor Green
                                Write-Host "Protection en temps réel en état de veille."
                                Add-Content -Path $LogFile -Value "$CheckTime     INFO     Protection en temps réel en état de veille."
                            }
                        default
                            {
                                $RTStatus = "Inconnu"
                                $CheckTime = Get-Date -UFormat "%Y-%m-%d %H:%M:%S"
                                Write-Host "$CheckTime     " -NoNewline
                                Write-Host "????     " -NoNewline -ForegroundColor Magenta
                                Write-Host "Etat de la protection en temps réel inconnu, veuillez vérifier l'état de l'antivirus."
                                Add-Content -Path $LogFile -Value "$CheckTime     ????     Etat de la protection en temps réel inconnu, veuillez vérifier l'état de l'antivirus."
                                $WarnCount += 1
                                If ($PCWithFaultyRT -eq "n/a")
                                    {
                                        $PCWithFaultyRT = "$PC"
                                    }
                                Else
                                    {
                                        $PCWithFaultyRT += ", $PC"
                                    }
 
                            }
                    }
 
                # Création de la valeur correspondant au niveau de la définitions de virus
                Switch ($WSC_SECURITY_SIGNATURE_STATUS)
                    {
                        "00"
                            {
                                $BaseStatus = "A jour"
                                $CheckTime = Get-Date -UFormat "%Y-%m-%d %H:%M:%S"
                                Write-Host "$CheckTime     " -NoNewline
                                Write-Host "INFO     " -NoNewline -ForegroundColor Green
                                Write-Host "Bases de définitions de virus à jour."
                                Add-Content -Path $LogFile -Value "$CheckTime     INFO     Bases de définitions de virus à jour."
                            }
                        "10"
                            {
                                $BaseStatus = "Obsolète"
                                $CheckTime = Get-Date -UFormat "%Y-%m-%d %H:%M:%S"
                                Write-Host "$CheckTime     " -NoNewline
                                Write-Host "WARN     " -NoNewline -ForegroundColor Yellow
                                Write-Host "Bases de définitions de virus obsolètes."
                                Add-Content -Path $LogFile -Value "$CheckTime     WARN     Bases de définitions de virus obsolètes."
                                $WarmCount += 1
                                If ($PCWithObsoleteBase -eq "n/a")
                                    {
                                        $PCWithObsoleteBase = "$PC"
                                    }
                                Else
                                    {
                                        $PCWithObsoleteBase += ", $PC"
                                    }
                            }
                        default
                            {
                                $BaseStatus = "Inconnu"
                                $CheckTime = Get-Date -UFormat "%Y-%m-%d %H:%M:%S"
                                Write-Host "$CheckTime     " -NoNewline
                                Write-Host "????     " -NoNewline -ForegroundColor Magenta
                                Write-Host "Impossible de déterminer l'état des bases, veuillez vérifier l'état de l'antivirus."
                                Add-Content -Path $LogFile -Value "$CheckTime     ????     Impossible de déterminer l'état des bases, veuillez vérifier l'état de l'antivirus."
                                $WarnCount += 1
                                If ($PCWithObsoleteBase -eq "n/a")
                                    {
                                        $PCWithObsoleteBase = "$PC"
                                    }
                                Else
                                    {
                                        $PCWithObsoleteBase += ", $PC"
                                    }
                            }
                    }
            }
        Else
            {
                $PCOffline += 1
            }
    }
 
# Affichage du résumé
Write-Host "----------------------------------------------------------"
Add-Content -Path $LogFile -Value "----------------------------------------------------------"
$CheckTime = Get-Date -UFormat "%Y-%m-%d %H:%M:%S"
Write-Host "$CheckTime     " -NoNewline
Write-Host "INFO     " -NoNewline -ForegroundColor Green
Write-Host "Total des PC : $TotalPC."
Add-Content -Path $LogFile -Value "$CheckTime     INFO     Total des PC : $TotalPC."
$CheckTime = Get-Date -UFormat "%Y-%m-%d %H:%M:%S"
Write-Host "$CheckTime     " -NoNewline
Write-Host "INFO     " -NoNewline -ForegroundColor Green
Write-Host "PC interrogés : $PCOnline."
Add-Content -Path $LogFile -Value "$CheckTime     INFO     PC interrogés : $PCOnline."
If ($PCOffline)
    {
        $CheckTime = Get-Date -UFormat "%Y-%m-%d %H:%M:%S"
        Write-Host "$CheckTime     " -NoNewline
        Write-Host "WARN     " -NoNewline -ForegroundColor Yellow
        Write-Host "PC hors-ligne : $PCOffline."
        Add-Content -Path $LogFile -Value "$CheckTime     WARN     PC hors-ligne : $PCOffline."
    }
Else
    {
        $CheckTime = Get-Date -UFormat "%Y-%m-%d %H:%M:%S"
        Write-Host "$CheckTime     " -NoNewline
        Write-Host "INFO     " -NoNewline -ForegroundColor Green
        Write-Host "PC hors-ligne : $PCOffline."
        Add-Content -Path $LogFile -Value "$CheckTime     INFO     PC hors-ligne : $PCOffline."
    }
If ($WarnCount)
    {
        $CheckTime = Get-Date -UFormat "%Y-%m-%d %H:%M:%S"
        Write-Host "$CheckTime     " -NoNewline
        Write-Host "WARN     " -NoNewline -ForegroundColor Yellow
        Write-Host "Avertissement : $WarnCount."
        Add-Content -Path $LogFile -Value "$CheckTime     WARN     Avertissement : $WarnCount."
    }
Else
    {
        $CheckTime = Get-Date -UFormat "%Y-%m-%d %H:%M:%S"
        Write-Host "$CheckTime     " -NoNewline
        Write-Host "INFO     " -NoNewline -ForegroundColor Green
        Write-Host "Aucun avertissement détecté."
        Add-Content -Path $LogFile -Value "$CheckTime     INFO     Aucun avertissement détecté."
    }
If ($CritCount)
    {
        $CheckTime = Get-Date -UFormat "%Y-%m-%d %H:%M:%S"
        Write-Host "$CheckTime     " -NoNewline
        Write-Host "CRIT     " -NoNewline -ForegroundColor Red
        Write-Host "Critique : $CritCount."
        Add-Content -Path $LogFile -Value "$CheckTime     CRIT     Critique : $CritCount."
    }
Else
    {
        $CheckTime = Get-Date -UFormat "%Y-%m-%d %H:%M:%S"
        Write-Host "$CheckTime     " -NoNewline
        Write-Host "INFO     " -NoNewline -ForegroundColor Green
        Write-Host "Aucun critique détecté."
        Add-Content -Path $LogFile -Value "$CheckTime     INFO     Aucun critique détecté."
    }
If ($PCWithObsoleteBase -ne "")
    {
        $CheckTime = Get-Date -UFormat "%Y-%m-%d %H:%M:%S"
        Write-Host "$CheckTime     " -NoNewline
        Write-Host "WARN     " -NoNewline -ForegroundColor Yellow
        Write-Host "PC nécessitant une mise à jour des bases de définitions de virus : $PCWithObsoleteBase."
        Add-Content -Path $LogFile -Value "$CheckTime     WARN     PC nécessitant une mise à jour des bases de définitions de virus : $PCWithObsoleteBase."
    }
If ($PCWithFaultyRT -ne "")
    {
        $CheckTime = Get-Date -UFormat "%Y-%m-%d %H:%M:%S"
        Write-Host "$CheckTime     " -NoNewline
        Write-Host "CRIT     " -NoNewline -ForegroundColor Red
        Write-Host "PC n'ayant pas la protection en temps réel activée : $PCWithFaultyRT."
        Add-Content -Path $LogFile -Value "$CheckTime     CRIT     PC n'ayant pas la protection en temps réel activée : $PCWithFaultyRT."
    }
If ($PCWithManyAV -ne "")
    {
        $CheckTime = Get-Date -UFormat "%Y-%m-%d %H:%M:%S"
        Write-Host "$CheckTime     " -NoNewline
        Write-Host "CRIT     " -NoNewline -ForegroundColor Red
        Write-Host "PC ayant plusieurs antivirus actifs : $PCWithManyAV."
        Add-Content -Path $LogFile -Value "$CheckTime     CRIT     PC ayant plusieurs antivirus actifs : $PCWithManyAV."
    }
If ($PCWithoutAV -ne "")
    {
        $CheckTime = Get-Date -UFormat "%Y-%m-%d %H:%M:%S"
        Write-Host "$CheckTime     " -NoNewline
        Write-Host "CRIT     " -NoNewline -ForegroundColor Red
        Write-Host "PC n'ayant aucun antivirus actif : $PCWithoutAV."
        Add-Content -Path $LogFile -Value "$CheckTime     CRIT     PC ayant plusieurs antivirus actif : $PCWithoutAV."
    }
 
 
# Création du rapport pour Nagios
If ($n)
    {
        # On supprime l'ancien rapport
        If (Test-Path 'C:\Scripts\AntivirusState\Report.dat')
            {
                Remove-Item -Path 'C:\Scripts\AntivirusState\Report.dat' -Force > $null
            }
 
        # Affichage dans la console
        $CheckTime = Get-Date -UFormat "%Y-%m-%d %H:%M:%S"
        Write-Host "$CheckTime     " -NoNewline
        Write-Host "INFO     " -NoNewline -ForegroundColor Green
        Write-Host "Création du rapport pour Nagios."
        Add-Content -Path $LogFile -Value "$CheckTime     INFO     Création du rapport pour Nagios."
 
        # On crée un rapport vide
        $TempVar = @{}
        $TempVar | Export-Csv -Path 'C:\Scripts\AntivirusState\Report.dat' -Delimiter ';'
 
        # On ajoute les valeurs pour Nagios
        $ReportData = Import-Csv -Path 'C:\Scripts\AntivirusState\Report.dat' -Delimiter ';'
        $ReportData | Add-Member -MemberType NoteProperty -Name "Total" -Value $TotalPC
        $ReportData | Add-Member -MemberType NoteProperty -Name "Verif" -Value $PCOnline
        $ReportData | Add-Member -MemberType NoteProperty -Name "Offline" -Value $PCOffline
        $ReportData | Add-Member -MemberType NoteProperty -Name "RTFail" -Value $PCWithFaultyRT
        $ReportData | Add-Member -MemberType NoteProperty -Name "Obsolete" -Value $PCWithObsoleteBase
        $ReportData | Add-Member -MemberType NoteProperty -Name "TooMany" -Value $PCWithManyAV
        $ReportData | Add-Member -MemberType NoteProperty -Name "NoAV" -Value $PCWithoutAV
        $ReportData | Export-Csv -Path 'C:\Scripts\AntivirusState\Report.dat' -Delimiter ';'
    }
#############################################################################################################
#                                                                                                           #
# Traitement par Nagios du rapport de Get-AVState.ps1                                                       #
#                                                                                                           #
# Par Nicolas THOREZ                                                                                        #
#                                                                                                           #
#############################################################################################################
 
$Report = Import-Csv -Path 'C:\Scripts\AntivirusState\Report.dat' -Delimiter ';'
 
[int]$Total = $Report.Total
[int]$Verif = $Report.Verif
[int]$Offline = $Report.Offline
[String]$RTFail = $Report.RTFail
[String]$Obsolete = $Report.Obsolete
[String]$TooMany = $Report.TooMany
[String]$NoAV = $Report.NoAV
 
$Output = ""
$OutputMessage = ""
$ExitCode = 3
 
If ($NoAV -ne "n/a")
    {
        $Output = "Critical"
        $OutputMessage = "PC without AV : $NoAV"
        $ExitCode = 2
    }
Elseif ($TooMany -ne "n/a")
    {
        $Output = "Critical"
        If ($OutputMessage -eq "")
            {
                $OutputMessage = "PC with too many AV : $TooMany"
            }
        Else
            {
                $OutputMessage += ", PC with too many AV : $TooMany"
            }
        $ExitCode = 2
    }
Elseif ($RTFail -ne "n/a")
    {
        $Output = "Critical"
        If ($OutputMessage -eq "")
            {
                $OutputMessage = "PC without activated RealTime Protection : $RTFail"
            }
        Else
            {
                $OutputMessage += ", PC without activated RealTime Protection : $RTFail"
            }
        $ExitCode = 2
    }
If ($Obsolete -ne "n/a")
    {
        If ($Output -eq "")
            {
                $Output = "Warning"
                $ExitCode = 1
            }
        If ($OutputMessage -eq "")
            {
                $OutputMessage = "PC with obsolete virus definitions bases : $Obsolete"
            }
        Else
            {
                $OutputMessage += ", PC with obsolete virus definitions bases : $Obsolete"
            }
    }
If (($NoAV -eq "n/a") -and ($TooMany -eq "n/a") -and ($RTFail -eq "n/a") -and ($Obsolete -eq "n/a"))
    {
        $Output = "OK - Total : $Total, Verified : $Verif, Offline : $Offline"
        exit 0
    }
ElseIf (($ExitCode -eq 1) -or ($ExitCode -eq 2))
    {
        $FinalOutput = "$Output - Total : $Total, Verified : $Verif, Offline : $Offline -- $OutputMessage"
        Write-Host $FinalOutPut
        exit $ExitCode
    }
Else
    {
        Write-Host "Unknown - Error in Report.dat, please check"
        exit $ExitCode
    }

Nicolas THOREZ 2019/02/19 19:58

Entrer votre commentaire. La syntaxe wiki est autorisée:
 
  • antivirusstate.1551129961.txt.gz
  • Dernière modification : 2019/02/25 20:26
  • (modification externe)