backuppersonnalfolder

Différences

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

Lien vers cette vue comparative

Prochaine révision
Révision précédente
backuppersonnalfolder [2019/11/28 14:19] – créée 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>
-# Ligne ajoutée pour activer la coloration syntaxique. A supprimer.+
 <# <#
 .SYNOPSIS .SYNOPSIS
Ligne 76: Ligne 81:
 .EXAMPLE .EXAMPLE
  
-.\Backup-PersonnalFolder.ps1 -ComputerName PC-MTG-49,PC-MTG-7 +.\Backup-PersonnalFolder.ps1 -ComputerName PC1,PC7 
-Lance la sauvegarde sur les postes PC-MTG-49 et PC-MTG-7+Lance la sauvegarde sur les postes PC1 et PC7
  
 .NOTES .NOTES
Ligne 125: Ligne 130:
  
 Param ( Param (
- [String[]]$ComputerName = 'All',+ [String[]]$ComputerName = "All",
  [Switch]$Verbose,  [Switch]$Verbose,
  [Switch]$Nagios  [Switch]$Nagios
Ligne 146: 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 169: Ligne 174:
  
 # Domaine Active Directory # Domaine Active Directory
-$Domaine = 'ADMTARGET'+$Domaine = 'SHYRKA'
 # FQDN pour le domaine # FQDN pour le domaine
-$FQDN = 'ad.mtarget.net'+$FQDN = 'shyrka.sys'
 # Liste des OU de recherche de postes pour l'inventaire des postes à traiter # Liste des OU de recherche de postes pour l'inventaire des postes à traiter
 $OUs = @( $OUs = @(
- "OU=PC Fixe,OU=Ordinateurs,DC=AD,DC=MTARGET,DC=NET+ "OU=PC Fixe,OU=Ordinateurs,DC=SHYRKA,DC=SYS
- "OU=PC Portable,OU=Ordinateurs,DC=AD,DC=MTARGET,DC=NET+ "OU=PC Portable,OU=Ordinateurs,DC=SHYRKA,DC=SYS
- "OU=Ordinateurs,OU=Direction,DC=AD,DC=MTARGET,DC=NET"+ "OU=Ordinateurs,OU=Direction,DC=SHYRKA,DC=SYS"
 ) )
 # Administrateur du domaine # Administrateur du domaine
-$Admin = "$Domaine\Administrateur"+$Admin = "$Domaine\BackupAdmin"
 # Mot de passe (en version sécurisée) # Mot de passe (en version sécurisée)
 $SecurePassword = Get-Content -Path "$Path\data.crypt" | ConvertTo-SecureString $SecurePassword = Get-Content -Path "$Path\data.crypt" | ConvertTo-SecureString
Ligne 205: 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 225: 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 258: 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 312:
  {  {
  # Sinon, on récupère le login de l'utilisateur  # Sinon, on récupère le login de l'utilisateur
- $Name = $Name.Replace("$Domaine\", "")+                $Pattern = $Domaine + '\' 
 + $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 413: Ligne 419:
  # Lettre du lecteur temporaire  # Lettre du lecteur temporaire
  $Drive = "T"  $Drive = "T"
 +                $DrivePath = "$Drive" + ':\'
   
 +                # Récupération de la lettre de disque système
 +                [string]$SystemDrive = (Get-ComputerInfo).OsSystemDrive + '\'
  # Création du ShadowCopy  # Création du ShadowCopy
- $ShadowCopy = (Get-WmiObject -List Win32_ShadowCopy).Create("C:\", "ClientAccessible")+ $ShadowCopy = (Get-WmiObject -List Win32_ShadowCopy).Create("$SystemDrive", "ClientAccessible")
  # Récupération de l'identifiant de ShadowCopy créé  # Récupération de l'identifiant de ShadowCopy créé
  $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 437: Ligne 468:
  Remove-Item -Path "${Drive}:\$LocalBackupLogFile"  Remove-Item -Path "${Drive}:\$LocalBackupLogFile"
  }  }
- New-Item -Path "${Drive}:\" -Name "$LocalBackupLogFile" -ItemType File | Out-Null+ New-Item -Path "$DrivePath" -Name "$LocalBackupLogFile" -ItemType File | Out-Null
   
  # Listes des fichiers  # Listes des fichiers
  $FileToBackup = Get-ChildItem -Path $ScriptSource -Recurse  $FileToBackup = Get-ChildItem -Path $ScriptSource -Recurse
- $FileInBackup = Get-ChildItem -Path "${Drive}:\" -Recurse -Exclude "$LocalBackupLogFile"+ $FileInBackup = Get-ChildItem -Path "$DrivePath" -Recurse -Exclude "$LocalBackupLogFile"
   
  # Liste des fichiers à mettre à jour  # Liste des fichiers à mettre à jour
  $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 459: 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 472: 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 478: 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 493: 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 508: 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 514: 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 529: Ligne 560:
   
  # Suppression du lien de shadowcopy  # Suppression du lien de shadowcopy
- cmd /c rmdir C:\ShadowCopy+ (Get-Item -Path C:\ShadowCopy).Delete() 
  }  }
   
Ligne 696: 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 717: Ligne 748:
 [int]$Critical = $Report.Critical [int]$Critical = $Report.Critical
  
-$Output = ""+$Output = ''
 $ExitCode = 3 $ExitCode = 3
  
Ligne 737: 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.1574947156.txt.gz
  • Dernière modification : 2019/11/28 12:19
  • (modification externe)