# encoding: ascii
# api: powershell
# title: Windows Server Backup
# description: Windows Server Backup Script. Backs up to NAS location, include facility for rotation and email notification
# version: 3.0
# type: script
# author: James Day
# license: CC0
# x-poshcode-id: 4587
# x-archived: 2014-11-15T21:27:41
# x-published: 2014-11-06T11:19:00
#
#
<#
Author: James Day
Created: 31st October 2013

Original script source taken from http://gallery.technet.microsoft.com/scriptcenter/WSB-Backup-network-email-9793e315
Full Credit goes to the Original author Augagneur Alexandre. Without your initial script I wouldn't have got this far.

Tested on Server 2012 using Powershell version 3.0

USE AT YOUR OWN RISK.
#>
#Initialize WSB cmdlets
Import-Module WindowsServerBackup
 
#------------------------------------------------------------------ 
#Variables 
#------------------------------------------------------------------  
 
#Files server 
$Nas = "\\NAS" 
 
#Root folder 
$HomeBkpDir = ($Nas+"\BACKUP") 
 
#Backup folder 
$Filename = Get-Date -Format yyyy-MM-dd_hhmmss
 
#Number of backup to retain (value "0" disable rotation) 
$MaxBackup = 2
 
#List uncritical volumes 
$Volumes = Get-WBVolume -AllVolumes | Where-Object { $_.Property -notlike "Critical*" } 
  
#------------------------------------------------------------------  
#Function to compare the number of folders to retain with 
#$MaxBackup (Not called if $MaxBackup equals 0) 
#------------------------------------------------------------------  
function Rotation() 
{  
 #List all backup folders 
 $Backups = @(Get-ChildItem -Path $HomeBkpDir | Sort-Object -property Name) 
 
 #Number of backups folders 
 $NbrBackups = $Backups.count 
 
 $i = 0 
  
 #Delete oldest backup folders 
 while ($NbrBackups -ge $MaxBackup) 
 { 
  #The orignal script included the -force switch when calling remove-item but this gave me errors YMMV
  $($Backups[$i].fullname) | Remove-Item -Recurse
  $NbrBackups -= 1 
  $i++ 
 } 
} 
  
#------------------------------------------------------------------ 
#Function to send email notification 
#------------------------------------------------------------------  
function EmailNotification() 
{ 
 Start-Sleep -Seconds 120
 #Sender email 
 $from = "backup@example.com" 
 
 #Receipt email 
 $to = "postmaster@example.com" 
 
 #SMTP Server 
 $smtpserver = "server" 
  
 #Mail subject 
 $Subject = $env:computername+": Backup report of "+(Get-Date) 
  
 #Prepare Mail content
 $report = get-wbjob -previous 1 
 $success = $report.SuccessLogPath
 $Failure = $report.FailureLogPath
 $body = "Success and Failure logs are attached" 

 #Sends the message 
 Send-MailMessage -to $to -from $from  -subject $Subject -body $body -attachments $success,$failure -smtpserver $smtpserver
} 
 
#------------------------------------------------------------------ 
#Main 
#------------------------------------------------------------------  
 
#Execute rotation if enabled 
if ($MaxBackup -ne 0) 
{ 
 Rotation 
} 
  
#Backup folder creation 
New-Item ($HomeBkpDir+"\"+$Filename)  -Type Directory | Out-Null 
  
$WBPolicy = New-WBPolicy 
  
#Enable BareMetal functionnality (system state included) 
Add-WBBareMetalRecovery -Policy $WBPolicy | Out-Null 
  
#Add backup target 
$BackupLocation = New-WBBackupTarget -network ($HomeBkpDir+"\"+$Filename) 
Add-WBBackupTarget -Policy $WBPolicy -Target $BackupLocation -force | Out-Null 
  
#Add uncritical volumes 
if ($Volumes -ne $null) 
{ 
 Add-WBVolume -Policy $WBPolicy -Volume $Volumes | Out-null 
} 
#Make this a full VSS backup as opposed to a copy backup. This will truncate Exchange logs etc...
Set-WBVssBackupOptions -policy $WBPolicy -vssfullbackup | Out-null

#Displays the backup settings prior to running the job.
$WBPolicy

#Runs the backup task.
Start-WBBackup -Policy $WBPolicy 
  
#Call email notification function 
EmailNotification
