backuppersonnalfolder

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
backuppersonnalfolder [2019/11/28 14:43] – [Script principal] nekanbackuppersonnalfolder [2021/03/05 16:12] (Version actuelle) nekan
Ligne 1: Ligne 1:
-~~CLOSETOC~~ 
 ====== Backup-PersonnalFolder - Sauvegarde de dossiers utilisateurs ====== ====== Backup-PersonnalFolder - Sauvegarde de dossiers utilisateurs ======
 +<label type="info">Création</label> --- //[[nekan@shyrkasystem.com|Nicolas THOREZ]] 2019/11/28 14:13//
  
 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. 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.
Ligne 16: Ligne 16:
 Les informations sont affichés en temps réel dans la console avec une coloration syntaxique, information en <color green>vert</color>, avertissement en <color #EF9300>jaune</color> et critique en <color red>rouge</color>. Les informations sont affichés en temps réel dans la console avec une coloration syntaxique, information en <color green>vert</color>, avertissement en <color #EF9300>jaune</color> et critique en <color red>rouge</color>.
 Il inclut aussi la possibilité de création d'un rapport succin qui pourra être traité par un autre script renvoyant les informations dans Nagios. Il inclut aussi la possibilité de création d'un rapport succin qui pourra être traité par un autre script renvoyant les informations dans Nagios.
 +
 +===== Prérequis =====
 +
 +Pour fonctionner, le script nécessite de stocker le mot de passe de l'administrateur de sauvegarde dans un fichier sécurisé.
 +
 +Voir : [[powershell_password|Sécurisation d'un mot de passe]]
  
 ===== Script principal ===== ===== Script principal =====
  
-<code powershell>+<sxh powershell>
 <# <#
 .SYNOPSIS .SYNOPSIS
Ligne 124: Ligne 130:
  
 Param ( Param (
- [String[]]$ComputerName = 'All',+ [String[]]$ComputerName = "All",
  [Switch]$Verbose,  [Switch]$Verbose,
  [Switch]$Nagios  [Switch]$Nagios
Ligne 145: Ligne 151:
 $BackupLog = "$BackupRootFolder\$BackupLogFile" $BackupLog = "$BackupRootFolder\$BackupLogFile"
 # Initialisation du chemin de profil utilisateur # Initialisation du chemin de profil utilisateur
-$UserProfilePath = ""+$UserProfilePath = ''
 # Chemin pour la racine des destinations de sauvegardes # Chemin pour la racine des destinations de sauvegardes
 $Partage = "\\LBG-SMB-1\Partage_utilisateur" $Partage = "\\LBG-SMB-1\Partage_utilisateur"
Ligne 204: Ligne 210:
 #region Langue #region Langue
  
-##### En cas de traductions dans une autres langues, d'autres messages sont à modifiées entre les lignes 372 et 383 #####+##### En cas de traductions dans une autre langue, d'autres messages sont à modifiées entre les lignes 379 et 390 #####
  
 $BackupSuccessful = "Sauvegarde réussie." $BackupSuccessful = "Sauvegarde réussie."
Ligne 224: Ligne 230:
 $WarningMessage = "Des avertissements sont signalés. Merci de vérifier le fichier Backup.log dans le dossier de sauvegarde utilisateur." $WarningMessage = "Des avertissements sont signalés. Merci de vérifier le fichier Backup.log dans le dossier de sauvegarde utilisateur."
  
-##### En cas de traductions dans une autres langues, d'autres messages sont à modifiées entre les lignes 378 et 389 #####+##### En cas de traductions dans une autre langue, d'autres messages sont à modifiées entre les lignes 379 et 390 #####
  
 #endregion Langue #endregion Langue
Ligne 257: Ligne 263:
  {  {
  # Sinon, on traite le message  # Sinon, on traite le message
- $CheckTime = Get-Date -Format 'G'+ $CheckTime = Get-Date -Format G
  If ($Verbose)  If ($Verbose)
  {  {
Ligne 307: Ligne 313:
  # Sinon, on récupère le login de l'utilisateur  # Sinon, on récupère le login de l'utilisateur
                 $Pattern = $Domaine + '\'                 $Pattern = $Domaine + '\'
- $Name = $Name.Replace("$Pattern", "")+ $Name = $Name.Replace("$Pattern", '')
  Add-Log -Type "INFO" -Message "Utilisateur $Name."  Add-Log -Type "INFO" -Message "Utilisateur $Name."
  }  }
Ligne 369: Ligne 375:
  # Récupération du chemin du profil utilisateur et formatage du chemin pour accès réseau  # Récupération du chemin du profil utilisateur et formatage du chemin pour accès réseau
  $UserProfilePath = Get-UserLocalPath -PC $PC -User $User  $UserProfilePath = Get-UserLocalPath -PC $PC -User $User
- $UserProfilePath = $UserProfilePath.Replace(':'':\ShadowCopy')+ $UserProfilePath = $UserProfilePath.Replace(":"":\ShadowCopy")
   
  # Définitions des dossiers pour la copie  # Définitions des dossiers pour la copie
Ligne 422: Ligne 428:
  $ID = Get-WmiObject Win32_ShadowCopy | Where-Object { $_.ID -eq $ShadowCopy.ShadowID }  $ID = Get-WmiObject Win32_ShadowCopy | Where-Object { $_.ID -eq $ShadowCopy.ShadowID }
  # Formatage du chemin du ShadowCopy  # Formatage du chemin du ShadowCopy
- $CorrectPath = $ID.DeviceObject + '\'+ $CorrectPath = $ID.DeviceObject + "\
 + # Création du type d'objet [Custom.SymLink] pour le lien symbolique 
 + Try 
 +
 +     $Null = [Win32.SymLink] 
 +
 + Catch 
 +
 +     Add-Type @" 
 +         using System; 
 +         using System.Runtime.InteropServices; 
 +   
 +         namespace Win32 
 +         { 
 +             public class SymLink 
 +             { 
 +                 [DllImport("kernel32.dll")] 
 +                 public static extern bool CreateSymbolicLink(string lpSymlinkFileName, string lpTargetFileName, int dwFlags); 
 +             } 
 +         } 
 +"@ 
 +
 +                
  # Création du lien symbolique  # Création du lien symbolique
- cmd /c mklink /d C:\ShadowCopy $CorrectPath | Out-Null + [Win32.SymLink]::CreateSymbolicLink("C:\ShadowCopy", $CorrectPath, 1) 
- +
  # Identifiants pour l'élévation de droits  # Identifiants pour l'élévation de droits
  $Cred = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $User, $Pass  $Cred = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $User, $Pass
Ligne 449: Ligne 477:
  $FileToBackup | ForEach-Object {  $FileToBackup | ForEach-Object {
  $FileFullName = $_.FullName  $FileFullName = $_.FullName
- $PrintName = $FileFullName.Replace('ShadowCopy\', "")+ $PrintName = $FileFullName.Replace("ShadowCopy\", '')
  $TestFile = ($_.FullName).Replace($ScriptSource, "${Drive}:")  $TestFile = ($_.FullName).Replace($ScriptSource, "${Drive}:")
  $TestFileType = (Get-Item -Path $TestFile).GetType().Name  $TestFileType = (Get-Item -Path $TestFile).GetType().Name
- If ((Test-Path $TestFile) -and ($TestFileType -ne 'DirectoryInfo'))+ If ((Test-Path $TestFile) -and ($TestFileType -ne "DirectoryInfo"))
  {  {
  $SourceFileDate = Get-Date -Date (Get-ItemProperty -Path $FileFullName).LastWriteTime  $SourceFileDate = Get-Date -Date (Get-ItemProperty -Path $FileFullName).LastWriteTime
Ligne 462: Ligne 490:
  {  {
  Copy-Item -Path $FileFullName -Destination $TestFile  Copy-Item -Path $FileFullName -Destination $TestFile
- $CheckDate = Get-Date -Format 'G'+ $CheckDate = Get-Date -Format G
  Add-Content -Path "${Drive}:\$LocalBackupLogFile" -Value "$CheckDate    [GOOD]    $UpdateMessage $PrintName"  Add-Content -Path "${Drive}:\$LocalBackupLogFile" -Value "$CheckDate    [GOOD]    $UpdateMessage $PrintName"
  }  }
  Catch  Catch
  {  {
- $CheckDate = Get-Date -Format 'G'+ $CheckDate = Get-Date -Format G
  Add-Content -Path "${Drive}:\$LocalBackupLogFile" -Value "$CheckDate    [CRIT]    $UpdateErrorMessage $PrintName"  Add-Content -Path "${Drive}:\$LocalBackupLogFile" -Value "$CheckDate    [CRIT]    $UpdateErrorMessage $PrintName"
  }  }
Ligne 475: Ligne 503:
  {  {
  $RecentFile = $TestFile.Replace("${Drive}:", $ScriptDestination)  $RecentFile = $TestFile.Replace("${Drive}:", $ScriptDestination)
- $CheckDate = Get-Date -Format 'G'+ $CheckDate = Get-Date -Format G
  Add-Content -Path "${Drive}:\$LocalBackupLogFile" -Value "$CheckDate    [CRIT]    $FileIOnBackupMoreRecent $RecentFile"  Add-Content -Path "${Drive}:\$LocalBackupLogFile" -Value "$CheckDate    [CRIT]    $FileIOnBackupMoreRecent $RecentFile"
  }  }
Ligne 481: Ligne 509:
  If ($SourceFileDate -eq $DestinationFileDate)  If ($SourceFileDate -eq $DestinationFileDate)
  {  {
- $CheckDate = Get-Date -Format 'G'+ $CheckDate = Get-Date -Format G
  Add-Content -Path "${Drive}:\$LocalBackupLogFile" -Value "$CheckDate    [INFO]    $SameFile $PrintName"  Add-Content -Path "${Drive}:\$LocalBackupLogFile" -Value "$CheckDate    [INFO]    $SameFile $PrintName"
  }  }
Ligne 496: Ligne 524:
  {  {
  Remove-Item -Path $FileFullName -Force -Recurse 2> $Null  Remove-Item -Path $FileFullName -Force -Recurse 2> $Null
- $CheckDate = Get-Date -Format 'G'+ $CheckDate = Get-Date -Format G
  Add-Content -Path "${Drive}:\$LocalBackupLogFile" -Value "$CheckDate    [GOOD]    $DeleteMessage $FileFullName"  Add-Content -Path "${Drive}:\$LocalBackupLogFile" -Value "$CheckDate    [GOOD]    $DeleteMessage $FileFullName"
  }  }
  Catch  Catch
  {  {
- $CheckDate = Get-Date -Format 'G'+ $CheckDate = Get-Date -Format G
  Add-Content -Path "${Drive}:\$LocalBackupLogFile" -Value "$CheckDate    [WARN]    $DeleteErrorMessage $FileFullName"  Add-Content -Path "${Drive}:\$LocalBackupLogFile" -Value "$CheckDate    [WARN]    $DeleteErrorMessage $FileFullName"
  }  }
Ligne 511: Ligne 539:
  $FileFullName = $_.FullName  $FileFullName = $_.FullName
  $TestFile = ($_.FullName).Replace($ScriptSource, "${Drive}:")  $TestFile = ($_.FullName).Replace($ScriptSource, "${Drive}:")
- $PrintName = $FileFullName.Replace('ShadowCopy\', "")+ $PrintName = $FileFullName.Replace("ShadowCopy\", '')
  If (-not (Test-Path $TestFile))  If (-not (Test-Path $TestFile))
  {  {
Ligne 517: Ligne 545:
  {  {
  Copy-Item -Path $FileFullName -Destination $TestFile  Copy-Item -Path $FileFullName -Destination $TestFile
- $CheckDate = Get-Date -Format 'G'+ $CheckDate = Get-Date -Format G
  Add-Content -Path "${Drive}:\$LocalBackupLogFile" -Value "$CheckDate    [GOOD]    $NewFileMessage $PrintName"  Add-Content -Path "${Drive}:\$LocalBackupLogFile" -Value "$CheckDate    [GOOD]    $NewFileMessage $PrintName"
  }  }
  Catch  Catch
  {  {
- $CheckDate = Get-Date -Format 'G'+ $CheckDate = Get-Date -Format G
  Add-Content -Path "${Drive}:\$LocalBackupLogFile" -Value "$CheckDate    [CRIT]    $NewFileErrorMessage $PrintName"  Add-Content -Path "${Drive}:\$LocalBackupLogFile" -Value "$CheckDate    [CRIT]    $NewFileErrorMessage $PrintName"
  }  }
Ligne 532: Ligne 560:
   
  # Suppression du lien de shadowcopy  # Suppression du lien de shadowcopy
- cmd /c rmdir C:\ShadowCopy+ (Get-Item -Path C:\ShadowCopy).Delete() 
  }  }
   
Ligne 699: Ligne 727:
  Add-Log -Type "INFO" -Message $CreatingNagiosReport  Add-Log -Type "INFO" -Message $CreatingNagiosReport
 } }
-</code>+</sxh>
  
 ===== Script d'interprétation pour Nagios ===== ===== Script d'interprétation pour Nagios =====
  
-<code:ps1+<sxh powershell
-############################################################################## +####################################################################################### 
-                                                                           +                                                                                    
-# Vérification du fichier de réponse (SaveReport.dat) de DailySave.ps1       # +# Vérification du fichier de réponse (SaveReport.dat) de Backup-PersonnalFolder       # 
-                                                                           +                                                                                    
-# Par Nicolas THOREZ                                                         +# Par Nicolas THOREZ                                                                  
-                                                                           +                                                                                    
-##############################################################################+#######################################################################################
  
-$Report = Import-Csv -Path 'C:\Scripts\DailySave\SaveReport.dat' -Delimiter ';'+$Report = Import-Csv -Path 'C:\Scripts\BackupPersonnalFolder\SaveReport.dat' -Delimiter ';'
  
 [int]$Total = $Report.Total [int]$Total = $Report.Total
Ligne 720: Ligne 748:
 [int]$Critical = $Report.Critical [int]$Critical = $Report.Critical
  
-$Output = ""+$Output = ''
 $ExitCode = 3 $ExitCode = 3
  
Ligne 740: Ligne 768:
 Else Else
     {     {
-        echo "Unknown - Error in SaveReport.dat, please check"+        Write-Host "Unknown - Error in SaveReport.dat, please check"
         exit $ExitCode         exit $ExitCode
     }     }
  
-echo "$Output - Total : $Total, Saved : $Saved, Offline : $Offline, Warning : $Warning, Error : $Critical"+Write-Host "$Output - Total : $Total, Saved : $Saved, Offline : $Offline, Warning : $Warning, Error : $Critical"
 exit $ExitCode exit $ExitCode
  
-</code> +</sxh>
- +
- --- //[[nekan@shyrkasystem.com|Nicolas THOREZ]] 2019/11/28 14:13//+
  
 ~~DISCUSSION~~ ~~DISCUSSION~~
  • backuppersonnalfolder.1574948598.txt.gz
  • Dernière modification : 2019/11/28 12:43
  • (modification externe)