Powershell_Scripts/robocopy-local-zip-mail-0.9.ps1

652 lines
60 KiB
PowerShell
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# =======================================================
# Fonction qui ecrit les messages sur la sortie standard
# Usage : Write-OutputConsole ($theme)
# =======================================================
function Write-OutputConsole($theme) {
if ( $theme -eq "lancement") {
write-Output "!-----------------------------------------------------------------------------!"
Write-Output "! La Sauvegarde en local de Vos Documents, Votre Bureau !"
Write-Output "! et Votre Messagerie est en cours. !"
Write-Output "! !"
Write-Output "! Les fichiers avec les extensions suivantes sont actuellement exclus: !"
Write-Output "! .ogg.flac.mp3.wav.wma.aac.mpeg.ogm.avi.flv.wmv.mov.divx.xvid !"
Write-Output "! !"
Write-Output "! Fermer cette Fenêtre Annulera la Sauvegarde ! !"
Write-Output "! !"
Write-Output "------------------------------------------------------------------------------!"
}
if ( $theme -eq "lancementvol") {
write-Output "!-----------------------------------------------------------------------------!"
Write-Output "! La Sauvegarde sur Serveur distant de Vos Documents, Votre Bureau !"
Write-Output "! et Votre Messagerie est en cours. !"
Write-Output "! !"
Write-Output "! Les fichiers avec les extensions suivantes sont actuellement exclus: !"
Write-Output "! .ogg.flac.mp3.wav.wma.aac.mpeg.ogm.avi.flv.wmv.mov.divx.xvid !"
Write-Output "! !"
Write-Output "! Fermer cette Fenêtre Annulera la Sauvegarde ! !"
Write-Output "! !"
Write-Output "------------------------------------------------------------------------------!"
}
if ( $theme -eq "zipprob") {
write-Output "!-------------------------------------------------------------------------------!"
Write-Output "! La compression de la messagerie a echoué !"
Write-Output "! !"
Write-Output "! !"
Write-Output "! Fermer cette Fenêtre Annulera la Sauvegarde ! !"
Write-Output "! !"
Write-Output "--------------------------------------------------------------------------------!"
}
if ( $theme -eq "nospace") {
write-Output "!-------------------------------------------------------------------------------!"
Write-Output "! Le Disque dur C Local n'a pas assez d'espace Libre !"
Write-Output "! !"
Write-Output "! La sauvegarde est annulée !"
Write-Output "! Contactez votre administrateur. !"
Write-Output "! !"
Write-Output "--------------------------------------------------------------------------------!"
}
if ( $theme -eq "novoltaire") {
Write-Output "!-------------------------------------------------------------------------------!"
Write-Output "! Le Serveur de Sauvegarde est indiponible !"
Write-Output "! !"
Write-Output "! !"
Write-Output "! La Sauvegarde distante est Annulée ! !"
Write-Output "! !"
Write-Output "--------------------------------------------------------------------------------!"
}
if ( $theme -eq "pasdeflagloc") {
Write-Output "!-------------------------------------------------------------------------------!"
Write-Output "! La Sauvegarde Locale de Vos Documents, Votre Bureau !"
Write-Output "! et Votre Messagerie a déjà été lancée !"
Write-Output "! lors de ces dernières 24 heures !"
Write-Output "! La Sauvegarde est donc annulée ! !"
Write-Output "! !"
Write-Output "--------------------------------------------------------------------------------!"
}
if ( $theme -eq "pasdeflagnet") {
Write-Output "!-------------------------------------------------------------------------------!"
Write-Output "! La Sauvegarde Réseau de Vos Documents, Votre Bureau !"
Write-Output "! et Votre Messagerie a déjà été lancée !"
Write-Output "! lors de ces dernières 24 heures !"
Write-Output "! La Sauvegarde est donc annulée ! !"
Write-Output "! !"
Write-Output "--------------------------------------------------------------------------------!"
}
}
# =======================================================
# Fonction qui envoie un email avec 2 attachements
# =======================================================
function Send-EMail($argFrom, $argTo, $argtoCC, $argPriority, $argSubject, $argBody, $argAtt, $argAtt2, $argSmtp) {
$mail = New-Object System.Net.Mail.MailMessage
$smtpClient = new-object system.net.mail.SmtpClient($argSmtp)
$mail.Body = $argBody
$mail.Subject = $argSubject
$mail.priority = $argPriority
$mail.From = $argFrom
$mail.To.Add($argTo)
if ($argtoCC) {
$mail.CC.Add($argtoCC)
}
if (!($argAtt -eq $null)) {
$att = new-object Net.Mail.Attachment $argAtt
$mail.Attachments.Add($att)
}
if (!($argAtt2 -eq $null)) {
$att2 = new-object Net.Mail.Attachment $argAtt2
$mail.Attachments.Add($att2)
}
$smtpClient.Credentials = [System.Net.CredentialCache]::DefaultNetworkCredentials
$smtpClient.Send($mail)
$mail.Attachments.Dispose()
$mail = $null
$smtpClient = $null
}
# =======================================================================
# Fonction qui affiche une boite de dialogue qui se ferme automatiquement
# =======================================================================
function DisplayMessageBox($argText, $argDelayDisplay, $argTitre, $argButton) {
$job=Start-Job -ArgumentList $argText,$argDelayDisplay,$argTitre,$argButton -ScriptBlock {
$a = new-object -comobject wscript.shell
$a.popup($args[0],$args[1],$args[2],$args[3])
}
return $job;
}
# =================================================================================================
# DESCRIPTION: Displays the attention message box & checks to see if the user clicks the ok button.
# Affiche une boîte de dialogue fenêtrée
# Prérequis [void][Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
# =================================================================================================
function Show-MessageBox([string] $Message,[string] $Titre="Attention !!", [String] $IconType="Warning",[String] $BtnType="Ok") {
trap {
switch ($_.Exception.GetType().FullName) {
"System.Management.Automation.PSInvalidCastException" {$_.message;Break}
"System.Management.Automation.RuntimeException" {
Throw "Assurez-vous que l'assembly [System.Windows.Forms] est bien chargé."
}
default {Throw $_}
}#switch
}#trap
return [Windows.Forms.MessageBox]::Show($Message,$Titre, $BtnType,$IconType)
}
function Show-QuestionBox([string] $Message,[string] $Titre="Question ??", [String] $IconType="Question",[String] $BtnType="YesNo") {
trap {
switch ($_.Exception.GetType().FullName) {
"System.Management.Automation.PSInvalidCastException" {$_.message;Break}
"System.Management.Automation.RuntimeException" {
Throw "Assurez-vous que l'assembly [System.Windows.Forms] est bien chargé."
}
default {Throw $_}
}#switch
}#trap
return [Windows.Forms.MessageBox]::Show($Message,$Titre,[Windows.Forms.MessageBoxButtons]::$BtnType, [Windows.Forms.MessageBoxIcon]::$IconType)
}
function Show-InfoBox([string] $Message,[string] $Titre="Pour votre Information !!", [String] $IconType="Information",[String] $BtnType="Ok") {
trap {
switch ($_.Exception.GetType().FullName) {
"System.Management.Automation.PSInvalidCastException" {$_.message;Break}
"System.Management.Automation.RuntimeException" {
Throw "Assurez-vous que l'assembly [System.Windows.Forms] est bien chargé."}
default {Throw $_}
}#switch
}#trap
return [Windows.Forms.MessageBox]::Show($Message,$Titre, $BtnType,$IconType)
}
# =================================================
# Renvoi la Taille d'un repertoire en octets
# =================================================
function Get-FolderSize() {
param ([string]$root = $(resolve-path .))
gci -re $root |
?{ -not $_.PSIsContainer } |
measure-object -sum -property Length
}
# =================================================
# Renvoi la Taille d'un fichier en octet
# =================================================
function Get-FileSize($Path) {
# On verifie si le path exist
if(test-path $Path){
$colItems = (Get-ChildItem $Path)
return $colItems.Length
}
else {
return 0
}
}
# ==================================================
# Renvoie la Taille d'un fichier en Go
# ==================================================
function Get-FileSizeGB($Path){
return ("{0:N2}" -f ((Get-FileSize $Path) /1GB))
}
# ===========================================================
# Nettoyage des Logs
# ===========================================================
function Delete-Logs($argDirectoryLogs,$argDelay){
$jour = [DateTime]::Today
$lastMod = $jour.AddDays(-$argDelay)
#Récupere la liste des fichiers logs antérieurs à la date
$Files = get-childitem $argDirectoryLogs -include *.log -recurse | Where {$_.LastWriteTime -le "$lastMod"}
if (!($Files -eq $null)) {
foreach ($File in $Files) {
write-host $File
Remove-Item $File
}
}
}
# =========================================================================
# Fonction de récupération du mail utilisateur dans le fichier sur Voltaire
# =========================================================================
function Get-Email {
param ([string]$login,[string]$filelogs)
Get-Content $filelogs | Where-Object { $_.split(";")[0] -match "$login"} | foreach {$_ -replace "^$login;", ""}
}
# =======================================================
# Fonction qui initialise le bon path de la messagerie
# =======================================================
function Find-DirectoryMessagerie {
param ([string]$pathDocsUserLocation)
Set-Location $pathDocsUserLocation
Get-ChildItem "./" | Where-Object {$_.Attributes -eq "Directory"} | Where-Object {$_.Name -match "^[M-m]essagerie$"} | foreach {$_.FullName}
}
# =========================================================================
# Fonctions relatives à la taille du disque C
# =========================================================================
function Get-FreeSpaceCGB {
return Get-WmiObject win32_logicaldisk -Filter "DriveType=3" | Where-Object {$_.DeviceID -eq "C:"} | ForEach-Object {[Math]::round($_.FreeSpace/1GB,2)}
}
function Get-FreeSpaceC {
return Get-WmiObject win32_logicaldisk -Filter "DriveType=3" | Where-Object {$_.DeviceID -eq "C:"} | ForEach-Object {$_.FreeSpace}
}
function Get-SizeC {
return Get-WmiObject win32_logicaldisk -Filter "DriveType=3" | Where-Object {$_.DeviceID -eq "C:"} | ForEach-Object {$_.Size}
}
function Get-SizeCGB {
return Get-WmiObject win32_logicaldisk -Filter "DriveType=3" | Where-Object {$_.DeviceID -eq "C:"} | ForEach-Object {[Math]::round($_.Size/1GB,2)}
}
function espacedispo
{
$freespaceC = Get-WmiObject win32_logicaldisk -Filter "DriveType=3" | Where-Object {$_.DeviceID -eq "C:"} | ForEach-Object {$_.FreeSpace}
$sizeC = Get-WmiObject win32_logicaldisk -Filter "DriveType=3" | Where-Object {$_.DeviceID -eq "C:"} | ForEach-Object {$_.Size}
$freespaceCGB = Get-WmiObject win32_logicaldisk -Filter "DriveType=3" | Where-Object {$_.DeviceID -eq "C:"} | ForEach-Object {[Math]::round($_.FreeSpace / 1073741824,2)}
$sizeCGB = Get-WmiObject win32_logicaldisk -Filter "DriveType=3" | Where-Object {$_.DeviceID -eq "C:"} | ForEach-Object {[Math]::round($_.Size / 1073741824,2)}
$docspace = (Get-FolderSize $DocsUserLocation).Sum
$burspace = (Get-FolderSize $BureauUserLocation).Sum
$totaltoback = $burspace + $docspace
$docspaceGB = [Math]::round($docspace/1GB,2)
$totaltobackGB = [Math]::round($totaltoback/1GB,2)
$spaceminfree = $totaltoback + 21474836480
echo $spaceminfree
echo $freespaceCGB
if
( $freespaceC -lt $spaceminfree )
{
$greenflag = 1
}
else
{
$greenflag = 0
}
return $greenflag
}
function Kill-Process ($app) {
if (Get-Process $app -ErrorAction silentlycontinue) {
Get-Process $app | Stop-Process
Start-Sleep -s 2
}
}
function Get-OS {
return (Get-WmiObject -class Win32_OperatingSystem).Caption | foreach {$_ -replace " ", ""}
}
#=======================================================
# Fonction qui défini laptop ou desktop
# =======================================================
function Get-PCtype {
return (Get-WmiObject -class Win32_computersystem).PCSystemType }
$pctype = Get-PCtype
if ($pctype -ne "2")
{$fixe = "Oui"}
else
{$fixe = "Non"}
# =======================================================
# Fonction qui écrit des indicateurs dans un fichier
# =======================================================
function Set-Indicator($fichier) {
#Si le fichier n'existe pas, je crée un nouveau fichier.
if ((Test-Path $fichier) -ne "True") { New-Item -ItemType file -Path $indicateurs -Force }
# Ajoute une ligne dans le fichier.
# Les champs sont l'utilisateur, l'ordinateur, les 5 codes de sortie des commandes robocopy, les dates de debut et de fin, la taille en GB à copier à distance
# et l'espace libre suffisant Oui ou Non
Add-Content -Path $fichier -Value "$UserName;$ComputerName;$DocExitCode;$BurExitCode;$MailZipExitCode;$BurVolExitCode;$DocVolExitCode;$Tstart;$Tend;$sizetobackGB;$nospace"
}
# =======================================================
# Déclaration des variables globales
# =======================================================
# Portable ou Fixe
#$fixe = "Oui"
# Serveur de backup
$BackupServer = "voltaire"
# Serveur de Backup FQDN
$BackupServerfdqn = "voltaire.univ-orleans.fr"
# Répertoire partagé sur le serveur
$ShareBackupServer = "sauvegarde"
# Répertoire sauvegarde local
$NameDirectoryBackup = "sauvegarde"
# Nom de l'ordinateur
$ComputerName = $Env:COMPUTERNAME
# Nom de la session
$UserName = $Env:USERNAME
# Initialisation du jour de la semaine
$numjour = Get-Date -UFormat %u
# Initialisation du Jour de l'année
$dayofyear = (get-date).dayofyear
# Répertoire de sauvegarde sur le serveur voltaire
$DirBackVol = "\\$BackupServer\$ShareBackupServer\$UserName"
# Répertoire Voltaire pour les mails zippés
$DirZipMailVol = "$DirBackVol\Mail"
# Nom du repertoire de logs Voltaire
$NameDirectoryLogs = "Logssauv"
# Nom du repertoire de logs Local
$NameDirectoryLogsLocal = "Localogssauv"
# Nom du serveur smtp
$SmtpServerName = "smtp.univ-orleans.fr"
# Mail du support
$toSupport = "aide.bureautique@univ-orleans.fr"
# Emplacement du fichier de correspondance des emails (attention à ce qu'il ne soit pas modifié par des utilisateurs!)
$filelogins = "\\$BackupServer\$ShareBackupServer\logssauv\login-email.csv"
# Champ FROM des courriel
if ((Test-Path $filelogins) -ne "True") {
$mailfrom = "sauvegarde@univ-orleans.fr" }
else {
if (( Get-Content "$filelogins" | ? { $_ -match "$UserName" } ) -eq $Null ) {
$mailfrom = "sauvegarde@univ-orleans.fr" }
else {
$mailfrom = Get-EMail $UserName $filelogins
}
}
if ((Test-Path $filelogins) -ne "True") {
$Toclient = "sauvegarde@univ-orleans.fr" }
else {
if (( Get-Content "$filelogins" | ? { $_ -match "$UserName" } ) -eq $Null ) {
$Toclient = "sauvegarde@univ-orleans.fr" }
else {
$Toclient = Get-EMail $UserName $filelogins
}
}
# Fichier des indicateurs sur \\voltaire\sauvegarde\
$indicateurs = "\\$BackupServer\$ShareBackupServer\logssauv\indicateurs$dayofyear.txt"
# Localisation du profil des utilisateurs (XP ou seven)
$ProfileUserLocation = $Env:UserProfile
$DirectoryBackup = "$ProfileUserLocation\sauvegarde"
$DirectoryBackupMail = "$DirectoryBackup\Mail"
$DocsUserLocation = [Environment]::GetFolderPath("MyDocuments")
$DocsDestBackup = "$DirBackVol\Documents"
$DocsDestBackupLocal = "$DirectoryBackup\Documents"
$BureauUserLocation = [Environment]::GetFolderPath("Desktop")
$BureauDestBackup = "$DirBackVol\Bureau"
$BureauDestBackupLocal = "$DirectoryBackup\Bureau"
$NameDirectoryLogsVol = "$DocsUserLocation\Logssauv"
$NameDirectoryLogsLoc = "$DocsUserLocation\Localogssauv"
$fichierflagloc = "$DirectoryBackup\flag-loc.txt"
$fichierflagnet = "$DirectoryBackup\flag-net.txt"
$mailpath = Find-DirectoryMessagerie $DocsUserLocation
$DirectoryExclude = "$mailpath"
$zipmail = "$DirectoryBackupMail\SauvMail-current-$UserName.zip"
$zipmailbak = "$DirectoryBackupMail\SauvMail-bak-$UserName.zip"
$os = Get-OS
#Liste des fichiers à exclure
$FileExclude = "`"*.ogg`" `"*.flac`" `"*.mp3`" `"*.wav`" `"*.wma`" `"*.aac`" `"*.mpeg`" `"*.ogm`" `"*.avi`" `"*.flv`" `"*.wmv`" `"*.mov`" `"*.divx`" `"*.xvid`" "
# Nom du fichier logs
$NameFileDocsLogs = "SavDoc"+" {0:dddd dd MMM yyyy' - 'HH'h'mm}.log" -f (Get-Date)
$NameFileBurLogs = "SavBur"+" {0:dddd dd MMM yyyy' - 'HH'h'mm}.log" -f (Get-Date)
$NameZipMailLogs = "SavZipMail"+" {0:dddd dd MMM yyyy' - 'HH'h'mm}.log" -f (Get-Date)
$NameFileZipLogs = "ZipLog"+" {0:dddd dd MMM yyyy' - 'HH'h'mm}.log" -f (Get-Date)
$NameZipLogs = "ZipMail"+" {0:dddd dd MMM yyyy' - 'HH'h'mm}.log" -f (Get-Date)
$NameDocVolLogs = "SavDocVol"+" {0:dddd dd MMM yyyy' - 'HH'h'mm}.log" -f (Get-Date)
$NameBurVolLogs = "SavBurVol"+" {0:dddd dd MMM yyyy' - 'HH'h'mm}.log" -f (Get-Date)
$DelayRetentionLogs = 8
$listJob = @()
$ExitCode = @{
"16"="Erreur fatale lors de l'opération. Voir fichier de Log"
"15"="Echec de la copie. Voir le fichier de Log."
"14"="Echec de la copie. Voir le fichier de Log."
"13"="Echec de la copie. Voir le fichier de Log."
"12"="Echec de la copie. Voir le fichier de Log."
"11"="Echec de la copie. Voir le fichier de Log."
"10"="Echec de la copie. Voir le fichier de Log."
"9"="Echec de la copie. Voir le fichier de Log."
"8"="Echec de la copie. Plisieurs fichiers n'ont pas été copiés. Voir le fichier de Log."
"7"="Copie OK. Certains fichiers présents et supplémentaires on généré une incohérence entre la source et la destination. Voir le fichier de Log."
"6"="Copie OK. Certains fichiers et dossiers suplémentaires ont généré une incohérence entre la source et la destination. Voir le fichier de Log."
"5"="Copie OK. Certains fichiers ont été copiés et d'autres ont généré une incohérence entre la source et la destination. Voir le fichier de Log."
"4"="Copie OK. Une incohérence entre la source et la destination de la sauvegarde a été détectée. Voir le fichier de Log."
"3"="Copie OK. Certains fichiers supplémentaires ont été copiés avec succès."
"2"="Copie OK. Certains fichiers ou répertoires supplémentaires ont été détectés et copiés avec succès."
"1"="Copie OK. Un ou plusieurs fichiers ont été copiés avec succès du répertoire source au répertoire de destination."
"0"="Copie OK. Aucun changement. Le répertoire source était identique au répertoire de destination."
}
$mail = New-Object System.Net.Mail.MailMessage
$killappli = @("outlook","excel","winword","powerpnt","msaccess","mspub","visio","thunderbird","soffice.bin")
$SavDocLoglocal = "$NameDirectoryLogsLoc\$NameFileDocsLogs"
$SavDocVolLog = "$NameDirectoryLogsVol\$NameDocVolLogs"
$SavZipLoglocal = "$NameDirectoryLogsLoc\$NameFileZipLogs"
$resultatcopieloc = 0
$resultatcopienet = 0
$pasnecessaireloc = 0
$pasnecessairenet = 0
# FIN VARIABLES GLOBALES DEF ET INIT
# =============================
# DEBUT DU PROGRAMME PRINCIPAL
# =============================
# Chargement d'une librairie pour l'affichade de fenetre
[System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
# On tue les appli genantes
foreach ($i in $killappli){
Kill-Process ($i)
}
Start-Sleep -s 2
# Détermination de l'endroit ou effectuer la sauvegarde
# et la validation ou non de la sauvegarde précédente en local
If (!(Test-Path "$DirectoryBackup")){
Set-Location "$ProfileUserLocation"
New-Item -ItemType Directory -Name "$NameDirectoryBackup"
}
#Test des répertoires acceuillant les logs des backups et création si nécessaire
If (! (Test-Path "$NameDirectoryLogsLoc")){
Set-Location "$DocsUserLocation"
New-Item -ItemType Directory -Name "$NameDirectoryLogsLocal"
}
If (! (Test-Path "$DirectoryBackupMail")) {
Set-Location $DirectoryBackup
New-Item -ItemType Directory -Name "Mail"
}
If (!(Test-Path "$NameDirectoryLogsVol")){
Set-Location "$DocsUserLocation"
New-Item -ItemType Directory -Name "$NameDirectoryLogs"
}
$TimesStart = Get-date -Format 'dddd dd MMM yyyy'
$HourStart = Get-Date -Format 'HH"h"mm'
$Tstart = Get-Date -Format 'yyyy-MM-dd HH:mm:ss'
# ===============================================================
# 1ERE SEQUENCE : COPIE LOCALE
# ===============================================================
If ( $fixe -eq "Non" ){
$d = Show-QuestionBox ("Question :`n", "Voulez-vous lancer une sauvegarde maintenant ?`n Répondez Oui pour la lancer ou Non pour quitter")}
If ($d -eq [Windows.Forms.DialogResult]::Yes) {
$reponseuser = "Oui"}
else {
$reponseuser = "Non"}
If (($fixe -eq "Oui") -or ( $reponseuser -eq "Oui")){
# Taille brute pour des opérations mathématiques
$sizeMailUserReal = (Get-FolderSize $mailpath).Sum
$sizeDocsUserReal = (Get-FolderSize $DocsUserLocation).Sum
$sizeBurUserReal = (Get-FolderSize $BureauUserLocation).Sum
$sizeDocsVolReal = $sizeDocsUserReal - $sizeMailUserReal
$sizeZipsVolReal = (Get-FolderSize $DirectoryBackupMail).Sum
$sizetoback = $sizeBurUserReal + $sizeDocsVolReal + $sizeZipsVolReal
# Taille en Gb reformaté
$sizeDocsUser = [Math]::round($sizeDocsUserReal/1GB,2)
$sizeBurUser = [Math]::round($sizeBurUserReal/1GB,2)
$sizeZipsVolRealGB = [Math]::round($sizeZipsVolReal/1GB,2)
$sizetobackGB = [Math]::round($sizetoback/1GB,2)
# Vérification de l'espace disponible sur le disque local
$space = espacedispo
If ( $space -eq 1 ) { Write-OutputConsole("nospace")
$nospace = 1
Set-indicator($indicateurs)
Show-MessageBox ("Attention !!", "Le Disque dur C Local n'a pas assez d'espace Libre,`n La sauvegarde est annulée`nIl est indispensable de contacter au plus vite votre administrateur.`n`nCliquez su OK pour Eteindre")
}
else {
If ((!(Test-Path "$fichierflagloc")) -or ((Get-item "$fichierflagloc" | where-object {($_.lastwritetime gt ((Get-date).Addhours(-18)))}) -eq $null)) {
Write-OutputConsole("lancement")
Start-Sleep -s 2
# TODO : peut-être faut-il exlure le répertoire Messagerie?
robocopy "$DocsUserLocation" "$DocsDestBackupLocal" /MIR /R:3 /W:5 /xf $FileExclude /XA:HS > $SavDocLoglocal
$DocExitCode = $LASTEXITCODE
robocopy "$BureauUserLocation" "$BureauDestBackupLocal" /MIR /R:3 /W:5 /xf $FileExclude /XA:HS >> $SavDocLoglocal
$BurExitCode = $LASTEXITCODE
#Test d'existance du zip current et renommage en bak
If (Test-Path "$zipmail"){
Set-Location "$DirectoryBackupMail"
If (Test-Path "$zipmailbak"){
Remove-Item "$zipmailbak" -Force
}
Rename-Item "$zipmail" -NewName "$zipmailbak" -Force
}
# Test 7-zip # > $NameDirectoryLogsVol\$NameZipLogs
if (-not (test-path "$env:ProgramFiles\7-Zip\7z.exe")) {throw "$env:ProgramFiles\7-Zip\7z.exe needed"} set-alias sz "$env:ProgramFiles\7-Zip\7z.exe"
# Routine pour fabriquer les archives Zip avec 7-Zip
[string]$arg = ""
$arg = " a `"$zipmail`" `"$mailpath`" > `"$SavZipLoglocal`""
$cmdline = "sz", $arg -join ""
Invoke-Expression -command "$cmdline"
#TODO: Ne pas oublier de tester si le zip a bien marché
$pattern = "Everything is Ok"
$resultzip = Get-Content $SavZipLoglocal | select-string -pattern $pattern
if ($resultzip -eq "False") { Write-OutputConsole("zipprob") }
if ($DocExitCode -lt 8 -and $BurExitCode -lt 8) {
# La sauvegarde Locale est réussie, on remet le fichier flag puis on compresse le tout dans le dossier du jour
set-content -path "$fichierflagloc" -value "OK"
$resultatcopieloc = 1
}
}
Else{
Write-OutputConsole("pasdeflagloc")
Start-Sleep -s 5
$pasnecessaireloc = 1
}
## ===============================================================
# 2EME SEQUENCE : COPIE RESEAU
# ================================================================
If ((!(Test-Path "$fichierflagnet")) -or ((Get-item "$fichierflagnet" | where-object {($_.lastwritetime gt ((Get-date).Addhours(-18)))}) -eq $null)){
Write-OutputConsole("lancementvol")
Start-Sleep -s 2
# Test de la disponibilité du serveur, on arrête le programme si le serveur est injoignable
if ((!(Test-Connection -computer $BackupServer -Count 3 -quiet)) -or (!(Test-Connection -computer $BackupServerfdqn -Count 5 -quiet))) {
Write-OutputConsole("novoltaire")
Show-MessageBox ("Attention !!", "Le serveur de backup n'est pas joignable, la sauvegarde est annulée`nContactez votre administrateur.`n`nCliquez su OK pour Eteindre")
exit
}
if ($os -eq "MicrosoftWindows7Professionnel" )
{
robocopy "$DirectoryBackupMail" "$DirZipMailVol" /MIR /R:3 /W:5 /MT > $SavDocVolLog
$MailZipExitCode = $LASTEXITCODE
# Lancement de la copie du Bureau sur Voltaire
robocopy "$BureauUserLocation" "$BureauDestBackup" /MIR /R:3 /W:5 /xf $FileExclude /MT >> $SavDocVolLog
$BurVolExitCode = $LASTEXITCODE
# Lancement de la copie des Docs sur Voltaire sans la Messagerie
robocopy "$DocsUserLocation" "$DocsDestBackup" /MIR /R:3 /W:5 /xf $FileExclude /XD $DirectoryExclude /MT >> $SavDocVolLog
$DocVolExitCode = $LASTEXITCODE
}
else
{
robocopy "$DirectoryBackupMail" "$DirZipMailVol" /MIR /R:3 /W:5 > $SavDocVolLog
$MailZipExitCode = $LASTEXITCODE
# Lancement de la copie du Bureau sur Voltaire
robocopy "$BureauUserLocation" "$BureauDestBackup" /MIR /R:3 /W:5 >> $SavDocVolLog
$BurVolExitCode = $LASTEXITCODE
# Lancement de la copie des Docs sur Voltaire sans la Messagerie
robocopy "$DocsUserLocation" "$DocsDestBackup" /MIR /R:3 /W:5 /XD $DirectoryExclude >> $SavDocVolLog
$DocVolExitCode = $LASTEXITCODE
}
if ($MailZipExitCode -lt 8 -and $BurVolExitCode -lt 8 -and $DocVolExitCode -lt 8){
# La sauvegarde Locale est réussie, on remet le fichier flag puis on compresse le tout dans le dossier du jour
set-content -path "$fichierflagnet" -value "OK"
$resultatcopienet = 1
}
}
Else {
Write-OutputConsole("pasdeflagnet")
Start-Sleep -s 2
$pasnecessairenet = 1
}
$TimesEnd = Get-date -Format 'dddd dd MMM yyyy'
$HourEnd = Get-Date -Format 'HH"h"mm'
$Tend = Get-Date -Format 'yyyy-MM-dd HH:mm:ss'
## ===============================================================
# 3EME SEQUENCE : INDICATEURS/NOTIFICATIONS
# ================================================================
Delete-Logs $NameDirectoryLogsLoc 8
Delete-Logs $NameDirectoryLogsVol 8
if (($pasnecessaireloc -eq 1) -and ($pasnecessairenet -eq 1)) {
exit
}
elseif ((($pasnecessaireloc -eq 1) -and ($resultatcopienet -eq 1)) -or (($resultatcopieloc -eq 1) -and ($pasnecessairenet -eq 1))) {
$messagecourriel = "Résultat de la sauvegarde : OK (démarrée le $TimesStart à $HourStart et terminée le $TimesEnd à $HourEnd)"
$body = "Si la sauvegarde a déja été exécutée dans les 18h, elle n'est pas relancée.`n`nUne des sauvegardes (soit Locale soit Distante) n'était pas nécessaire et n'a pas été lancée"
$toSupport = $null
}
elseif (($resultatcopieloc -eq 1) -and ($resultatcopienet -eq 1)) {
$messagecourriel = "Résultat de la sauvegarde : OK (démarrée le $TimesStart à $HourStart et terminée le $TimesEnd à $HourEnd)"
$body = "Si la sauvegarde a déja été exécutée dans les 18h, elle n'est pas relancée."
$toSupport = $null
}
else {
$messagecourriel = "Un problème est survenu dans l'exécution de votre sauvegarde (démarrée le $TimesStart à $HourStart et terminée le $TimesEnd à $HourEnd)"
$body = "Un problème est survenu dans l'exécution de la sauvegarde pour $UserName. survenu lors de la sauvegarde des Documents et du Bureau démarrée le $TimesStart à $HourStart et terminée le $TimesEnd à $HourEnd.`n`nLes résultats de sauvegardes ont été les suivants :`n`nDocuments`n"+$ExitCode["$DocExitCode"]+" `n`nBureau `n"+$ExitCode["$BurExitCode"]+" `n`nZip vers voltaire `n"+$ExitCode["$MailZipExitCode"]+" `n`nBureau vers voltaire `n"+$ExitCode["$BurVolExitCode"]+" `n`nDocuments vers voltaire `n"+$ExitCode["$DocVolExitCode"]+"`n`Pour de plus amples détails, consultez le fichier log en pièce jointe."
}
If (!(Test-Path "$SavDocLoglocal")){
$SavDocLoglocal = $null
}
If (!(Test-Path "$SavDocVolLog")){
$SavDocVolLog = $null
}
# Message aux utilisateurs
Send-Email $mailfrom $Toclient $toSupport 'High' $messagecourriel $body $SavDocLoglocal $SavDocVolLog $SmtpServerName
# TODO:verifier le lancement de la commande mail
# INDICATEURS :
# ------------
#
Set-indicator($indicateurs)
}
{
Exit
}
}