Last active
May 11, 2023 22:05
-
-
Save theagreeablecow/3682559 to your computer and use it in GitHub Desktop.
SAMReport for Veeam
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
############################################################################################################ | |
# Module Variables - Veeam # | |
#-------------------------------# | |
# Customise report Variables | |
$EmailTo = $EmailTo | |
$EmailSubject = $EmailSubject | |
$ReportTitle = $ReportTitle | |
$ReportSubTitle = $ReportSubTitle | |
# Load required plug-ins | |
if ( (Get-PSSnapin -Name VeeamPSSnapIn -ErrorAction SilentlyContinue) -eq $null ) { | |
Add-PsSnapin -Name VeeamPSSnapIn | |
} | |
if ( (Get-PSSnapin -Name VMware.VimAutomation.Core -ErrorAction SilentlyContinue) -eq $null ) { | |
Add-PsSnapin -Name VMware.VimAutomation.Core | |
} | |
# Load server and array information | |
$Servers = ($env:COMPUTERNAME) | |
$VMware_Server = "vcenter.mydomain.com.au" | |
$Proxies = @("vbrproxy1","vbrproxy2","vbrproxy7","vbrproxy8") | |
$ServiceArray = @("VeeamBackupService.exe","Veeam Backup Catalog Data Service","VeeamTransportSvc","Veeam Backup and Replication Service","VeeamDeploymentService","VeeamNFSSvc") | |
$ProxyServiceArray = @("VeeamTransportSvc","VeeamDeploymentService") | |
$Jobs = Get-VBRJob | |
$BackupList = Get-VBRBackupRepository | |
<# | |
$OU = "OU=MyServers,DC=mydomain,DC=com,DC=au" | |
$Servers = Get-ADComputer -Filter {OperatingSystem -Like "Windows *Server*"} -SearchBase $OU | Select-Object –ExpandProperty Name | |
$Servers = @("Server1","Server2","Server3") | |
$Servers = Get-Content .\<path>\servers.txt | |
$Servers = ($env:COMPUTERNAME) | |
#> | |
#Miscellaneous |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
############################################################################################################ | |
# Info # | |
#------------------------ | |
$Title = "Job Status Summary" | |
$Comment = "The following is a summary of the most recent session for all jobs." | |
$Author = "The Agreeable Cow" | |
$PluginDate = "August 2012" | |
$Version = "v1.0" | |
# 1.0 16/08/2012 The Agreeable Cow Original Build | |
############################################################################################################ | |
# Main Script # | |
#------------------------ | |
# Get Job Status | |
foreach($Job in $Jobs) | |
{ | |
$Session = $Job.FindLastSession() | |
if(!$Session){continue;} | |
$Info = $Session.GetTaskSessions() | |
foreach ($VM in $info) { | |
$JobsTotal += $JobsTotal.count + 1 | |
$Status = $VM.status | |
if ($Status -eq "Success"){ | |
$JobsSuccess += $JobsSuccess.count + 1 | |
} | |
if ($Status -eq "InProgress" -or $Status -eq "Pending"){ | |
$JobsPending += $JobsPending.count + 1 | |
} | |
if ($Status -eq "Warning"){ | |
$JobsWarning += $JobsWarning.count + 1 | |
} | |
if ($Status -eq "Failed"){ | |
$JobsFailed += $JobsFailed.count + 1 | |
} | |
} | |
} | |
# Status Count and formatting | |
$JobsCount = $JobsSuccess + $JobsPending + $JobsWarning + $JobsFailed | |
$JobsUnknown = $JobsTotal - $JobsCount | |
if ($JobsSuccess -eq $NULL){$JobsSuccess = "0"} | |
if ($JobsPending -eq $NULL){$JobsPending = "0"} | |
if ($JobsWarning -eq $NULL){$JobsWarning = "0"} | |
if ($JobsFailed -eq $NULL){$JobsFailed = "0"} | |
if ($JobsUnknown -eq $NULL){$JobsUnknown = "0"} | |
$ResultsText = "Total Jobs: " + $JobsTotal + "</br>" + "Success: " + $JobsSuccess + "</br>" + "Pending: " + $JobsPending + "</br>" + "Warning: " + $JobsWarning + "</br>" + "Failed: " + $JobsFailed + "</br>" + "Unknown: " + $JobsUnknown | |
# Results Alert | |
if ($JobsFailed -ge 1 -OR $JobsUnknown -ge 1){ | |
$ResultsAlert = "Alert" | |
} | |
elseif ($JobsPending -ge 1 -OR $JobsPending -ge 1){ | |
$ResultsAlert = "Warning" | |
} | |
else{ | |
$ResultsAlert = "Good" | |
} | |
############################################################################################################ | |
# Output # | |
#------------------------ | |
$OutText = $ResultsText # $OutText MUST be either $ResultsText or "" Valid $ResultsText is any text string | |
$OutData = "" # $OutData MUST be either $ResultsData or "" Valid $ResultsData is any data array | |
$OutAlert = $ResultsAlert # $OutAlert MUST be either $ResultsAlert or "" Valid $ResultsAlert are 'Good', 'Warning' or 'Alert' | |
$Attachment = "" # $Attachment MUST be either UNC path or "" | |
#Export-ModuleMember |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
############################################################################################################ | |
# Info # | |
#------------------------ | |
$Title = "Job Status Details" | |
$Comment = "The following is a detailed report of the most recent session for all jobs." | |
$Author = "The Agreeable Cow" | |
$PluginDate = "August 2012" | |
$Version = "v1.0" | |
# 1.0 16/08/2012 The Agreeable Cow Original Build | |
############################################################################################################ | |
# Main Script # | |
#------------------------ | |
$WarningAge = 1 # warning highlight for days since last backup | |
$MaxAge = 7 # error highlight for days since last backup | |
$ResultsData = @() | |
foreach($Job in $Jobs) { | |
$Session = $Job.FindLastSession() | |
if(!$Session){continue;} | |
$Info = $Session.GetTaskSessions() | |
foreach ($VM in $info) { | |
# Get Array Data | |
$JobName = $job.Name | |
$Name = $VM.Name | |
$Type = $job.jobtype | |
$Status = $VM.status | |
$Progress = $VM.Progress.DisplayName | |
$Size = [Math]::Round([Decimal]$VM.Progress.ProcessedSize/1GB,2) | |
$Start = $VM.progress.starttime | |
$Finish = $VM.progress.stoptime | |
$Duration = '{0:00}:{1:00}:{2:00}' -f ($VM.progress.duration | % {$_.Hours, $_.Minutes, $_.Seconds}) | |
$schedule = $job.GetScheduleOptions() | |
$NextRun = $schedule.NextRun | |
$Age = ((Get-Date) - $Finish).Days | |
if ($Status -eq "Success"){ | |
if ($age -gt $MaxAge) { | |
$age = "!RED!" + $age | |
$AgeAlert += $AgeAlert.count + 1 | |
} | |
if ($age -ge $WarningAge) { | |
$age = "!ORANGE!" + $age | |
$AgeWarning += $AgeWarning.count + 1 | |
} | |
if ($age -lt $WarningAge) { | |
$age = "!GREEN!" + $age | |
$AgeGood += $AgeGood.count + 1 | |
} | |
} | |
else{ | |
$age = "" | |
} | |
$Message = $VM.GetDetails() | |
# Status Count | |
if ($Status -eq "Success"){ | |
$JobsSuccess += $JobsSuccess.count + 1 | |
} | |
if ($Status -eq "InProgress" -or $Status -eq "Pending"){ | |
$JobsPending += $JobsPending.count + 1 | |
} | |
if ($Status -eq "Warning"){ | |
$JobsWarning += $JobsWarning.count + 1 | |
} | |
if ($Status -eq "Failed"){ | |
$JobsFailed += $JobsFailed.count + 1 | |
} | |
#Load Array | |
$obj = New-Object PSobject | |
$obj | Add-Member -MemberType NoteProperty -name "Job Name" -value $JobName | |
$obj | Add-Member -MemberType NoteProperty -name Type -value $Type | |
$obj | Add-Member -MemberType NoteProperty -name Name -value $Name | |
$obj | Add-Member -MemberType NoteProperty -name Status -value $Status | |
$obj | Add-Member -MemberType NoteProperty -name "Size Gb" -value $Size | |
$obj | Add-Member -MemberType NoteProperty -name Start -value $Start | |
$obj | Add-Member -MemberType NoteProperty -name Finish -value $Finish | |
$obj | Add-Member -MemberType NoteProperty -name Duration -value $Duration | |
$obj | Add-Member -MemberType NoteProperty -name Age -value $Age | |
$obj | Add-Member -MemberType NoteProperty -name NextRun -value $NextRun | |
$obj | Add-Member -MemberType NoteProperty -name Message -value $Message | |
$ResultsData += $obj | |
} | |
} | |
$ResultsData = $ResultsData | sort -Property "Job Name" | |
# Results Alert | |
if ($JobsFailed -ge 1 -OR $JobsUnknown -ge 1 -OR $AgeAlert -ge 1){ | |
$ResultsAlert = "Alert" | |
} | |
elseif ($JobsPending -ge 1 -OR $JobsPending -ge 1 -OR $AgeWarning){ | |
$ResultsAlert = "Warning" | |
} | |
else{ | |
$ResultsAlert = "Good" | |
} | |
############################################################################################################ | |
# Output # | |
#------------------------ | |
$OutText = "" # $OutText MUST be either $ResultsText or "" Valid $ResultsText is any text string | |
$OutData = $ResultsData # $OutData MUST be either $ResultsData or "" Valid $ResultsData is any data array | |
$OutAlert = $ResultsAlert # $OutAlert MUST be either $ResultsAlert or "" Valid $ResultsAlert are 'Good', 'Warning' or 'Alert' | |
$Attachment = "" # $Attachment MUST be either UNC path or "" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
############################################################################################################ | |
# Info # | |
#------------------------ | |
$Title = "Backup Storage Status" | |
$Comment = "The following shows storage data and any alerts for Veeam Backup repositories" | |
$Author = "The Agreeable Cow" | |
$PluginDate = "August 2012" | |
$Version = "v1.0" | |
# 1.0 16/08/2012 The Agreeable Cow Original Build | |
############################################################################################################ | |
# Main Script # | |
#------------------------ | |
$BackupDiskWarning = 10 # Warning highlight for % free disk space | |
$BackupDiskAlert = 5 # Alert highlight for % free disk space | |
# Get Backup data | |
$ResultsData = $BackupList | Get-vPCRepoInfo | Select @{Name="Repository Name"; Expression = {$_.Target}}, @{Name="Path"; Expression = {$_.Storepath}}, | |
@{Name="Free (GB)"; Expression = {$_.StorageFree}}, @{Name="Total (GB)"; Expression = {$_.StorageTotal}}, @{Name="Free (%)"; Expression = {$_.FreePercentage}} | |
# Get Low Disk Space Alerts | |
foreach ($r in $BackupList) { | |
if ($r.Type -eq "WinLocal") { | |
$Server = $r.GetHost() | |
$FileCommander = [Veeam.Backup.Core.CRemoteWinFileCommander]::Create($Server.Info) | |
$storage = $FileCommander.GetDrives([ref]$null) | ?{$_.Name -eq $r.Path.Substring(0,3)} | |
$RepoFree = $storage.FreeSpace | |
$RepoTotal = $storage.TotalSpace | |
} | |
elseif ($r.Type -eq "LinuxLocal") { | |
$Server = $r.GetHost() | |
$FileCommander = new-object Veeam.Backup.Core.CSshFileCommander $server.info | |
$storage = $FileCommander.FindDirInfo($r.Path) | |
$RepoFree = $storage.FreeSpace | |
$RepoTotal = $storage.TotalSize | |
} | |
elseif ($r.Type -eq "CifsShare") { | |
$fso = New-Object -Com Scripting.FileSystemObject | |
$storage = $fso.GetDrive($r.Path) | |
$RepoFree = $storage.AvailableSpace | |
$RepoTotal = $storage.TotalSize | |
} | |
$RepoType = $r.Type | |
$RepoName = $r.Name | |
$RepoPath = $r.Path | |
$RepoFree = [Math]::Round([Decimal]$RepoFree/1GB,2) | |
$RepoTotal = [Math]::Round([Decimal]$RepoTotal/1GB,2) | |
$RepoFreePercent = [Math]::Round(($RepoFree/$RepoTotal)*100) | |
if ($RepoFreePercent -le $BackupDiskAlert) { | |
$ResultsText += "<span style='color:red'>Alert! Extremely low disk space for " + $RepoPath + " (" + $RepoFree + "Gb left of " + $RepoTotal + "Gb) </br></span>" | |
$BackupAlert += $BackupAlert.count + 1 | |
} | |
elseif ($RepoFreePercent -le $BackupDiskWarning) { | |
$ResultsText += "<span style='color:orange'>Warning! Low disk space for " + $RepoPath + " (" + $RepoFree + "Gb left of " + $RepoTotal + "Gb) </br></span>" | |
$BackupWarning += $BackupWarning.count + 1 | |
} | |
} | |
# Results Alert | |
if ($BackupAlert -ge 1){ | |
$ResultsAlert = "Alert" | |
} | |
elseif ($BackupWarning -ge 1){ | |
$ResultsAlert = "Warning" | |
} | |
else{ | |
$ResultsAlert = "Good" | |
} | |
############################################################################################################ | |
# Output # | |
#------------------------ | |
$OutText = $ResultsText # $OutText MUST be either $ResultsText or "" Valid $ResultsText is any text string | |
$OutData = $ResultsData # $OutData MUST be either $ResultsData or "" Valid $ResultsData is any data array | |
$OutAlert = $ResultsAlert # $OutAlert MUST be either $ResultsAlert or "" Valid $ResultsAlert are 'Good', 'Warning' or 'Alert' | |
$Attachment = "" # $Attachment MUST be either UNC path or "" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
############################################################################################################ | |
# Info # | |
#------------------------ | |
$Title = "Replica Storage Status" | |
$Comment = "The following shows storage data and any alerts for Veeam Replica repositories" | |
$Author = "The Agreeable Cow" | |
$PluginDate = "August 2012" | |
$Version = "v1.0" | |
# 1.0 16/08/2012 The Agreeable Cow Original Build | |
############################################################################################################ | |
# Main Script # | |
#------------------------ | |
$ReplicaDiskWarning = 10 # Warning highlight for % free disk space | |
$ReplicaDiskAlert = 5 # Alert highlight for % free disk space | |
#Replica Storage Info | |
$repList = Get-VBRJob | ?{$_.IsReplica} | |
#Low Disk Space Alerts | |
foreach ($replica in $repList) { | |
$repHost = $replica.GetTargetHost() | |
$ds = $repHost | Find-VBRDatastore -Name $replica.ViReplicaTargetOptions.DatastoreName | |
$Target = $repHost.Name | |
$Datastore = $replica.ViReplicaTargetOptions.DatastoreName | |
$StorageFree = [Math]::Round([Decimal]$ds.FreeSpace/1GB,2) | |
$StorageTotal = [Math]::Round([Decimal]$ds.Capacity/1GB,2) | |
$FreePercent = [Math]::Round(($ds.FreeSpace/$ds.Capacity)*100) | |
if ($FreePercent -le $ReplicaDiskAlert) { | |
$ResultsText += "<span style='color:red'>Alert! Extremely low disk space for " + $Datastore + " (" + $StorageFree + "Gb left of " + $StorageTotal + "Gb) </br></span>" | |
$ReplicaAlert += $ReplicaAlert.count + 1 | |
} | |
elseif ($FreePercent -le $ReplicaDiskWarning) { | |
$ResultsText += "<span style='color:orange'>Warning! Low disk space for " + $Datastore + " (" + $StorageFree + "Gb left of " + $StorageTotal + "Gb) </br></span>" | |
$ReplicaWarning += $ReplicaWarning.count + 1 | |
} | |
} | |
#Replica Data | |
$ResultsData = $repList | Get-vPCReplicaTarget | Select @{Name="Replica Target"; Expression = {$_.Target}}, Datastore, @{Name="Free (GB)"; Expression = {$_.StorageFree}}, | |
@{Name="Total (GB)"; Expression = {$_.StorageTotal}}, @{Name="Free (%)"; Expression = {$_.FreePercentage}} | |
# Results Alert | |
if ($ReplicaAlert -ge 1){ | |
$ResultsAlert = "Alert" | |
} | |
elseif ($ReplicaWarning -ge 1){ | |
$ResultsAlert = "Warning" | |
} | |
else{ | |
$ResultsAlert = "Good" | |
} | |
############################################################################################################ | |
# Output # | |
#------------------------ | |
$OutText = $ResultsText # $OutText MUST be either $ResultsText or "" Valid $ResultsText is any text string | |
$OutData = $ResultsData # $OutData MUST be either $ResultsData or "" Valid $ResultsData is any data array | |
$OutAlert = $ResultsAlert # $OutAlert MUST be either $ResultsAlert or "" Valid $ResultsAlert are 'Good', 'Warning' or 'Alert' | |
$Attachment = "" # $Attachment MUST be either UNC path or "" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
############################################################################################################ | |
# Info # | |
#------------------------ | |
$Title = "Unprotected Machines" | |
$Comment = "Backup status of VMs in vCenter" | |
$Author = "The Agreeable Cow" | |
$PluginDate = "August 2012" | |
$Version = "v1.0" | |
# 1.0 20/08/2012 The Agreeable Cow Original Build | |
# 0.0 3/7/2012 tSightler Original scripts (http://sightunseen.org/blog/?p=1) | |
############################################################################################################ | |
# Main Script # | |
#------------------------ | |
$PoweredOnVMsOnly = "Y" # Change to "N" to include powered off VMs (eg Replicas and Templates) | |
$ExcludeVMs=@("Server1","Server2") # Specifically exclude more VMs eg ("vm1","vm2") | |
$AgeAlert = 7 # Alert on machines older than this many days | |
$ResultsData=@() | |
# Connect to vCenter | |
Set-PowerCLIConfiguration -InvalidCertificateAction Ignore -Confirm:$false | out-null | |
Connect-ViServer $VMware_Server | out-null | |
# Build hash table with excluded VMs | |
$excludedvms=@{} | |
foreach ($vm in $excludevms) { | |
$excludedvms.Add($vm, "Excluded") | |
} | |
# Get a list of all VMs from vCenter and add to hash table, assume Unprotected | |
$vms=@{} | |
foreach ($vm in (Get-VM | Where-Object {$_.PowerState -eq "PoweredOn"} | ForEach-Object {$_ | Select-object @{Name="VMname";Expression={$_.Name}}})) { | |
if (!$excludedvms.ContainsKey($vm.VMname)) { | |
$vms.Add($vm.VMname, "Unprotected") | |
} | |
} | |
# Find all backup job sessions that have ended in the last week | |
$vbrsessions = Get-VBRBackupSession | Where-Object {$_.JobType -eq "Backup" -or $_.JobType -eq "Replica" -and $_.EndTime -ge (Get-Date).adddays(-$AgeAlert)} | |
# Find all successfully backed up VMs in selected sessions (i.e. VMs not ending in failure) and update status to "Protected" | |
$backedupvms=@{} | |
foreach ($session in $vbrsessions) { | |
foreach ($vm in ($session.gettasksessions() | Where-Object {$_.Status -ne "Failed"} | ForEach-Object { $_ | Select-object @{Name="VMname";Expression={$_.Name}}})) { | |
if($vms.ContainsKey($vm.VMname)) { | |
$vms[$vm.VMname]="Protected" | |
} | |
} | |
} | |
# Output VMs in color coded format based on status. | |
$ResultsText = "All VMs matching your criteria have been backed up in the past " + $AgeAlert + " Day(s)" | |
$ResultsAlert = "Good" | |
foreach ($vm in $vms.Keys){ | |
if ($vms[$vm] -ne "Protected") { | |
$obj = New-Object PSobject | |
$obj | Add-Member -MemberType NoteProperty -name "Server" -value $vm | |
$ResultsData += $obj | |
$ResultsText = "The following machines have not been backed up in the past " + $AgeAlert + " Day(s)" | |
$ResultsAlert = "Alert" | |
} | |
} | |
############################################################################################################ | |
# Output # | |
#------------------------ | |
$OutText = $ResultsText # $OutText MUST be either $ResultsText or "" Valid $ResultsText is any text string | |
$OutData = $ResultsData # $OutData MUST be either $ResultsData or "" Valid $ResultsData is any data array | |
$OutAlert = $ResultsAlert # $OutAlert MUST be either $ResultsAlert or "" Valid $ResultsAlert are 'Good', 'Warning' or 'Alert' | |
$Attachment = "" # $Attachment MUST be either UNC path or "" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
############################################################################################################ | |
# Info # | |
#------------------------ | |
$Title = "Services Status" | |
$Comment = "Current Status of all Veeam Services" | |
$Author = "The Agreeable Cow" | |
$PluginDate = "August 2012" | |
$Version = "v1.0" | |
# 1.0 17/08/2012 The Agreeable Cow Original Build | |
############################################################################################################ | |
# Main Script # | |
#------------------------ | |
$ServerData = @() | |
$ProxyData = @() | |
$ResultsData = @() | |
foreach ($Server in $Servers){ | |
foreach ($Service in $ServiceArray){ | |
#CheckService $Server $Service | |
$GetService = Get-Service -computername $Server -Name $Service | |
if ($GetService.Status -ne “Running”){ | |
$ServerText += "<span style='color:red'>" + $GetService.displayname + " is not running on " + $Server + ". Please check Veeam Services! </br></span>" | |
$ServiceAlert += $ServiceAlert.count + 1 | |
} | |
$obj = New-Object PSobject | |
$obj | Add-Member -MemberType NoteProperty -name "Server" -value $Server | |
$obj | Add-Member -MemberType NoteProperty -name "Status" -value $GetService.status | |
$obj | Add-Member -MemberType NoteProperty -name "Service" -value $GetService.displayname | |
$ServerData += $obj | |
} | |
} | |
foreach ($Server in $Proxies){ | |
foreach ($Service in $ProxyServiceArray){ | |
$GetService = Get-Service -computername $Server -Name $Service | |
if ($GetService.Status -ne “Running”){ | |
$ProxyText += "<span style='color:red'>" + $GetService.displayname + " is not running on " + $Server + ". Please check Veeam Services! </br></span>" | |
$ServiceAlert += $ServiceAlert.count + 1 | |
} | |
$obj = New-Object PSobject | |
$obj | Add-Member -MemberType NoteProperty -name "Server" -value $Server | |
$obj | Add-Member -MemberType NoteProperty -name "Status" -value $GetService.status | |
$obj | Add-Member -MemberType NoteProperty -name "Service" -value $GetService.displayname | |
$ProxyData += $obj | |
} | |
} | |
# Collate Results | |
$ResultsText = $ServerText + $ProxyText | |
$ResultsData = $ServerData + $ProxyData | |
$ResultsData = $ResultsData | sort -Property "Server" | |
# Results Alert | |
if ($ServiceAlert -ge 1){ | |
$ResultsAlert = "Alert" | |
} | |
else{ | |
$ResultsAlert = "Good" | |
} | |
############################################################################################################ | |
# Output # | |
#------------------------ | |
$OutText = $ResultsText # $OutText MUST be either $ResultsText or "" Valid $ResultsText is any text string | |
$OutData = $ResultsData # $OutData MUST be either $ResultsData or "" Valid $ResultsData is any data array | |
$OutAlert = $ResultsAlert # $OutAlert MUST be either $ResultsAlert or "" Valid $ResultsAlert are 'Good', 'Warning' or 'Alert' | |
$Attachment = "" # $Attachment MUST be either UNC path or "" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
############################################################################################################ | |
# Info # | |
#------------------------ | |
$Title = "License Check" | |
$Comment = "Information regarding Veeam Licensing" | |
$Author = "The Agreeable Cow" | |
$PluginDate = "27/08/2012" | |
$Version = "v1.0" | |
# 1.0 01/01/2013 The Agreeable Cow Original Build | |
# 0.0 29/12/2011 Arne Fokkema Script Source http://ict-freak.nl/2011/12/29/powershell-veeam-br-get-total-days-before-the-license-expires/ | |
############################################################################################################ | |
# Main Script # | |
#------------------------ | |
$WarningDays = 60 # Number of days before license expires to flag a warning | |
$AlertDays = 30 # Number of days before license expires to flag an alert | |
#Get version and Licenses Info | |
$VeeamVersion = Get-VeeamVersion | |
$regBinary = (Get-Item 'HKLM:\SOFTWARE\VeeaM\Veeam Backup and Replication\license').GetValue('Lic1') | |
$veeamLicInfo = [string]::Join($null, ($regBinary | % { [char][int]$_; })) | |
if($VeeamVersion -like "6*"){ | |
$pattern = "Expiration date\=\d{1,2}\/\d{1,2}\/\d{1,4}" | |
} | |
elseif($VeeamVersion -like "5*"){ | |
$pattern = "EXPIRATION DATE\=\d{1,2}\/\d{1,2}\/\d{1,4}" | |
} | |
# Convert Binary key | |
if($VeeamVersion -like "5*" -OR $VeeamVersion -like "6*"){ | |
$expirationDate = [regex]::matches($VeeamLicInfo, $pattern)[0].Value.Split("=")[1] | |
$totalDaysLeft = ((Get-Date $expirationDate) - (get-date)).Totaldays.toString().split(",")[0] | |
$totalDaysLeft = [int]$totalDaysLeft | |
if($totalDaysLeft -lt $AlertDays){ | |
$ResultsText = "Alert: The Veeam License will expire in $($totalDaysLeft) days" | |
$ResultsAlert = "Alert" | |
} | |
elseif($totalDaysLeft -lt $WarningDays){ | |
$ResultsText = "Warning: The Veeam License will expire in $($totalDaysLeft) days" | |
$ResultsAlert = "Warning" | |
} | |
else{ | |
$ResultsText = "The Veeam License will expire in $($totalDaysLeft) days" | |
$ResultsAlert = "Good" | |
} | |
} | |
else{ | |
$ResultsText = "Warning: Unable to process Veeam version" | |
$ResultsAlert = "Warning" | |
} | |
############################################################################################################ | |
# Output # | |
#------------------------ | |
$OutText = $ResultsText # $OutText MUST be either $ResultsText or "" Valid $ResultsText is any text string | |
$OutData = "" # $OutData MUST be either $ResultsData or "" Valid $ResultsData is any data array | |
$OutAlert = $ResultsAlert # $OutAlert MUST be either $ResultsAlert or "" Valid $ResultsAlert are 'Good', 'Warning' or 'Alert' | |
$Attachment = "" # $Attachment MUST be either UNC path or "" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
############################################################################################################ | |
# Info # | |
#------------------------ | |
$Title = "Event Logs" | |
$Comment = "Event Log entries that match your criteria" | |
$Author = "The Agreeable Cow" | |
$PluginDate = "1/9/2012" | |
$Version = "v1.0" | |
# 1.0 01/9/2012 The Agreeable Cow Original Build | |
############################################################################################################ | |
# Main Script # | |
#------------------------ | |
#Create an Array and run query | |
$ResultsData = @() | |
$AlertData = @() | |
$WarningData = @() | |
$AllServers = $Servers + $Proxies | |
foreach ($Server in $AllServers){ | |
#Customise an ALERT query via Event Viewer > Create Custom View > Copy query string from XML tab | |
$AlertXML = '<QueryList> | |
<Query Id="0" Path="System"> | |
<Select Path="System">*[System[(Level=1 or Level=2) and TimeCreated[timediff(@SystemTime) <= 86400000]]]</Select> | |
<Select Path="HardwareEvents">*[System[(Level=1 or Level=2) and TimeCreated[timediff(@SystemTime) <= 86400000]]]</Select> | |
<Select Path="Veeam Backup">*[System[(Level=1 or Level=2) and TimeCreated[timediff(@SystemTime) <= 86400000]]]</Select> | |
<Suppress Path="System">*[System[(EventID=4)]]</Suppress> | |
<Suppress Path="HardwareEvents">*[System[(EventID=4)]]</Suppress> | |
<Suppress Path="Veeam Backup">*[System[(EventID=4)]]</Suppress> | |
</Query> | |
</QueryList>' | |
$AlertEvents = Get-WinEvent -ea SilentlyContinue -ComputerName $Server -Filterxml $AlertXML | |
ForEach ($LogEntry in $AlertEvents) { | |
if ($LogEntry.Level -eq 1){$LevelTxt = "!RED!Critical"} | |
elseif ($LogEntry.Level -eq 2){$LevelTxt = "!RED!Error"} | |
elseif ($LogEntry.Level -eq 3){$LevelTxt = "!ORANGE!Warning"} | |
else {$LevelTxt = "Info"} | |
if ($LogEntry.Message.Length -ge 75){$Msg = $LogEntry.Message.substring(0,75)} | |
else {$Msg = $LogEntry.Message} | |
$obj = New-Object PSobject | |
$obj | Add-Member -MemberType NoteProperty -name "Level" -value $LevelTxt | |
$obj | Add-Member -MemberType NoteProperty -name "Logged" -value $LogEntry.TimeCreated | |
$obj | Add-Member -MemberType NoteProperty -name "Source" -value $LogEntry.ProviderName | |
$obj | Add-Member -MemberType NoteProperty -name "ID" -value $LogEntry.ID | |
$obj | Add-Member -MemberType NoteProperty -name "Computer" -value $Server | |
$obj | Add-Member -MemberType NoteProperty -name "Event Data" -value $Msg | |
$AlertData += $obj | |
$AlertCount += $AlertCount.count + 1 | |
} | |
#Customise a WARNING query via Event Viewer > Create Custom View > Copy query string from XML tab | |
$WarningXML = '<QueryList> | |
<Query Id="0" Path="System"> | |
<Select Path="System">*[System[(Level=3) and TimeCreated[timediff(@SystemTime) <= 86400000]]]</Select> | |
<Select Path="HardwareEvents">*[System[(Level=3) and TimeCreated[timediff(@SystemTime) <= 86400000]]]</Select> | |
<Select Path="Veeam Backup">*[System[(Level=3) and TimeCreated[timediff(@SystemTime) <= 86400000]]]</Select> | |
<Suppress Path="System">*[System[(EventID=4)]]</Suppress> | |
<Suppress Path="HardwareEvents">*[System[(EventID=4)]]</Suppress> | |
<Suppress Path="Veeam Backup">*[System[(EventID=4)]]</Suppress> | |
</Query> | |
</QueryList>' | |
$WarningEvents = Get-WinEvent -ea SilentlyContinue -ComputerName $Server -Filterxml $WarningXML | |
ForEach ($LogEntry in $WarningEvents) { | |
if ($LogEntry.Level -eq 1){$LevelTxt = "!RED!Critical"} | |
elseif ($LogEntry.Level -eq 2){$LevelTxt = "!RED!Error"} | |
elseif ($LogEntry.Level -eq 3){$LevelTxt = "!ORANGE!Warning"} | |
else {$LevelTxt = "Info"} | |
if ($LogEntry.Message.Length -ge 75){$Msg = $LogEntry.Message.substring(0,75)} | |
else {$Msg = $LogEntry.Message} | |
$obj = New-Object PSobject | |
$obj | Add-Member -MemberType NoteProperty -name "Level" -value $LevelTxt | |
$obj | Add-Member -MemberType NoteProperty -name "Logged" -value $LogEntry.TimeCreated | |
$obj | Add-Member -MemberType NoteProperty -name "Source" -value $LogEntry.ProviderName | |
$obj | Add-Member -MemberType NoteProperty -name "ID" -value $LogEntry.ID | |
$obj | Add-Member -MemberType NoteProperty -name "Computer" -value $Server | |
$obj | Add-Member -MemberType NoteProperty -name "Event Data" -value $Msg | |
$AlertData += $obj | |
$WarningCount += $WarningCount.count + 1 | |
} | |
} | |
# Results Data | |
$ResultsData = $AlertData + $WarningData | sort -Property "Logged" | |
# Results Alert | |
if ($AlertCount -ge 1){ | |
$ResultsAlert = "Alert" | |
} | |
elseif ($WarningCount -ge 1){ | |
$ResultsAlert = "Warning" | |
} | |
else{ | |
$ResultsAlert = "Good" | |
} | |
############################################################################################################ | |
# Output # | |
#------------------------ | |
$OutText = "" # $OutText MUST be either $ResultsText or "" Valid $ResultsText is any text string | |
$OutData = $ResultsData # $OutData MUST be either $ResultsData or "" Valid $ResultsData is any data array | |
$OutAlert = $ResultsAlert # $OutAlert MUST be either $ResultsAlert or "" Valid $ResultsAlert are 'Good', 'Warning' or 'Alert' | |
$Attachment = "" # $Attachment MUST be either UNC path or "" |
PowerShell scripts can be run anywhere that has access to the target and also has any add on modules installed.
These scripts are many years old and not currently maintained.
…________________________________
From: kvkbabu ***@***.***>
Sent: Thursday, May 11, 2023 4:55:32 PM
To: kvkbabu ***@***.***>
Cc: Author ***@***.***>
Subject: Re: theagreeablecow/00 Module Variables.ps1
@kvkbabu commented on this gist.
________________________________
is these scripts copied on VBR server? or run from any jump host? if we can copy in VBR server is there any specific location on VBR server?Kindly suggest
—
Reply to this email directly, view it on GitHub<https://gist.github.com/theagreeablecow/3682559#gistcomment-4564682> or unsubscribe<https://github.com/notifications/unsubscribe-auth/AANQ7YTJOXVJ7ZCIXEKAZ2DXFSEOLBFKMF2HI4TJMJ2XIZLTSKBKK5TBNR2WLJDHNFZXJJDOMFWWLK3UNBZGKYLEL52HS4DFQKSXMYLMOVS2I5DSOVS2I3TBNVS3W5DIOJSWCZC7OBQXE5DJMNUXAYLOORPWCY3UNF3GS5DZVRZXKYTKMVRXIX3UPFYGLK2HNFZXIQ3PNVWWK3TUUZ2G64DJMNZZDAVEOR4XAZNEM5UXG5FFOZQWY5LFU4ZTMOBSGU2TTJ3UOJUWOZ3FOKTGG4TFMF2GK>.
You are receiving this email because you authored the thread.
Triage notifications on the go with GitHub Mobile for iOS<https://apps.apple.com/app/apple-store/id1477376905?ct=notification-email&mt=8&pt=524675> or Android<https://play.google.com/store/apps/details?id=com.github.android&referrer=utm_campaign%3Dnotification-email%26utm_medium%3Demail%26utm_source%3Dgithub>.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
is these scripts copied on VBR server? or run from any jump host? if we can copy in VBR server is there any specific location on VBR server?Kindly suggest