Src/Private/Diagram/Get-AbrVbrBackupServerInformation.ps1

function Get-AbrBackupServerInformation {
    <#
    .SYNOPSIS
        Function to extract veeam backup & replication server information.
    .DESCRIPTION
        Build a diagram of the configuration of Veeam VBR in PDF/PNG/SVG formats using Psgraph.
    .NOTES
        Version: 0.8.24
        Author: Jonathan Colon
        Twitter: @jcolonfzenpr
        Github: rebelinux
    .LINK
        https://github.com/rebelinux/Veeam.Diagrammer
    #>

    [CmdletBinding()]

    param
    (

    )
    process {
        try {
            if (($VbrVersion -gt 13) -and (-not (Get-VBRServer | Where-Object { $_.Description -eq 'Backup server' -and $_.Type -eq 'Linux' })) -and $ClientOSVersion -eq 'Win32NT') {
                if (-not $IsLocalServer) {
                    if (Test-WSMan -Credential $Credential -Authentication Negotiate -ComputerName $VBRServer -ErrorAction SilentlyContinue) {
                        $PssSession = try { New-PSSession $VBRServer -Credential $Credential -Authentication Negotiate -ErrorAction Stop -Name 'PSSBackupServerDiagram' } catch {
                            Write-Error "Veeam.Diagrammer: New-PSSession: Unable to connect to $($VBRServer), WinRM disabled or not configured."
                            Write-Error -Message $_.Exception.Message
                        }
                    } else {
                        Write-Error "Veeam.Diagrammer: Test-WSMan: Unable to connect to $($VBRServer), WinRM disabled or not configured."
                    }
                }
            }
            Write-Verbose -Message "Collecting Backup Server information from $($VBRServer)."

            if ($IsLocalServer) {
                $VeeamInfo = & {
                    $VeeamVersion = Get-ChildItem -Recurse HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall | Get-ItemProperty | Where-Object { $_.DisplayName -match 'Veeam Backup & Replication Server' } | Select-Object -Property DisplayVersion
                    $VeeamDBFlavor = Get-ItemProperty -Path 'HKLM:\SOFTWARE\Veeam\Veeam Backup and Replication\DatabaseConfigurations'
                    $VeeamDBInfo12 = Get-ItemProperty -Path "HKLM:\SOFTWARE\Veeam\Veeam Backup and Replication\DatabaseConfigurations\$($VeeamDBFlavor.SqlActiveConfiguration)"
                    $VeeamDBInfo11 = Get-ItemProperty -Path 'HKLM:\SOFTWARE\Veeam\Veeam Backup and Replication'
                    return [PSCustomObject]@{
                        Version = $VeeamVersion.DisplayVersion
                        DBFlavor = $VeeamDBFlavor
                        DBInfo12 = $VeeamDBInfo12
                        DBInfo11 = $VeeamDBInfo11
                    }
                }
                $VeeamBuild = Get-AbrBackupServerInfo
            } else {
                if ($PssSession) {
                    $VeeamInfo = Invoke-Command -Session $PssSession -ErrorAction SilentlyContinue -ScriptBlock {
                        $VeeamVersion = Get-ChildItem -Recurse HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall | Get-ItemProperty | Where-Object { $_.DisplayName -match 'Veeam Backup & Replication Server' } | Select-Object -Property DisplayVersion
                        $VeeamDBFlavor = Get-ItemProperty -Path 'HKLM:\SOFTWARE\Veeam\Veeam Backup and Replication\DatabaseConfigurations'
                        $VeeamDBInfo12 = Get-ItemProperty -Path "HKLM:\SOFTWARE\Veeam\Veeam Backup and Replication\DatabaseConfigurations\$($VeeamDBFlavor.SqlActiveConfiguration)"
                        $VeeamDBInfo11 = Get-ItemProperty -Path 'HKLM:\SOFTWARE\Veeam\Veeam Backup and Replication'
                        return [PSCustomObject]@{
                            Version = $VeeamVersion.DisplayVersion
                            DBFlavor = $VeeamDBFlavor
                            DBInfo12 = $VeeamDBInfo12
                            DBInfo11 = $VeeamDBInfo11
                        }
                    }
                } else {
                    $VeeamBuild = Get-AbrBackupServerInfo
                }
            }

            $VeeamDBInfo = if ($VeeamInfo.DBInfo11.SqlServerName) {
                $VeeamInfo.DBInfo11.SqlServerName
            } elseif ($VeeamInfo.DBInfo12.SqlServerName) {
                $VeeamInfo.DBInfo12.SqlServerName
            } elseif ($VeeamInfo.DBInfo12.SqlHostName) {
                switch ($VeeamInfo.DBInfo12.SqlHostName) {
                    'localhost' { $VBRServer }
                    default { $VeeamInfo.DBInfo12.SqlHostName }
                }
            } else {
                $VBRServer
            }

            if ($VBRServer) {
                $Roles = if ($VeeamDBInfo -eq $VBRServer) { 'Backup and Database' } else { 'Backup Server' }
                $DBType = $VeeamInfo.DBFlavor.SqlActiveConfiguration

                $Rows = [ordered] @{
                    IP = Get-NodeIP -Hostname $VBRServer
                    Role = $Roles
                }

                if ($VeeamInfo.Version) {
                    $Rows.add('Version', $VeeamInfo.Version)
                } elseif ($VeeamBuild) {
                    $Rows.add('Version', $VeeamBuild.Build)
                } else {
                    $Rows.add('Version', 'Unknown')
                }

                if ($DBType) {
                    $Rows.add('Database Type', $DBType)
                }

                $Rows = [PSCustomObject]$Rows

                $script:BackupServerInfo = [PSCustomObject]@{
                    Name = $VBRServer.split('.')[0]
                    Label = Add-DiaNodeIcon -Name "$($VBRServer.split('.')[0])" -IconType 'VBR_Server' -Align 'Center' -RowsOrdered $Rows -ImagesObj $Images -IconDebug $IconDebug -FontSize 18 -FontBold -TableBackgroundColor $BackupServerBGColor -CellBackgroundColor $BackupServerBGColor
                    Spacer = Add-DiaNodeIcon -Name ' ' -IconType 'VBR_Bid_Arrow' -Align 'Center' -ImagesObj $Images -IconDebug $IconDebug -TableBackgroundColor $BackupServerBGColor -CellBackgroundColor $BackupServerBGColor
                }
            }

            $DatabaseServer = $VeeamDBInfo
            if ($DatabaseServer) {
                $DBPort = if ($VeeamInfo.DBFlavor.SqlActiveConfiguration -eq 'PostgreSql') { "$($VeeamInfo.DBInfo12.SqlHostPort)/TCP" } else { '1433/TCP' }
                $DatabaseServerIP = Get-NodeIP -Hostname $DatabaseServer

                $Rows = [ordered] @{
                    IP = $DatabaseServerIP
                    Role = 'Database Server'
                }

                if ($VeeamInfo.DBInfo12.SqlInstanceName) {
                    $Rows.add('Instance', $VeeamInfo.DBInfo12.SqlInstanceName)
                }

                if ($VeeamInfo.DBInfo12.SqlDatabaseName) {
                    $Rows.add('Database', $VeeamInfo.DBInfo12.SqlDatabaseName)
                }

                $Rows.add('DB Port', $DBPort)


                $Rows = [PSCustomObject]$Rows

                $DBIconType = if ($VeeamInfo.DBFlavor.SqlActiveConfiguration -eq 'PostgreSql') { 'VBR_Server_DB_PG' } else { 'VBR_Server_DB' }

                $script:DatabaseServerInfo = [PSCustomObject]@{
                    Name = $DatabaseServer.split('.')[0]
                    Label = Add-DiaNodeIcon -Name "$($DatabaseServer.split('.')[0])" -IconType $DBIconType -Align 'Center' -RowsOrdered $Rows -ImagesObj $Images -IconDebug $IconDebug -FontSize 18 -FontBold -TableBackgroundColor $BackupServerBGColor -CellBackgroundColor $BackupServerBGColor
                    DBPort = $DBPort
                }
            }

            $EMServer = [Veeam.Backup.Core.SBackupOptions]::GetEnterpriseServerInfo()
            if ($EMServer.ServerName) {
                $EMServerIP = Get-NodeIP -Hostname $EMServer.ServerName

                $Rows = [PSCustomObject] [ordered] @{
                    IP = $EMServerIP
                    Role = 'Enterprise Manager Server'
                }

                $script:EMServerInfo = [PSCustomObject]@{
                    Name = $EMServer.ServerName.split('.')[0]
                    Label = Add-DiaNodeIcon -Name "$($EMServer.ServerName.split('.')[0])" -IconType 'VBR_Server_EM' -Align 'Center' -Rows $Rows -ImagesObj $Images -IconDebug $IconDebug -FontSize 18 -FontBold -TableBackgroundColor $BackupServerBGColor -CellBackgroundColor $BackupServerBGColor
                }
            }
        } catch {
            Write-Verbose -Message $_.Exception.Message
        }
    }
    end {
        if ($PssSession) {
            Remove-PSSession $PssSession
        }
    }
}