Veeam v8 – My Veeam Report v1.4

MVR1.4Find the latest version here.

It’s time for yet another update to the My Veeam Report. This time around I concentrated on a few issues/limitations and tried to incorporate things folks here have asked for.

The biggest change I think people will like is the ability to only show the last session for each job. This has been a popular ask, sorry it took so long.

Other enhancements include many more options to tweak what you would like to see.  All output sections can now be hidden from the report as desired.  Variables were also added to customize the report width and email subject.

One thing that had eluded me in the past were certain warning messages that were not added to the session notes and therefore did not show on the report.  We now dig deeper for the individual object notes and add these to the report.

I’ll make a note that the repository section is still not 100%.  The real issue here is that Veeam does not provide the repo size info via their snapin. So we are using standard Windows tools to gather this information which has its limitations.  All is good if you run Windows repos but if you have a NAS or other storage devices, the script can fall short. Hopefully Veeam will add this info to the Get-VBRBackupRepository cmdlet in the near future (v9?).

Be sure to give the user variables section a good once over as there have been many changes and many additions. By default most things are turned on so on first run you can get a look at everything – feel free to trim back from there. There are a few items that you must specify prior to running like the vCenter name (as seen in VBR), the paths to the two Veeam files and the email section.

As always, let me know what you think.

Here is a list of the included changes:

  • Misc minor tweaks/cleanup
  • Added variable for report width
  • Added variable for email subject
  • Added ability to show/hide all report sections
  • Added Protected/Unprotected VM Count to Summary
  • Added per object details for sessions w/no details
  • Added proxy host name to Proxy Details
  • Added repository host name to Repository Details
  • Added section showing successful sessions
  • Added ability to view only last session per job
  • Added Cluster field for protected/unprotected VMs
  • Added catch for cifs repositories greater than 4TB as erroneous data is returned
  • Added % Complete for Running Jobs
  • Added ability to exclude multiple (vCenter) folders from Missing and Successful Backups section
  • Added ability to exclude multiple (vCenter) datacenters from Missing and Successful Backups section
  • Tweaked license info for better reporting across different date formats


Script can be downloaded from here.

27 thoughts on “Veeam v8 – My Veeam Report v1.4

    1. Mark Lavrijsen (@yomark1)

      Changed 2 things for myself:
      1) Changed $_.JobType -eq “Backup” to $_.JobType -eq “Backup” -or $_.JobType -eq “Replica” on 2 places. Replica info was not shown in session information because of that.
      2) Sending the email did not play nice with my version of powershell, changed it to:
      if ($sendEmail) {
      If ($emailAttach) {
      $body = “Veeam Report Attached”
      $tempfile = “$env:TEMP\$rptTitle.htm”
      $htmlOutput | Out-File $tempfile
      Send-MailMessage -SmtpServer $emailHost -From $emailFrom -To $emailTo -subject $emailSubject -Body $body -Attachments $tempfile

      } Else {
      $body = $htmlOutput
      Send-MailMessage -SmtpServer $emailHost -From $emailFrom -To $emailTo -subject $emailSubject -Body $body -BodyAsHtml

      Left mailserver authentication out, had no way of testing it. But it should be easy to add.

      1. smasterson Post author

        Hi Mark
        Thanks for the feedback
        Can you let me know the lines where you made the replica adjustments and I’ll add them in. (These things get easily missed as I do not use replicas)
        Re email issue – what version of PS are you using?

  1. Roy

    So for those of us stuck in v7 land, if we just wanted to steal the last session update portion, would it work in v7?

  2. Aaron B

    I found a bug but not sure if anyone is using synthetic fulls with Data Domain and DD Boost.

    If you are running a synthetic full when the report runs, it does not show in running jobs and VMs with no successful backups still show the VMs that the synthetic fulls. All I need is running jobs to include synthetic fulls.

    1. smasterson Post author

      Hi Aaron
      Thanks for the tip – good catch. I’ll need to test a bit to see what type of job they are specifying for the synthetic fulls, should be an easy fix. Just to clarify – these are regular incremental jobs with periodic synthetic fulls?
      As for the VMs showing unprotected while the job is running – this is as expected. The VMs are not updated with the correct info until the job has completed.

      1. smasterson Post author

        On second glance, this may be a bit hard for me to reproduce. I believe in your scenario the DD is actually performing the synthetic full, not Veeam. Though the command is coming from Veeam and surely Veeam is tracking the progress, with not having a DD it will be hard (if not impossible) for me to see the state of the job during such events. If you would like to assist in tracking it down, shoot me an email (smasterson @ gmail) and we can see if we can track it down together.

  3. Warwick

    Thank you for this script.
    I have no experience with Powershell but I was able to combine both the Failed and Sucessful backups into one view. I also changed some of the columns / data to reflect what Veeam tells me.

    # Combined Report
    # This combined both Successful and Failed reports into the one output

    $bodyWFALLSucc = $null
    $sessWFALL = @($warningSessions + $failsSessions + $succesSessions)
    if ($sessWFALL.count -gt 0) {
    If ($onlyLast) {
    $headerSuccWFALL = “Backup Jobs”
    } Else {
    $headerSuccWFALL = “Backup Sessions”
    $bodySessWFALL = $sessWFALL | Sort Creationtime -descending | Select @{Name=”Job Name”; Expression = {$_.Name}},
    @{Name=”Start Time”; Expression = {$_.CreationTime}},
    @{Name=”Stop Time”; Expression = {$_.EndTime}},
    @{Name=”Duration (Mins)”; Expression = {[Math]::Round($_.WorkDetails.WorkDuration.TotalMinutes,2)}},
    @{Name=”Backup Speed (MB/s)”; Expression = {[Math]::round($_.Progress.AvgSpeed/1024/1024,0)}},
    @{Name=”Data Read (GB)”; Expression = {[Math]::round($_.BackupStats.DataSize/1GB,2)}},
    @{Name=”Data Transferred (GB)”; Expression = {[Math]::round($_.BackupStats.BackupSize/1GB,2)}},
    Result | ConvertTo-HTML -Fragment
    $bodySessWFALL = $subHead01 + $headerSuccWFALL + $subHead02 + $bodySessWFALL

  4. Daniel

    I relly like this script. Great work! But i have some questions. I would also like to se the copy jobs on the report and also, is there a way to show to repositorys size? all of ours is over 4TB (40TB)

    1. smasterson Post author

      Hi Daniel, glad you like the script.
      I’ll be fixing the copy jobs in the next version – just something I do not currently utilize so it has slipped by.
      Regarding the repo issue, this is a bit tough. Veeam does not expose this info via PowerShell unfortunately. The script utilizes standard Windows PowerShell commands to get the repo info currently but unfortunately Windows (at least via PS) does not do a good job on remote devices with large drives (>4TB). There are a couple of possible solutions, but none that will work for everyone – which is why I have left the script as is for now.
      Possible solution #1 – create a function to query the Veeam database for this information. Problem here is the diversity of the databases (remote/local/Standard/Express) as well as having to deal with passing credentials, etc.
      Possible solution #2 – use other tools to query the info. For example using the Data ONTAP PowerShell Toolkit if you happen to have a NetApp filer. Biggest problem here is that everyone’s storage is different so hard for me to assist.

      As nice as it is to have the repo info in the script, until Veeam provides a way for us to access it via PS (v9 maybe?) it is probably best to monitor the repo size with another tool.
      For what it’s worth, I have recommend to Veeam that they add this info via their snappin repeatedly.

  5. Warwick

    Hi Daniel,

    I see the Backup Copy jobs when I run the Weekly or Monthly reports. If just doing 24 Hours then I don’t.

    1. smasterson Post author

      Warwick – how often are your copy jobs running? The only difference between weekly/monthly vs 24 hour reports is querying jobs that have started within that time frame. If you only run copy jobs on the weekends for example, this would be as expected.

  6. Michael


    I use Veeam Endpoint Protection for backups of my physical servers.
    Is it possible that the backup jobs are displayed in the report? Currently this is not so.

    Thanks so much

    Best regards

    1. smasterson Post author

      I’m not really sure what you are looking for here – can you be a bit more descriptive, especially on the ‘restore point reporting’?
      Backup Copy jobs should be included, though a few have mentioned they are not there. Expect this to be worked on in the next version.

    2. Luis Rodriguez

      I added the following to get me the Backup Copy Jobs ({$_.JobType -eq “BackupSync”} )

      So under the section for # Get Successful Sessions I pasted in the code below. I also added color coding for pending items to be yellow..

      # Backup Copy Sessions Added BackupSync Jobs

      $RestorePoints4CloudConnect = “”
      $headerSucc = “Backup Copy Sessions”
      $Jobs = Get-VBRJob | Where-Object {$_.JobType -eq “BackupSync”}
      foreach ($job in $Jobs) {
      $RestorePoints4CloudConnect = Get-VBRBackupSession | where {$_.JobName -eq $job.Name} | Sort creationtime -Descending |select -First 1

      $bodyBackupCopySessions = Get-VBRTaskSession $RestorePoints4CloudConnect | Select-Object JobName ,Name ,@{Name=”StartTime”; Expression = {$_.Progress.StartTime}},@{Name=”StopTime”; Expression = {$_.Progress.StopTime}},@{Name=”Read-GB”; Expression = {[math]::Round(($_.Progress.ReadSize/1024/1024/1024),1)}},@{Name=”Sent-GB”; Expression = {[math]::Round(($_.Progress.TransferedSize/1024/1024/1024),1)}},Status | ConvertTo-HTML -Fragment
      $bodyBackupCopySessions = $subHead01 + $headerSucc + $subHead02 + $bodyBackupCopySessions

      IN THE #Yellow section I added a line:
      $htmlOutput = $htmlOutput.Replace(“Pending<","Pending<")

  7. z3r0

    Thx for this nice Script.
    Is there any possibilty to execute this script for a specific Backupjob? We have a plenty of Backupbjobs for our customers, so we would like to get a specific report.

    Thx in advance

    1. Warwick

      Hello z3r0,
      You could easily make a script per customer. Use the $excludeVMs on line 30 to exclude the VM’s you don’t want to report on. I have this working in my set-up for test VM’s that aren’t backed up.

      1. z3r0

        Hello Warwick, thanks for your command. I’ve allready noticed this possibility but this procedure is not very practicable for us because we must edit the script each time we create a new VM to exclude it in a customer script. I’ve also noticed the possibility to exclude vCenter Folders, but our vSphere infrastructure is not organized in folders per customer.
        May it be possible to set an execution filter to “run the script on a specific backup job”?
        Thanks in advance

  8. z3r0

    Mee again… i found a solution to only report the Backupjobs with the specific customer Name:
    At line 217: $allSesh = Get-VBRBackupSession| where { $_.JobName -like ‘*customerXY*’}

    Now i would like to modify line 30:
    $excludeVMs = @(“”) to $ONLY_INCLUDE_VMS = @(“*customerXY*”)

    So will get all Backupjobs and VMs from a specific customer.
    Any Ideas?


Leave a Reply

Your email address will not be published. Required fields are marked *