
There is a new release of my “Check Last Backup” SCDPM Script. I have done some modification on the Code and added some new Features.
Skip HyperV now reports the span Days, so you can see if there is a Problem.
The query for running Job now ignores Tape Jobs.
And we now create a Summary Report and you will be able to send this via mail.
Hope you like the new Script, here is the Code, at the End is the Link to TechNet Gallery Download. Please rate and comment for new Features.
The Script
########################################################
# Name: CheckLastBackups.ps1
# Creator: Michael Seidl aka Techguy
# CreationDate: 27.06.2014
# LastModified: 19.01.2016
# Version: 1.3
# Doc: https://www.techguy.at/tag/checklastbackups/
#
# Description: Get all Disk Datasources from your
# DPM Server and compare the last Recoverypoint with your
# configured SpanDays. So you can controll if your
# Datasources are up do date
#
# Variables
# SpanDays: How many Days in the past from Today your
# Datasources should have a valid Recoverypoint
# Checkonly: will only Log the Result, would not start
# a recoveryPoint creation
#
# Version 1.3 - NEW: Query for running Job skip TapeJobs
# NEW: Skip HyperV still reports
# NEW: Summary Report
#
# Version 1.2 - NEW: Skip HyperV
#
# Version 1.1 - NEW: Parameters added
# NEW: Log can be sent via Email
# NEW: Run a Checkonly mode
# NEW: Check if there is already a Job for affected Datasource
#
#
# Version 1.0 - RTM
########################################################
#
# www.techguy.at
# www.facebook.com/TechguyAT
# www.twitter.com/TechguyAT
# michael@techguy.at
########################################################
#Parameter
Param(
[Parameter(Mandatory=$false)][string]$DPMServerName,
[Parameter(Mandatory=$false)][string]$Spandays,
[Parameter(Mandatory=$false)][switch]$Checkonly,
[Parameter(Mandatory=$false)][switch]$SkipHyperV,
[Parameter(Mandatory=$false)][switch]$LogPublic,
[Parameter(Mandatory=$false)][switch]$SendLogFile,
[Parameter(Mandatory=$false)][string]$SMTPServer,
[Parameter(Mandatory=$false)][string]$SMTPSender,
[Parameter(Mandatory=$false)][string]$SMTPTo
)
#Import Modules
Import-Module dataprotectionmanager
#Testing
$LogPublic=$true
#$Checkonly=$true
$SkipHyperV=$true
#$SendLogFile=$True
#$SMTPServer="ExchangeServer01"
#$SMTPSender="DPM_Alerts@techguy.at"
#$SMTPTo="michael@techguy.at"
#Standard Parameters if empty
if (!($DPMServerName)){$DPMServerName=$env:COMPUTERNAME}
if (!($Spandays)){$Spandays="5"}
$Log=@()
#Counter
$DS_ALL=0
$DS_OK=0
$DS_ERROR=0
$DS_HEAL=0
$DS_SKIPHyperV=0
Get-Datasource -DPMServerName $DPMServerName | Out-Null
$DS=Get-Datasource -DPMServerName $DPMServerName | where {$_.CurrentProtectionState -eq "Protected"}
$Date=Get-Date -format d ((Get-Date).adddays(-$Spandays))
$Footer="
`r`n
`r`n
Script powered by www.techguy.at
Find more Information at https://www.techguy.at/tag/checklastbackups/
"
#Functions
Function Write-Log ($Text) {
# Write Log to PS if $LogPublic is Yes
if ($LogPublic) {
if ($Text -match "INFO:") {
Write-Host $Text -ForegroundColor Green
} elseif ($Text -match "WARNING:") {
Write-Host $Text -ForegroundColor Yellow
} elseif ($Text -match "ERROR:") {
Write-Host $Text -ForegroundColor Red
} else {
Write-Host $Text
}
}
return $Text
}
Function Query-DSJobs ($DS) {
# Query DS if there is an active Job
if ((Get-DPMJob -Datasource $DS -Status InProgress | where {$_.JobCategory -notlike "ArchiveFromSC"}).count -ne 0) {
$Log+=Write-Log "WARNING: There is a running Job for DS: $DS.Name"
return $False
} else {
$Log+=Write-Log "INFO: No running Jobs for DS: $DS.Name"
return $True
}
}
#Magic
Foreach ($Entry in $DS)
{
$DS_ALL++
$HyperVState=$true
if ($Entry.ObjectType -eq "Microsoft Hyper-V" -and $SkipHyperV){$HyperVState=$false; $Log+=Write-Log "Warning: Skip HyperV $Entry"; $DS_SKIPHyperV++}
$RP=Get-RecoveryPoint -Datasource $Entry | Sort-Object BackupTime -Descending
if ($RP.count -gt 0)
{
$CompareDate=Get-date($RP[0].BackupTime) -format d
$Span=New-TimeSpan -Start $CompareDate -End $Date
if ($Span.Days -gt 0) {
$Log+=Write-Log "Error: $CompareDate, $Date, $Entry"
$DS_ERROR++
if ($Entry.State -eq "Invalid")
{
if (!($Checkonly) -and ($HyperVState))
{
if (Query-DSJobs $Entry)
{
Start-DPMDatasourceConsistencyCheck -Datasource $Entry
$DS_HEAL++
}
}
}
else
{
if (!($Checkonly) -and ($HyperVState))
{
if (Query-DSJobs $Entry)
{
New-RecoveryPoint -Datasource $Entry -Disk -BackupType expressfull –WithDataIntegrityCheck -Verbose
$DS_HEAL++
}
}
}
}
else
{
$Log+=Write-Log "Info: $CompareDate, $Date, $Entry"
$DS_OK++
}
}
elseif ($RP.count -eq 0)
{
$Log+=Write-Log "Error: no Recoverpoint $Entry"
if (!($Checkonly) -and ($HyperVState))
{
if (Query-DSJobs $Entry)
{
Start-DPMDatasourceConsistencyCheck -Datasource $Entry
$DS_HEAL++
}
}
}
}
if ($SendLogfile)
{
$StatusReport="
`r`n
`r`n
Checked Datasources: $DS_all
Datasources OK: $DS_OK
Datasources with Error: $DS_ERROR
Datasources healed: $DS_HEAL
Datasources skiped on HyperV: $DS_SKIPHyperV
"
$Mailtext=$Log -join "`r`n"
$Mailtext=$Mailtext+ $StatusReport +$Footer
Send-MailMessage -From $SMTPSender -SmtpServer $SMTPServer -To $SMTPTo -Subject "RP Status from $DPMServerName" -Body $Mailtext
}
$Mailtext
Some Screenshots
TechNet Gallery Download
You can download this Script at the TechNet Gallery: https://gallery.technet.microsoft.com/Check-DPM-for-last-96f12c86
Let me know if you have some Questions.
All my other TechNet Gallery Downloads are here: http://bit.ly/1jrYQoA
PLEASE RATE MY DOWNLOADS AND LET ME KNOW ABOUT YOUR IDEAS FOR THE NEXT VERSION.
Michael Seidl aka Techguy



For some reason, the script seems to bypass “System Protection” (System State, Bare Metal Recovery).