Ceci est une ancienne révision du document !


Invoke-DailySave - Sauvegarde journalière des dossiers utilisateurs

Il y a des utilisateurs qui prennent l'habitude de garder des documents sur leur poste au lieu de les déposer dans un partage du serveur de fichiers. Cette manière de fonctionner est à proscrire car la sécurité des documents n'est pas garantie. Les administrateurs en charge de l'infrastructure n'ont aucune vision sur leur intégrité ni leur sauvegarde. Les habitudes ayant la vie dure, on est souvent amené à s'adapter à ce genre de comportement.

C'est dans cet optique que j'ai écris ce sript.

Son fonctionnement est assez simple :

  • Il crée une liste de PC à sauvegarder en ce basant sur l'interrogation de l'AD
  • Il teste les postes qui sont en ligne
  • Il récupère le nom du compte utilisateur connecté sur le poste
  • Il copie les données d'un dossier spécifique vers un dossier réseaux
  • Enfin il crée un rapport quotidien

Les informations sont affichés en temps réel dans la console avec une coloration syntaxique, information en vert, avertissement en jaune et critique en rouge. Il inclue aussi la possibilité de création d'un rapport succin qui pourra être traité par un autre script renvoyant les informations dans Nagios.

# Ligne ajoutée pour activer la coloration syntaxique. A supprimer.
<#
.SYNOPSIS
 
#############################################################################################################
#                                                                                                           #
# Script de sauvegarde du sous-dossier Sauvegarde_Journalière du dossier Documents de chaque utilisateur    #
#                                                                                                           #
# Par Nicolas THOREZ                                                                                        #
#                                                                                                           #
#############################################################################################################
 
.DESCRIPTION
 
Lance la sauvegarde d'un dossier local de l'utilisateur vers un dossier partagé d'un serveur de fichiers.
Cette sauvegarde est une copie miroir de ce dossier vers le même dossier dans un partage lié pour chaque utilisateur à son dossier personnel.
Un fichier de log journalier est créé et contient toutes les traces de la sauvegarde. (C:\Scripts\DailySave\DailySave-AAAA-MM-JJ.log)
 
.PARAMETER PC
 
Indique le ou les noms (séparé par des virgules (,)) des PC à sauvegarder. Si le paramètre n'est pas renseigner, la sauvegarde sera lancée sur tous les PC contenus dans les OU PC Fixes, PC Portables et Direction.
 
.PARAMETER v
 
Si le paramètre -v est indiqué, les détails de la sauvegarde seront affichés dans la console.
 
.PARAMETER n
 
Si le paramètre -n est indiqué, un fichier de réponse pour un traitement par Nagios sera créé (C:\Scripts\DailySave\SaveReport.dat)
 
.EXAMPLE
 
.\Invoke-DailySave.ps1
Lance la sauvegarde sur tous les postes.
 
.EXAMPLE
 
.\Invoke-DailySave.ps1 -v
Lance la sauvegarde sur tous les postes en affichant les détails.
 
.EXAMPLE
 
.\Invoke-DailySave.ps1 -PC PC-49,PC-7
Lance la sauvegarde sur les postes PC-49 et PC-7
 
.NOTES
 
NOM :      Invoke-DailySave.ps1
AUTEUR :   Nicolas THOREZ
VERSION :  1.3.1
 
HISTORIQUE :
 
0.0     2019-01-30      Début du projet
 
0.1     2019-01-30      Etude du script existant
                        Création du script de remplacement
 
0.2     2019-01-31      Ajout du paramètre PC pour ne sauvegarder qu'un PC (utile pour relancer une sauvegarde partiellement ratée)
                        Ajout du paramètre v pour avoir des détails supplémentaires (utile en cas d'analyse d'erreur de sauvegardes)
 
0.3     2019-01-31      Correction des erreurs lié au profil utilisateur ne correspondant pas au nom d'utilisateur
                        Correction des erreurs lié au blocage du pare-feu sur les postes distants
 
0.4     2019-01-31      Version de test
 
1.0     2019-01-31      Version mise en production
 
1.1     2019-01-31      Ajout du paramètre n pour créer un fichier de réponse pour Nagios (utile pour afficher une alerte dans Nagios en cas d'erreur)
 
1.2     2019-02-04      Ajout et traitements des codes d'erreurs 9 à 15
                        Ajout d'une suppression des anciens logs (la variable $Old indique l'âge maximum)
 
1.3     2019-02-05      Ajout de la gestion d'une liste d'ordinateurs pour l'argument -PC
 
1.3.1   2019-02-06      Modification de la gestion des erreurs en cas d'erreur inconnue
#>
 
# Paramètres d'entrée
 
Param(
    [String[]]$PC='All',
    [Switch]$v,
    [Switch]$n
)
 
# Déclaration des variables
 
If ($PC -eq 'All')
    {
        # Ici on indique les OU dans lesquelles on va chercher les postes à sauvegarder
        $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\DailySave\DailySave-$CheckDate.log"      # Chemin vers la sauvegarde des logs
$UserProfilePath = ""
$PCSaved = 0
$PCOffline = 0
$PCWithError = 0
$PCWithWarn = 0
$TotalPC = 0
$Old = 7                                # Indiquer ici la durée de rétention des anciens logs en jours.
$Domaine = 'TEST'                       # Indiquer ici le nom de domaine au format NetBIOS.
$FQDN = 'TEST.LOCAL'                    # Indiquer ici le nom DNS du domaine.
$Partage = "\\SAMBA\Partage"            # Indiquer ici le chemin de la racine du partage réseaux.
$SavedPath = "Documents"                # Indiquer ici le dossier du profil utilisateur à sauvegarder.
 
# Déclaration des fonctions
 
Function Get-ConnectedUser($PC)
    {
        $Name = (Get-WmiObject -ComputerName $PC -Class Win32_ComputerSystem -ErrorAction SilentlyContinue -WarningAction SilentlyContinue -InformationAction SilentlyContinue).UserName
        If ($Name -notlike "$Domaine*")
            {
 
                $Name = "n/a"
                $CheckTime = Get-Date -UFormat "%Y-%m-%d %H:%M:%S"
                Write-Host "$CheckTime     " -NoNewline
                Write-Host "WARN     " -NoNewline -ForegroundColor Yellow
                Write-Host "Aucun utilisateur connecté."
                Add-Content -Path $LogFile -Value "$CheckTime     WARN     Aucun utilisateur connecté."
            }
        Else
            {
                $Name = $Name.Replace('$Domaine\','')
                $CheckTime = Get-Date -UFormat "%Y-%m-%d %H:%M:%S"
                Write-Host "$CheckTime     " -NoNewline
                Write-Host "INFO     " -NoNewline -ForegroundColor Green
                Write-Host "Utilisateur $Name."
                Add-Content -Path $LogFile -Value "$CheckTime     INFO     Utilisateur $Name."
            }
        Return $Name
    }
 
Function Get-UserLocalPath
    {
        Param(
            [parameter(position=0)]
            $PC,
            [parameter(position=1)]
            [String]$User
        )
 
        # On récupère le SID de l'utilisateur
        $SID = ([wmi]"win32_userAccount.Domain=$Domaine,Name='$User'").SID
 
        # ON interroge le PC distant pour connaître le chemin du profil utilisateur
        $LocalPath = (Get-WmiObject -ComputerName $PC -Class Win32_userprofile | Where-Object {$_.SID -eq $SID}).LocalPath
 
        # On renvoie la valeur
        Return $LocalPath
    }
 
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
            }
    }
 
Function Run-Save
    {
        Param(
            [parameter(position=0)]
            $PC,
            [parameter(position=1)]
            [String]$User
        )
 
        # Récupération du chemin du profil utilisateur et formattage du chemin pour accès réseau
        $UserProfilePath = Get-UserLocalPath $PC $User
        $UserProfilePath = $UserProfilePath.Replace(":","$")
 
        # Définitions des dossiers pour la copie
        $Source = "\\$PC\$UserProfilePath\$SavedPath"
        $Destination = "$Partage\$User\$SavedPath"
 
        # Copie des fichiers
        If ($v)
            {
                ROBOCOPY $Source $Destination /COPYALL /MIR /ZB /R:0 /W:0
            }
        Else
            {
                ROBOCOPY $Source $Destination /COPYALL /MIR /ZB /R:0 /W:0 > $Null
            }
    }
 
# 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 sauvegarde."
        Add-Content -Path $LogFile -Value "----------------------------------------------------------"
        Add-Content -Path $LogFile -Value "$CheckTime     INFO     Début de la sauvegarde."
    }
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 sauvegarde."
        New-Item -Path $LogFile > $null
        Get-ChildItem –Path "C:\Scripts\DailySave" –Recurse | Where-Object CreationTime –lt (Get-Date).AddDays(-$Old) | Where-Object Name -ne DailySave.ps1 | Remove-Item -Force > $null
        Add-Content -Path $LogFile -Value "Log de la sauvegarde journalière des dossiers utilisateurs."
        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 sauvegarde."
    }
 
# 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)
            {
                # On teste si un utilisateur est connecté
                $User = Get-ConnectedUser($PC)
 
                # Si oui, on lance la sauvegarde
                If ($User -notlike "n/a")
                    {
                        $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 sauvegarde de $PC."
                        Add-Content -Path $LogFile -Value "$CheckTime     INFO     Début de la sauvegarde de $PC."
                        Run-Save $PC $User
                        Switch ($LASTEXITCODE)
                            {
                                0
                                    {
                                        $CheckTime = Get-Date -UFormat "%Y-%m-%d %H:%M:%S"
                                        Write-Host "$CheckTime     " -NoNewline
                                        Write-Host "INFO     " -NoNewline -ForegroundColor Green
                                        Write-Host "Source et destination identique, sauvegarde non nécessaire."
                                        Add-Content -Path $LogFile -Value "$CheckTime     INFO     Source et destination identique, sauvegarde non nécessaire."
                                        $PCSaved += 1
                                    }
                                1
                                    {
                                        $CheckTime = Get-Date -UFormat "%Y-%m-%d %H:%M:%S"
                                        Write-Host "$CheckTime     " -NoNewline
                                        Write-Host "INFO     " -NoNewline -ForegroundColor Green
                                        Write-Host "Tous les fichiers ont été copiés avec succès."
                                        Add-Content -Path $LogFile -Value "$CheckTime     INFO     Tous les fichiers ont été copiés avec succès."
                                        $PCSaved += 1
                                    }
                                2
                                    {
                                        $CheckTime = Get-Date -UFormat "%Y-%m-%d %H:%M:%S"
                                        Write-Host "$CheckTime     " -NoNewline
                                        Write-Host "WARN     " -NoNewline -ForegroundColor Yellow
                                        Write-Host "Des fichiers étrangers ont été trouvés sur la destination. Sauvegarde abandonnée."
                                        Add-Content -Path $LogFile -Value "$CheckTime     WARN     Des fichiers étrangers ont été trouvés sur la destination. Sauvegarde abandonnée."
                                        $PCWithWarn += 1
                                    }
                                3
                                    {
                                        $CheckTime = Get-Date -UFormat "%Y-%m-%d %H:%M:%S"
                                        Write-Host "$CheckTime     " -NoNewline
                                        Write-Host "INFO     " -NoNewline -ForegroundColor Green
                                        Write-Host "Certains fichiers ont été copiés. Des fichiers supplémentaires étaient présents. Aucun échec n'a été rencontré."
                                        Add-Content -Path $LogFile -Value "$CheckTime     INFO     Certains fichiers ont été copiés. Des fichiers supplémentaires étaient présents. Aucun échec n'a été rencontré."
                                        $PCSaved += 1
                                    }
                                4
                                    {
                                        $CheckTime = Get-Date -UFormat "%Y-%m-%d %H:%M:%S"
                                        Write-Host "$CheckTime     " -NoNewline
                                        Write-Host "WARN     " -NoNewline -ForegroundColor Yellow
                                        Write-Host "Certains fichiers ou répertoires incompatibles ont été détectés. Le ménage peut être nécessaire."
                                        Add-Content -Path $LogFile -Value "$CheckTime     WARN     Certains fichiers ou répertoires incompatibles ont été détectés. Le ménage peut être nécessaire."
                                        $PCWithWarn += 1
                                    }
                                5
                                    {
                                        $CheckTime = Get-Date -UFormat "%Y-%m-%d %H:%M:%S"
                                        Write-Host "$CheckTime     " -NoNewline
                                        Write-Host "WARN     " -NoNewline -ForegroundColor Yellow
                                        Write-Host "Certains fichiers ont été copiés. Certains fichiers étaient incompatibles. Aucun échec n'a été rencontré."
                                        Add-Content -Path $LogFile -Value "$CheckTime     WARN     Certains fichiers ont été copiés. Certains fichiers étaient incompatibles. Aucun échec n'a été rencontré."
                                        $PCWithWarn += 1
                                   }
                                6
                                    {
                                        $CheckTime = Get-Date -UFormat "%Y-%m-%d %H:%M:%S"
                                        Write-Host "$CheckTime     " -NoNewline
                                        Write-Host "WARN     " -NoNewline -ForegroundColor Yellow
                                        Write-Host "Il existe des fichiers supplémentaires et des fichiers incompatibles. Aucun fichier n'a été copié et aucun échec n'a été rencontré. Cela signifie que les fichiers existent déjà dans le répertoire de destination."
                                        Add-Content -Path $LogFile -Value "$CheckTime     WARN     Il existe des fichiers supplémentaires et des fichiers incompatibles. Aucun fichier n'a été copié et aucun échec n'a été rencontré. Cela signifie que les fichiers existent déjà dans le répertoire de destination."
                                        $PCWithWarn += 1
                                    }
                                7
                                    {
                                        $CheckTime = Get-Date -UFormat "%Y-%m-%d %H:%M:%S"
                                        Write-Host "$CheckTime     " -NoNewline
                                        Write-Host "WARN     " -NoNewline -ForegroundColor Yellow
                                        Write-Host "Les fichiers ont été copiés, une incompatibilité de fichier était présente et des fichiers supplémentaires étaient présents."
                                        Add-Content -Path $LogFile -Value "$CheckTime     WARN     Les fichiers ont été copiés, une incompatibilité de fichier était présente et des fichiers supplémentaires étaient présents."
                                        $PCWithWarn += 1
                                    }
                                8
                                    {
                                        $CheckTime = Get-Date -UFormat "%Y-%m-%d %H:%M:%S"
                                        Write-Host "$CheckTime     " -NoNewline
                                        Write-Host "CRIT     " -NoNewline -ForegroundColor Red
                                        Write-Host "Plusieurs fichiers n'ont pas été copiés."
                                        Add-Content -Path $LogFile -Value "$CheckTime     CRIT     Plusieurs fichiers n'ont pas été copiés."
                                        $PCWithError += 1
                                    }
                                9
                                    {
                                        $CheckTime = Get-Date -UFormat "%Y-%m-%d %H:%M:%S"
                                        Write-Host "$CheckTime     " -NoNewline
                                        Write-Host "WARN     " -NoNewline -ForegroundColor Yellow
                                        Write-Host "Un ou plusieurs fichiers ont été copiés avec succès, mais certains fichiers ou répertoires ne peuvent pas être copiés."
                                        Add-Content -Path $LogFile -Value "$CheckTime     WARN     Un ou plusieurs fichiers ont été copiés avec succès, mais certains fichiers ou répertoires ne peuvent pas être copiés."
                                        $PCWithWarn += 1
                                    }
                                10
                                    {
                                        $CheckTime = Get-Date -UFormat "%Y-%m-%d %H:%M:%S"
                                        Write-Host "$CheckTime     " -NoNewline
                                        Write-Host "CRIT     " -NoNewline -ForegroundColor Red
                                        Write-Host "Plusieurs fichiers n'ont pas été copiés et des fichiers étrangers ont été trouvés sur la destination."
                                        Add-Content -Path $LogFile -Value "$CheckTime     CRIT     Plusieurs fichiers n'ont pas été copiéset des fichiers étrangers ont été trouvés sur la destination."
                                        $PCWithError += 1
                                    }
                                11
                                    {
                                        $CheckTime = Get-Date -UFormat "%Y-%m-%d %H:%M:%S"
                                        Write-Host "$CheckTime     " -NoNewline
                                        Write-Host "CRIT     " -NoNewline -ForegroundColor Red
                                        Write-Host "Quelques fichiers ont été copiés mais plusieurs fichiers n'ont pas été copiés et des fichiers étrangers ont été trouvés sur la destination."
                                        Add-Content -Path $LogFile -Value "$CheckTime     CRIT     Quelques fichiers ont été copiés mais plusieurs fichiers n'ont pas été copiés et des fichiers étrangers ont été trouvés sur la destination."
                                        $PCWithError += 1
                                    }
                                12
                                    {
                                        $CheckTime = Get-Date -UFormat "%Y-%m-%d %H:%M:%S"
                                        Write-Host "$CheckTime     " -NoNewline
                                        Write-Host "CRIT     " -NoNewline -ForegroundColor Red
                                        Write-Host "Plusieurs fichiers n'ont pas été copiés et certains fichiers ou répertoires incompatibles ont été détectés."
                                        Add-Content -Path $LogFile -Value "$CheckTime     CRIT     Plusieurs fichiers n'ont pas été copiés et certains fichiers ou répertoires incompatibles ont été détectés."
                                        $PCWithError += 1
                                    }
                                13
                                    {
                                        $CheckTime = Get-Date -UFormat "%Y-%m-%d %H:%M:%S"
                                        Write-Host "$CheckTime     " -NoNewline
                                        Write-Host "CRIT     " -NoNewline -ForegroundColor Red
                                        Write-Host "Quelques fichiers ont été copiés mais plusieurs fichiers n'ont pas été copiés et certains fichiers ou répertoires incompatibles ont été détectés."
                                        Add-Content -Path $LogFile -Value "$CheckTime     CRIT     Quelques fichiers ont été copiés mais plusieurs fichiers n'ont pas été copiés et certains fichiers ou répertoires incompatibles ont été détectés."
                                        $PCWithError += 1
                                    }
                                14
                                    {
                                        $CheckTime = Get-Date -UFormat "%Y-%m-%d %H:%M:%S"
                                        Write-Host "$CheckTime     " -NoNewline
                                        Write-Host "CRIT     " -NoNewline -ForegroundColor Red
                                        Write-Host "Plusieurs fichiers n'ont pas été copiés, des fichiers étrangers ont été trouvés sur la destination et certains fichiers ou répertoires incompatibles ont été détectés."
                                        Add-Content -Path $LogFile -Value "$CheckTime     CRIT     Plusieurs fichiers n'ont pas été copiés, des fichiers étrangers ont été trouvés sur la destination et certains fichiers ou répertoires incompatibles ont été détectés."
                                        $PCWithError += 1
                                    }
                                15
                                    {
                                        $CheckTime = Get-Date -UFormat "%Y-%m-%d %H:%M:%S"
                                        Write-Host "$CheckTime     " -NoNewline
                                        Write-Host "CRIT     " -NoNewline -ForegroundColor Red
                                        Write-Host "Quelques fichiers ont été copiés mais plusieurs fichiers n'ont pas été copiés, des fichiers étrangers ont été trouvés sur la destination et certains fichiers ou répertoires incompatibles ont été détectés."
                                        Add-Content -Path $LogFile -Value "$CheckTime     CRIT     Quelques fichiers ont été copiés mais plusieurs fichiers n'ont pas été copiés, des fichiers étrangers ont été trouvés sur la destination et certains fichiers ou répertoires incompatibles ont été détectés."
                                        $PCWithError += 1
                                    }
                                16
                                    {
                                        $CheckTime = Get-Date -UFormat "%Y-%m-%d %H:%M:%S"
                                        Write-Host "$CheckTime     " -NoNewline
                                        Write-Host "CRIT     " -NoNewline -ForegroundColor Red
                                        Write-Host "Erreur grave. Aucun fichier n'a été copié. Soit une erreur d'utilisation, soit une erreur due à des privilèges d'accès insuffisants sur les répertoires source ou de destination."
                                        Add-Content -Path $LogFile -Value "$CheckTime     CRIT     Erreur grave. Aucun fichier n'a été copié. Soit une erreur d'utilisation, soit une erreur due à des privilèges d'accès insuffisants sur les répertoires source ou de destination."
                                        $PCWithError += 1
                                    }
                                Default
                                    {
                                        If ($LASTEXITCODE)
                                            {
                                                $ExitCode = $LASTEXITCODE
                                            }
                                        Else
                                            {
                                                $ExitCode = "inconnu"
                                            }
                                        $CheckTime = Get-Date -UFormat "%Y-%m-%d %H:%M:%S"
                                        Write-Host "$CheckTime     " -NoNewline
                                        Write-Host "CRIT     " -NoNewline -ForegroundColor Red
                                        Write-Host "Erreur inconnue. Code d'erreur $ExitCode."
                                        Add-Content -Path $LogFile -Value "$CheckTime     CRIT     Erreur inconnue. Code d'erreur $ExitCode."
                                        $PCWithError += 1
                                    }
 
                            }
                        $CheckTime = Get-Date -UFormat "%Y-%m-%d %H:%M:%S"
                        Write-Host "$CheckTime     " -NoNewline
                        Write-Host "INFO     " -NoNewline -ForegroundColor Green
                        Write-Host "Fin de la sauvegarde de $PC."
                        Add-Content -Path $LogFile -Value "$CheckTime     INFO     Fin de la sauvegarde de $PC."
                    }
            }
        Else
            {
                $PCOffline += 1
            }
    }
 
# Fin de la sauvegarde
 
$CheckTime = Get-Date -UFormat "%Y-%m-%d %H:%M:%S"
Write-Host "$CheckTime     " -NoNewline
Write-Host "INFO     " -NoNewline -ForegroundColor Green
Write-Host "Fin de la sauvegarde."
$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 traités : $TotalPC."
$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 sauvegardés : $PCSaved."
$CheckTime = Get-Date -UFormat "%Y-%m-%d %H:%M:%S"
Write-Host "$CheckTime     " -NoNewline
If ($PCOffline -gt 0)
    {
        Write-Host "WARN     " -NoNewline -ForegroundColor Yellow
        Write-Host "Total des PC hors-ligne : $PCOffline."
    }
Else
    {
        Write-Host "INFO     " -NoNewline -ForegroundColor Green
        Write-Host "Total des PC hors-ligne : $PCOffline."
    }
$CheckTime = Get-Date -UFormat "%Y-%m-%d %H:%M:%S"
Write-Host "$CheckTime     " -NoNewline
If ($PCWithWarn -gt 0)
    {
        Write-Host "WARN     " -NoNewline -ForegroundColor Yellow
        Write-Host "Total des sauvegardes avec des erreurs : $PCWithWarn."
    }
Else
    {
        Write-Host "INFO     " -NoNewline -ForegroundColor Green
        Write-Host "Total des sauvegardes avec des erreurs : $PCWithWarn."
    }
$CheckTime = Get-Date -UFormat "%Y-%m-%d %H:%M:%S"
Write-Host "$CheckTime     " -NoNewline
If ($PCWithError -gt 0)
    {
        Write-Host "CRIT     " -NoNewline -ForegroundColor Red
        Write-Host "Total des sauvegardes en échec : $PCWithError."
    }
Else
    {
        Write-Host "INFO     " -NoNewline -ForegroundColor Green
        Write-Host "Total des sauvegardes en échec : $PCWithError."
    }
Add-Content -Path $LogFile -Value "----------------------------------------------------------"
Add-Content -Path $LogFile -Value "$CheckTime     INFO     Fin de la sauvegarde."
Add-Content -Path $LogFile -Value "$CheckTime     INFO     Total des PC traités : $TotalPC."
Add-Content -Path $LogFile -Value "$CheckTime     INFO     Total des PC sauvegardés : $PCSaved."
If ($PCOffline -gt 0)
    {
        Add-Content -Path $LogFile -Value "$CheckTime     WARN     Total des PC hors-ligne : $PCOffline."
    }
Else
    {
        Add-Content -Path $LogFile -Value "$CheckTime     INFO     Total des PC hors-ligne : $PCOffline."
    }
If ($PCWithWarn -gt 0)
    {
        Add-Content -Path $LogFile -Value "$CheckTime     WARN     Total des sauvegardes avec des erreurs : $PCWithWarn."
    }
Else
    {
        Add-Content -Path $LogFile -Value "$CheckTime     INFO     Total des sauvegardes avec des erreurs : $PCWithWarn."
    }
If ($PCWithError -gt 0)
    {
        Add-Content -Path $LogFile -Value "$CheckTime     CRIT     Total des sauvegardes en échec : $PCWithError."
    }
Else
    {
        Add-Content -Path $LogFile -Value "$CheckTime     INFO     Total des sauvegardes en échec : $PCWithError."
    }
Add-Content -Path $LogFile -Value "----------------------------------------------------------"
 
# Création d'un fichier de réponse pour un traitement par Nagios
If ($n)
    {
        # On vérifie la présence d'un ancien rapport et on le détruit
        $Report = "C:\Scripts\DailySave\SaveReport.dat"
        If (Test-Path -Path $Report)
            {
                Remove-Item -Path $Report -Force
            }
 
        # On crée un rapport vierge
        $TempVar = @{}
        $TempVar | Export-Csv -Path $Report -Delimiter ';'
 
        # On ajoute les valeurs pour Nagios
        $ReportData = Import-Csv -Path $Report -Delimiter ';'
        $ReportData | Add-Member -MemberType NoteProperty -Name "Total" -Value $TotalPC
        $ReportData | Add-Member -MemberType NoteProperty -Name "Saved" -Value $PCSaved
        $ReportData | Add-Member -MemberType NoteProperty -Name "Offline" -Value $PCOffline
        $ReportData | Add-Member -MemberType NoteProperty -Name "Warning" -Value $PCWithWarn
        $ReportData | Add-Member -MemberType NoteProperty -Name "Critical" -Value $PCWithError
        $ReportData | Export-Csv -Path $Report -Delimiter ';'
 
        # Affichage des logs
        $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 de réponse pour Nagios."
        Add-Content -Path $LogFile -Value "----------------------------------------------------------"
        Add-Content -Path $LogFile -Value "$CheckTime     INFO     Création du fichier de réponse pour Nagios."
    }
##############################################################################
#                                                                            #
# Vérification du fichier de réponse (SaveReport.dat) de DailySave.ps1       #
#                                                                            #
# Par Nicolas THOREZ                                                         #
#                                                                            #
##############################################################################
 
$Report = Import-Csv -Path 'C:\Scripts\DailySave\SaveReport.dat' -Delimiter ';'
 
[int]$Total = $Report.Total
[int]$Saved = $Report.Saved
[int]$Offline = $Report.Offline
[int]$Warning = $Report.Warning
[int]$Critical = $Report.Critical
 
$Output = ""
$ExitCode = 3
 
If ($Critical -gt 0)
    {
        $Output = "Critical"
        $ExitCode = 2
    }
Elseif ($Warning -gt 0)
    {
        $Output = "Warning"
        $ExitCode = 1
    }
Elseif (($Warning -eq 0) -and ($Critical -eq 0))
    {
        $Output = "OK"
        $ExitCode = 0
    }
Else
    {
        echo "Unknown - Error in SaveReport.dat, please check"
        exit $ExitCode
    }
 
echo "$Output - Total : $Total, Saved : $Saved, Offline : $Offline, Warning : $Warning, Error : $Critical"
exit $ExitCode

Nicolas THOREZ 2019/02/19 21:43

Entrer votre commentaire. La syntaxe wiki est autorisée:
 
  • dailysave.1553764123.txt.gz
  • Dernière modification : 2019/03/28 08:08
  • (modification externe)