Src/Public/Invoke-AsBuiltReport.Rubrik.CDM.ps1

function Invoke-AsBuiltReport.Rubrik.CDM {
    <#
    .SYNOPSIS
        PowerShell script to document the configuration of Rubrik CDM in Word/HTML/XML/Text formats
    .DESCRIPTION
        Documents the configuration of the Rubrik CDM in Word/HTML/XML/Text formats using PScribo.
    .NOTES
        Version: 1.0.1
        Author: Mike Preston
        Twitter: @mwpreston
        Github: mwpreston
        Credits: Iain Brighton (@iainbrighton) - PScribo module
 
    .LINK
        https://github.com/AsBuiltReport/AsBuiltReport.Rubrik.CDM
    #>


    [cmdletbinding()]
    param (
        [String[]] $Target,
        [PSCredential] $Credential,
        [String]$StylePath
    )

    # Import JSON Configuration for Options and InfoLevel
    $InfoLevel = $ReportConfig.InfoLevel
    $Options = $ReportConfig.Options

    # If custom style not set, use default style
    if (!$StylePath) {
        & "$PSScriptRoot\..\..\AsBuiltReport.Rubrik.CDM.Style.ps1"
    }

    #region Script Functions
    #---------------------------------------------------------------------------------------------#
    # SCRIPT FUNCTIONS #
    #---------------------------------------------------------------------------------------------#

    #endregion Script Functions

    #region Script Body
    #---------------------------------------------------------------------------------------------#
    # SCRIPT BODY #
    #---------------------------------------------------------------------------------------------#
    $CDMAsBuiltModule = Get-Module -Name "AsBuiltReport.Rubrik.CDM"
    $AsBuiltModule = Get-Module -Name "AsBuiltReport.Core"
    $RubrikModule = Get-Module -Name "Rubrik"
    Write-PScriboMessage -Message "[Rubrik] [Info] As Built Report Core Module is version $($AsBuiltModule.Version) from $($AsBuiltModule.RepositorySourceLocation)"
    Write-PScriboMessage -Message "[Rubrik] [Info] As Built Rubrik Module is version $($CDMAsBuiltModule.Version) from $($CDMAsBuiltModule.RepositorySourceLocation)"
    Write-PScriboMessage -Message "[Rubrik] [Info] Rubrik Module is version $($RubrikModule.Version) from $($RubrikModule.RepositorySourceLocation)"
    foreach ($brik in $Target) {
        try {
            Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Connection] Connecting to $($brik)"
            $RubrikCluster = Connect-Rubrik -Server $brik -Credential $Credential -ErrorAction Stop
        } catch {
            Write-Error $_
        }
        if ($RubrikCluster) {
            Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Cluster Settings] Retrieving Rubrik Cluster Settings"
            $ClusterInfo = Get-RubrikClusterInfo
            Section -Style Heading1 $($ClusterInfo.Name) {
                if ($InfoLevel.Cluster -ge 1) {
                    Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Cluster Settings] Beginning Cluster Settings Section with Info Level $($InfoLevel.Cluster)"
                    Section -Style Heading2 'Cluster Settings' {
                        Paragraph ("The following section provides information on the configuration of the Rubrik CDM Cluster $($ClusterInfo.Name)")
                        BlankLine
                        Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Cluster Settings] Retrieving additional cluster settings"
                        #Cluster Summary for InfoLevel 1/2 (Summary/Informative)
                        $ClusterSummary = [ordered]@{
                            'Name' = $ClusterInfo.Name
                            'Number of Briks' = $ClusterInfo.BrikCount
                            'Number of Nodes' = $ClusterInfo.NodeCount
                            'Software Version' = $ClusterInfo.softwareVersion
                        }
                        # InfoLevel 3 (Detailed) adds disk/cpu/memory metrics
                        if ($InfoLevel.Cluster -ge 3) {
                            $ClusterSummary.Add('# CPU Cores', $ClusterInfo.CPUCoresCount)
                            $ClusterSummary.Add('Total Memory (GB)', $ClusterInfo.MemoryCapacityinGB)
                            $ClusterSummary.Add('Timezone', $ClusterInfo.timezone.timezone)
                        }
                        # InfoLevel 5 (Comprehensive) adds the rest!
                        if ($InfoLevel.Cluster -eq 5) {
                            $ClusterSummary.Add('Geo Location', $ClusterInfo.geolocation.address)
                            $ClusterSummary.Add('Software Encrypted', $ClusterInfo.isEncrypted)
                            $ClusterSummary.Add('Hardware Encrypted', $ClusterInfo.isHardwareEncrypted)
                            $ClusterSummary.Add('Cluster ID', $ClusterInfo.id)
                            $ClusterSummary.Add('Accepted EULA Version', $ClusterInfo.acceptedEULAVersion)
                            $ClusterSummary.Add('Has TPM Support', $ClusterInfo.hasTPM)
                            $ClusterSummary.Add('Connected to Polaris', $ClusterInfo.ConnectedToPolaris)
                            $ClusterSummary.Add('Platform', $ClusterInfo.Platform)
                            $ClusterSummary.Add('Running on Cloud', $ClusterInfo.isOnCloud)
                            $ClusterSummary.Add('Only Azure Support', $ClusterInfo.OnlyAzureSupport)
                            $ClusterSummary.Add('Is Single Node Appliance', $ClusterInfo.isSingleNode)
                            $ClusterSummary.Add('Registered', $ClusterInfo.isRegistered)
                            # Get Login Banner Info
                            $banner = Get-RubrikLoginBanner
                            $ClusterSummary.Add('Login Banner', $banner.loginBanner)
                        }
                        Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Cluster Settings] Output Cluster Summary"
                        # Cluster Information Table
                        [pscustomobject]$ClusterSummary | Table -Name $ClusterSummary.Name -ColumnWidths 30, 70 -List
                        Section -Style Heading3 'Cluster Storage Details' {
                            Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Cluster Settings] Retrieving Cluster Storage Details"
                            $StorageInfo = Get-RubrikClusterStorage
                            $StorageSummary = [ordered]@{
                                'Total Usable Storage (TB)' = $StorageInfo.TotalUsableStorageInTb
                                'Used Storage (TB)' = $StorageInfo.UsedStorageInTb
                                'Available Storage (TB)' = $StorageInfo.AvailableStorageInTb
                            }
                            if ($InfoLevel.Cluster -ge 3) {
                                $StorageSummary.Add('Archival Storage Used (TB)', $StorageInfo.ArchivalUsageInTb)
                                $StorageSummary.Add('Live Mount Storage Used (GB)', $StorageInfo.LiveMountStorageInGb)
                            }
                            if ($InfoLevel.Cluster -eq 5) {
                                $StorageSummary.Add('Local Data Reduction Percentage', $StorageInfo.LocalDataReductionPercent)
                                $StorageSummary.Add('Archival Data Reduction Percentage', $StorageInfo.ArchivalDataReductionPercent)
                                $StorageSummary.Add('Average Daily Growth (GB)', $StorageInfo.AverageGrowthPerDayInGb)
                                $StorageSummary.Add('Estimated Runway (days)', $StorageInfo.EstimatedRunwayInDays)
                            }
                            Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Cluster Settings] Output Cluster Storage Details"
                            [pscustomobject]$StorageSummary | Table -Name "Cluster Storage Details" -ColumnWidths 30, 70 -List
                        }

                        # Node Overview Table
                        if ($InfoLevel.Cluster -ge 3) {
                            Section -Style Heading3 'Member Nodes' {
                                Write-PScriboMessage "[Rubrik] [$($brik)] [Cluster Settings] Retrieving Cluster Node Details"
                                $NodeInfo = Get-RubrikNode
                                Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Cluster Settings] Output Cluster Node Information"
                                $NodeInfo | Table -Name "Cluster Node Information" -ColumnWidths 25, 12, 12, 25, 25 -Columns brikId, id, status, supportTunnel -Headers 'Brik ID', 'ID', 'Status', 'Support Tunnel'
                            }
                        } # End InfoLevel -ge 3

                        # Cluster Info - Networking
                        Section -Style Heading3 'Network Settings' {
                            Paragraph "The following contains network related settings for the cluster"
                            Section -Style Heading4 'Cluster Interfaces' {
                                Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Cluster Settings] Retrieving Cluster Node Networking Information"
                                $NodeDetails = Get-RubrikClusterNetworkInterface | Select-Object -Property @{N = "Interface Name"; E = { $_.interfaceName } },
                                @{N = "Type"; E = { $_.interfaceType } }, @{N = "Node"; E = { $_.node } },
                                @{N = "IP Addresses"; E = { $_.ipAddresses } }, @{N = "Subnet Mask"; E = { $_.netmask } }
                                Write-PScriboMessage "[Rubrik] [$($brik)] [Cluster Settings] Output Cluster Networking"
                                $NodeDetails | Table -Name 'Cluster Node Information'
                            }

                            Write-PScriboMessage "[Rubrik] [$($brik)] [Cluster Settings] Output Cluster DNS"
                            Section -Style Heading4 'DNS Configuration' {
                                $DNSDetails = Get-RubrikDNSSetting
                                $DNSDetails = [ordered]@{
                                    'DNS Servers' = ($DNSDetails.DNSServers | Out-String)
                                    'Search Domains' = ($DNSDetails.DNSSearchDomain | Out-String)
                                }
                                [pscustomobject]$DNSDetails | Table -Name 'DNS Configuration' -List
                            }
                            if ($InfoLevel.Cluster -lt 3) {
                                Write-PScriboMessage "[Rubrik] [$($brik)] [Cluster Settings] Retrieving Cluster DNS Information"
                                $NTPDetails = Get-RubrikNTPServer | Select-Object -Property @{Name = "Server"; Expression = { $_.server } }
                                $NetworkThrottleDetails = Get-RubrikNetworkThrottle | Select-Object -Property @{Name = "Resource ID"; Expression = { $_.resourceId } },
                                @{Name = "Enabled"; Expression = { $_.isEnabled } },
                                @{Name = "Default Throttle Limit"; Expression = { $_.defaultthrottleLimit } }
                            } else {
                                Write-PScriboMessage "[Rubrik] [$($brik)] [Cluster Settings] Retrieving Cluster NTP Configuration"
                                $NTPServers = Get-RubrikNTPServer
                                $NTPDetails = @()
                                foreach ($ntpserver in $NTPServers) {
                                    $inObj = [ordered]@{
                                        'Server' = $ntpserver.server
                                        'Symmetric Key ID' = $ntpserver.symmetricKey.keyId
                                        'Symmetric Key' = $ntpserver.symmetricKey.key
                                        'Key Type' = $ntpserver.symmetricKey.keyType
                                    }
                                    $NTPDetails += [pscustomobject]$inObj
                                }
                                Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Cluster Settings] Retrieving Network Throttling Information"
                                $NetworkThrottleDetails = @()
                                $NetworkThrottles = Get-RubrikNetworkThrottle
                                foreach ($throttle in $NetworkThrottles) {
                                    $inObj = [ordered]@{
                                        'Resource ID' = $throttle.resourceId
                                        'Enabled' = $throttle.isEnabled
                                        'Default Throttle Limit' = $throttle.defaultThrottleLimit
                                    }
                                    if ($null -eq $throttle.scheduledThrottles) { $strSchedule = '' }
                                    else {
                                        $strSchedule = New-Object Text.StringBuilder
                                        foreach ($schedule in $throttle.scheduledThrottles) {
                                            $strSchedule.Append("Start Time: $($schedule.startTime)")
                                            $strSchedule.Append(" | End Time: $($schedule.endTime)")
                                            $strSchedule.Append(" | Days Of Week: $($schedule.daysOfWeek -Join ', ')")
                                            $strSchedule.Append(" | Throttle Limit: $($schedule.throttleLimit)")
                                            $strSchedule.Append("`n")
                                        }
                                    }
                                    $inObj.add('Scheduled Throttles', $strSchedule)
                                    $NetworkThrottleDetails += [pscustomobject]$inObj
                                }
                            }
                            Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Cluster Settings] Output NTP Configuration"
                            Section -Style Heading4 'NTP Configuration' {
                                $NTPDetails | Table -Name 'NTP Configuration'
                            }
                            Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Cluster Settings] Output Network Throttling"
                            Section -Style Heading4 'Network Throttling' {
                                $NetworkThrottleDetails | Table -Name 'Network Throttling'
                            }

                            Section -Style Heading4 'Proxy Server' {
                                Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Cluster Settings] Retrieving Proxy Information"
                                $ProxyDetails = Get-RubrikProxySetting
                                if (0 -ne ($ProxyDetails | Measure-Object).count) {
                                    Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Cluster Settings] Output Proxy Settings"
                                    $ProxyDetails | Table -Name 'Proxy Configuration'
                                } else { Paragraph "There are currently no proxy servers configured on this cluster" }
                            }

                        } # End Heading 3 - Network Settings
                        Section -Style Heading3 'Notification Settings' {
                            Paragraph "The following contains notification settings configured on the cluster"

                            Section -Style Heading4 'Email Settings' {
                                Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Cluster Settings] Retrieving Email Information"
                                $EmailDetails = Get-RubrikEmailSetting
                                if (0 -ne ($EmailDetails | Measure-Object).count ) {
                                    Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Cluster Settings] Output Email Settings"
                                    $EmailDetails | Table -Name 'Email Details'
                                } else { Paragraph "There are currently no email settings configured on this cluster" }
                            }

                            Section -Style Heading4 'SNMP Settings' {
                                Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Cluster Settings] Retrieving SNMP Information"
                                $SNMPInfo = Get-RubrikSNMPSetting
                                $inObj = [ordered]@{
                                    'Community String' = $($SNMPInfo.communityString)
                                    'Port' = $SNMPInfo.snmpAgentPort
                                    'Enabled' = $SNMPInfo.isEnabled
                                }
                                $strTraps = New-Object Text.StringBuilder
                                foreach ($trap in $SNMPInfo.trapReceiverConfigs) {
                                    $strTraps.Append("Address: $($trap.address)")
                                    $strTraps.Append(" | Port: $($trap.port)")
                                    $strTraps.Append("`n")
                                }
                                $inObj.add('Receiver Configurations', $strTraps)
                                $SNMPDetails = [pscustomobject]$inObj
                                Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Cluster Settings] Output SNMP Settings"
                                $SNMPDetails | Table -Name 'SNMP Settings'
                            }

                            Section -Style Heading4 'Notification Settings' {
                                Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Cluster Settings] Retrieving Notification Settings"
                                $NotificationDetails = Get-RubrikNotificationSetting | Select-Object -Property @{N = "ID"; E = { $_.id } },
                                @{N = "Event Types"; E = { $_.eventTypes | Out-String } }, @{N = "SNMP Addresses"; E = { $_.snmpAddresses } },
                                @{N = "Email Addresses"; E = { $_.emailAddresses } }, @{N = "Send to syslog"; E = { $_.shouldSendToSyslog } }
                                Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Cluster Settings] Output Notification Settings"
                                $NotificationDetails | Table -Name 'Notification Settings'
                            }
                        } # End Heading 3 - NOtification Settings

                        Section -Style Heading3 'Security Settings' {
                            Paragraph "The following contains security related settings configured on the cluster"

                            Section -Style Heading4 'IPMI Settings' {
                                Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Cluster Settings] Retrieving IPMI Information"
                                $IPMIInformation = Get-RubrikIPMI
                                $inObj = [ordered] @{
                                    'IPMI Available' = $IPMIInformation.isAvailable
                                    'HTTPS Access' = $IPMIInformation.access.https
                                    'iKVM Access' = $IPMIInformation.access.iKvm
                                    'SSH Access' = $IPMIInformation.access.ssh
                                    'Virtual Media Access' = $IPMIInformation.access.virtualMedia
                                }
                                $IPMIDetails = [pscustomobject]$inObj
                                Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Cluster Settings] Output IPMI Settings"
                                $IPMIDetails | Table -Name 'IPMI Settings'
                            }

                            Section -Style Heading4 'SMB Domains' {
                                if ($InfoLevel.Cluster -in (1, 2)) {
                                    Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Cluster Settings] Retrieving SMB Domains"
                                    $SMBDomainInformation = Get-RubrikSMBDomain | Select-Object @{Name = "Name"; Expression = { $_.name } },
                                    @{Name = "Status"; Expression = { $_.status } },
                                    @{Name = "Service Account"; Expression = { $_.serviceAccount } }
                                } else {
                                    Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Cluster Settings] Retrieving SMB Domains"
                                    $SMBSecurityInformation = Get-RubrikSMBSecurity
                                    $SMBDomainInformation = Get-RubrikSMBDomain | Select-Object @{N = "Name"; E = { $_.name } },
                                    @{N = "Status"; E = { $_.status } },
                                    @{N = "Service Account"; E = { $_.serviceAccount } },
                                    @{N = "Sticky SMB Service"; E = { $_.isStickySmbService } },
                                    @{Name = 'Force SMB Security'; Expression = { $SMBSecurityInformation.enforceSmbSecurity } }
                                }
                                Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Cluster Settings] Output SMB Domains"
                                # Currently Get-RubrikSMBDomain has the possiblity of being null so we must check here
                                if ($null -eq $SMBDomainInformation) {
                                    Paragraph "No SMB Domain information configured"
                                }
                                else {
                                    $SMBDomainInformation | Table -Name 'SMB Domains'
                                }
                            }

                            Section -Style Heading4 'Syslog Settings' {
                                Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Cluster Settings] Retrieving Syslog Information"
                                $SyslogInformation = Get-RubrikSyslogServer | Select-Object -Property @{N = "Hostname"; E = { $_.hostname } },
                                @{N = "Protocol"; E = { $_.protocol } }, @{N = "Port"; E = { $_.port } }
                                Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Cluster Settings] Ouput Syslog Settings"
                                if ($null -eq $SyslogInformation) {
                                    Paragraph "No Syslog settings configured"
                                } else {
                                    $SyslogInformation | Table -Name 'Syslog Settings'
                                }

                            }

                            Section -Style Heading4 'Security Classification Settings' {
                                Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Cluster Settings] Retrieving Security Classification Settings"
                                $SecurityInformation = Get-RubrikSecurityClassification | Select-Object -Property @{N = "Color"; E = { $_.classificationColor } },
                                @{N = "Message"; E = { $_.classificationMessage } }
                                Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Cluster Settings] Output Security Classification Settings"
                                $SecurityInformation | Table -Name 'Security Classification Settings' -ColumnWidths 50, 50
                            }

                            Section -Style Heading4 'User Details' {
                                Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Cluster Settings] Retrieving User Details"
                                if ($InfoLevel.Cluster -in (1, 2)) {
                                    $UserDetails = Get-RubrikUser | Select-Object -Property @{N = "Username"; E = { $_.username } },
                                    @{N = "First Name"; E = { $_.firstName } }, @{N = "Last Name"; E = { $_.lastName } },
                                    @{N = "Email Address"; E = { $_.emailAddress } }
                                    $UserDetails | Sort-Object -Property Username | Table -Name 'User Details'
                                } else {
                                    $UserInformation = Get-RubrikUser | Select-Object UserName, FirstName, LastName, emailAddress, AuthDomainID, ID,
                                    @{ Name = 'Permissions'; Expression = { Get-RubrikUserRole -id $_.id | Select-Object @{Name = 'Perms'; Expression = { "ReadOnlyAdmin = $($_.readOnlyAdmin)`nAdmin = $($_.admin)`nOrgAdmin = $($_.orgAdmin)`nManagedVolumeAdmin = $($_.managedVolumeAdmin)`nOrganization=$($_.organization)`nManagedVolumeUser = $($_.managedVolumeUser)`nendUser = $($_.endUser)" } } } } | Sort-Object -Property Username
                                    $UserDetails = @()
                                    foreach ($user in $UserInformation) {
                                        $inObj = [ordered] @{
                                            'Username' = $user.Username
                                            'First Name' = $user.FirstName
                                            'Last Name' = $user.LastName
                                            'Email Address' = $User.emailAddress
                                            'Auth Domain ID' = $user.AuthDomainID
                                            'ID' = $user.id
                                            'Permissions' = $user.permissions.perms
                                        }
                                        $UserDetails += [pscustomobject]$inObj
                                    }
                                    Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Cluster Settings] Output User Details"
                                    $UserDetails | Table -Name 'User Details' -ColumnWidths 20, 80 -List
                                }
                            }

                            Section -Style Heading4 'LDAP Settings' {
                                if ($InfoLevel.Cluster -in (1, 2)) {
                                    Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Cluster Settings] Retrieving LDAP Settings"
                                    $LDAPDetails = Get-RubrikLDAP | Select-Object -Property @{N = "Name"; E = { $_.name } },
                                    @{N = "Domain Type"; E = { $_.domainType } }, @{N = "Initial Refresh Status"; E = { $_.initialRefreshStatus } }
                                    Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Cluster Settings] Output LDAP Settings"
                                    $LDAPDetails | Table -Name 'LDAP Settings'
                                } else {
                                    Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Cluster Settings] Retrieving LDAP Settings"
                                    $LDAPDetails = Get-RubrikLDAP | Select-Object -Property @{N = "Name"; E = { $_.name } },
                                    @{N = "Domain Type"; E = { $_.domainType } }, @{N = "Initial Refresh Status"; E = { $_.initialRefreshStatus } },
                                    @{N = "Dynamic DNS Name"; E = { $_.dynamicDnsName } }, @{N = "Service Account"; E = { $_.serviceAccount } },
                                    @{N = "Bind Username"; E = { $_.bindUserName } }, @{Name = "Advanced Options"; Expression = { $_.advancedOptions | Out-String } }
                                    Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Cluster Settings] Output LDAP Settings"
                                    $LDAPDetails | Table -Name 'LDAP Settings' -ColumnWidths 20, 80 -List
                                }
                            }
                        } # End Heading 3 - Security Settings
                        Section -Style Heading3 'Backup Settings' {
                            Paragraph "The following contains backup related settings configured on the cluster"

                            Section -Style Heading4 'Guest OS Credentials' {
                                Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Cluster Settings] Retrieving Guest OS Credentials"
                                $GuestOSCredentials = Get-RubrikGuestOsCredential | Select-Object -Property @{N = "Username"; E = { $_.username } },
                                @{N = "Domain"; E = { $_.domain } }
                                Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Cluster Settings] Output Guest OS Credentials"
                                if ($null -eq $GuestOSCredentials) {
                                    Paragraph "No Guest OS Credentials configured"
                                } else {
                                    $GuestOSCredentials | Table -Name 'Guest OS Credentials' -ColumnWidths 50, 50
                                }

                            }
                            Section -Style Heading4 'Miscellaneous Backup Configurations' {
                                Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Cluster Settings] Retrieving Miscellaneous Backup Settings"
                                $BackupServiceDeployment = Get-RubrikBackupServiceDeployment | Select-Object @{Name = "Automatically Deploy RBS"; Expression = { $_.isAutomatic } }
                                Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Cluster Settings] Output Miscellaneous Backup Settings"
                                $BackupServiceDeployment | Table -Name 'Miscellaneous Backup Configuration' -ColumnWidths 30, 70 -List
                            }
                        } # End Heading 3 - Backup Settings
                        Section -Style Heading3 'Backup Sources' {
                            Paragraph "The following contains information around the backup sources configured on the cluster"
                            # Null checks for those cmdlets requiring -DetailedObject
                            # Temporary until built into the SDK
                            if ($InfoLevel.Cluster -ge 1) {
                                $NutanixClusters = Get-RubrikNutanixCluster -PrimaryClusterId local
                                $SCVMMServers = Get-RubrikSCVMM -PrimaryClusterID local
                                $WindowsHosts = Get-RubrikHost -PrimaryClusterId "local" -Type "Windows"
                                $LinuxHosts = Get-RubrikHost -PrimaryClusterId "local" -Type "Linux"
                            }
                            if ($InfoLevel.Cluster -lt 3) {
                                Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Cluster Settings] Retrieving vCenter Information"
                                $VMwarevCenter = Get-RubrikvCenter -PrimaryClusterId "local" | Select-Object @{N = "Name"; E = { $_.name } },
                                @{N = "Hostname"; E = { $_.hostname } },
                                @{N = "Username"; E = { $_.username } }
                                Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Cluster Settings] Retrieving vCloud Director Information"
                                $VMwareVCD = Get-RubrikVCD | Where-Object { $_.PrimaryClusterId -eq (Get-RubrikSetting).id } | Select-Object @{N = "Name"; E = { $_.name } },
                                @{N = "Hostname"; E = { $_.hostname } },
                                @{N = "Username"; E = { $_.username } },
                                @{Name = "Connection Status"; Expression = { $_.connectionStatus.status } }
                                Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Cluster Settings] Retrieving Nutanix Information"
                                if ($null -ne $NutanixClusters -and 0 -ne $NutanixClusters[0].total) {
                                    $NutanixClusters = Get-RubrikNutanixCluster -PrimaryClusterId "local" -DetailedObject | Select-Object @{N = "Name"; E = { $_.name } },
                                    @{N = "Hostname"; E = { $_.hostname } },
                                    @{N = "Username"; E = { $_.username } },
                                    @{Name = "Connection Status"; Expression = { $_.connectionStatus.status } }
                                } else {
                                    Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Cluster Settings] No Nutanix clusters detected, setting to null"
                                    $NutanixClusters = $null
                                }
                                Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Cluster Settings] Retrieving SCVMM Information"
                                if ($null -ne $SCVMMServers -and 0 -ne $SCVMMServers[0].total) {
                                    $SCVMMServers = Get-RubrikScvmm -PrimaryClusterId "local" -DetailedObject | Select-Object @{N = "Name"; E = { $_.name } },
                                    @{N = "Hostname"; E = { $_.hostname } },
                                    @{N = "Run As"; E = { $_.runAsAccount } },
                                    @{N = "Connection Status"; E = { $_.status } }
                                } else {
                                    Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Cluster Settings] No SCVMM hosts detected, setting to null"
                                    $SCVMMServers = $null
                                }
                                Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Cluster Settings] Retrieving Windows Hosts Information"
                                if ($null -ne $WindowsHosts -and 0 -ne $WindowsHosts[0].total) {
                                    $WindowsHosts = Get-RubrikHost -PrimaryClusterId "local" -Type "Windows" | Select-Object @{N = "Name"; E = { $_.name } },
                                    @{N = "Hostname"; E = { $_.hostname } },
                                    @{N = "Operating System"; E = { $_.operatingSystem } },
                                    @{N = "Connection Status"; E = { $_.status } }
                                } else {
                                    Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Cluster Settings] No Windows hosts detected, setting to null"
                                    $WindowsHosts = $null
                                }
                                Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Cluster Settings] Retrieving Linux Hosts Information"
                                if ($null -ne $LinuxHosts -and 0 -ne $LinuxHosts[0].total) {
                                    $LinuxHosts = Get-RubrikHost -PrimaryClusterId "local" -Type "Linux" | Select-Object @{N = "Name"; E = { $_.name } },
                                    @{N = "Hostname"; E = { $_.hostname } },
                                    @{N = "Operating System"; E = { $_.operatingSystem } },
                                    @{N = "Connection Status"; E = { $_.status } }
                                } else {
                                    Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Cluster Settings] No Linux hosts detected, setting to null"
                                    $LinuxHosts = $null
                                }
                            } else {
                                Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Cluster Settings] Retrieving vCenter Information"
                                $VMwarevCenter = Get-RubrikvCenter -PrimaryClusterId "local" | Select-Object @{N = "Name"; E = { $_.name } },
                                @{N = "Hostname"; E = { $_.hostname } },
                                @{N = "Username"; E = { $_.username } },
                                @{Name = "VM Linking"; Expression = { $_.conflictResolutionAuthz } },
                                @{Name = "Certificate"; E = { $_.caCerts } }
                                Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Cluster Settings] Retrieving vCloud Director Information"
                                $VMwareVCD = Get-RubrikVCD | Where-Object { $_.PrimaryClusterId -eq (Get-RubrikSetting).id } | Select-Object @{N = "Name"; E = { $_.name } },
                                @{N = "Hostname"; E = { $_.hostname } },
                                @{N = "Username"; E = { $_.username } },
                                @{Name = "Connection Status"; Expression = { $_.connectionStatus.status } },
                                @{Name = "Connection Message"; Expression = { $_.connectionStatus.message } },
                                @{N = "Certificate"; E = { $_.caCerts } }
                                Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Cluster Settings] Retrieving Nutanix Information"
                                if ($null -ne $NutanixClusters -and 0 -ne $NutanixClusters[0].total) {
                                    $NutanixClusters = Get-RubrikNutanixCluster -PrimaryClusterId "local" -DetailedObject | Select-Object @{N = "Name"; E = { $_.name } },
                                    @{N = "Hostname"; E = { $_.hostname } },
                                    @{N = "Username"; E = { $_.username } },
                                    @{Name = "Connection Status"; Expression = { $_.connectionStatus.status } },
                                    @{N = "Certificate"; E = { $_.caCerts } }
                                } else {
                                    Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Cluster Settings] No Nutanix clusters detected, setting to null"
                                    $NutanixClusters = $null
                                }
                                Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Cluster Settings] Retrieving SCVMM Information"
                                if ($null -ne $SCVMMServers -and 0 -ne $SCVMMServers[0].total) {
                                    $SCVMMServers = Get-RubrikScvmm -PrimaryClusterId "local" -DetailedObject | Select-Object @{N = "Name"; E = { $_.name } },
                                    @{N = "Hostname"; E = { $_.hostname } },
                                    @{N = "Run As"; E = { $_.runAsAccount } },
                                    @{N = "Connection Status"; E = { $_.status } },
                                    @{N = "Deploy Agent"; E = { $_.shouldDeployAgent } }
                                } else {
                                    Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Cluster Settings] No SCVMM hosts detected, setting to null"
                                    $SCVMMServers = $null
                                }
                                Write-PScriboMessage -message "[Rubrik] [$($brik)] [Cluster Settings] Retrieving Windows Hosts Information"
                                if ($null -ne $WindowsHosts -and 0 -ne $WindowsHosts[0].total) {
                                    $WindowsHosts = Get-RubrikHost -PrimaryClusterId "local" -Type "Windows" -DetailedObject | Select-Object @{N = "Name"; E = { $_.name } },
                                    @{N = "Hostname"; E = { $_.hostname } },
                                    @{N = "Operating System"; E = { $_.operatingSystem } },
                                    @{N = "Connection Status"; E = { $_.status } },
                                    @{N = "Compression Enabled"; E = { $_.compressionEnabled } },
                                    @{N = "Agent ID"; E = { $_.agentId } },
                                    @{N = "MSSQL CBT Driver Installed"; E = { $_.mssqlCbtDriverInstalled } },
                                    @{N = "MSSQL CBT Enabled"; E = { $_.mssqlCbtEnabled } },
                                    @{N = "MSSQL CBT Status"; E = { $_.mssqlCbtEffectiveStatus } },
                                    @{N = "VFD Driver State"; E = { $_.hostVfdDriverState } },
                                    @{N = "VFD Enabled"; E = { $_.hostVfdEnabled } },
                                    @{N = "Is Relic"; E = { $_.isRelic } }
                                } else {
                                    Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Cluster Settings] No Windows hosts detected, setting to null"
                                    $WindowsHosts = $null
                                }
                                Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Cluster Settings] Retrieving Linux Hosts Information"
                                if ($null -ne $LinuxHosts -and 0 -ne $LinuxHosts[0].total) {
                                    $LinuxHosts = Get-RubrikHost -PrimaryClusterId "local" -Type "Linux" -DetailedObject | Select-Object @{N = "Name"; E = { $_.name } },
                                    @{N = "Hostname"; E = { $_.hostname } },
                                    @{N = "Operating System"; E = { $_.operatingSystem } },
                                    @{N = "Connection Status"; E = { $_.status } },
                                    @{N = "Compression Enabled"; E = { $_.compressionEnabled } },
                                    @{N = "Agent ID"; E = { $_.agentId } },
                                    @{N = "MSSQL CBT Driver Installed"; E = { $_.mssqlCbtDriverInstalled } },
                                    @{N = "MSSQL CBT Enabled"; E = { $_.mssqlCbtEnabled } },
                                    @{N = "MSSQL CBT Status"; E = { $_.mssqlCbtEffectiveStatus } },
                                    @{N = "VFD Driver State"; E = { $_.hostVfdDriverState } },
                                    @{N = "VFD Enabled"; E = { $_.hostVfdEnabled } },
                                    @{N = "Is Relic"; E = { $_.isRelic } }
                                } else {
                                    Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Cluster Settings] No Linux hosts detected, setting to null"
                                    $LinuxHosts = $null
                                }
                            }


                            if (0 -ne ($VMwarevCenter | Measure-Object).count ) {
                                Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Cluster Settings] Outputing vCenter Information"
                                Section -Style Heading4 'VMware vCenter Servers' {
                                    Paragraph "The following table outlines the VMware vCenter Servers which have been added to the Rubrik cluster"
                                    if ($InfoLevel.Cluster -lt 3) { $VMwarevCenter | Table -Name 'VMware vCenter Server' }
                                    else { $VMwarevCenter | Table -Name 'VMware vCenter Server' -ColumnWidths 30, 70 -List }
                                }
                            }
                            if (0 -ne ($VMwareVCD | Measure-Object).count ) {
                                Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Cluster Settings] Output vCloud Director Information"
                                Section -Style Heading4 'VMware vCloud Director Clusters' {
                                    Paragraph "The following table outlines the VMware vCloud Director clusters which have been added to the Rubrik cluster"
                                    if ($InfoLevel.Cluster -lt 3) { $VMwareVCD | Table -Name 'VMware vCloud Director Clusters' }
                                    else { $VMwareVCD | Table -Name 'VMware vCloud Director Clusters' -ColumnWidths 30, 70 -List }
                                }
                            }
                            if (0 -ne ($SCVMMServers | Measure-Object).count ) {
                                Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Cluster Settings] Output Hyper-V Information"
                                Section -Style Heading4 'Hyper-V SCVMM Servers' {
                                    Paragraph "The following table outlines the SCVMM Servers which have been added to the Rubrik cluster"
                                    if ($InfoLevel.Cluster -lt 3) { $SCVMMServers | Table -Name 'Hyper-V SCVMM Servers' }
                                    else { $SCVMMServers | Table -Name 'Hyper-V SCVMM Servers' -ColumnWidths 30, 70 -List }
                                }
                            }
                            if (0 -ne ($NutanixClusters | Measure-Object).count ) {
                                Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Cluster Settings] Output Nutanix Information"
                                Section -Style Heading4 'Nutanix Clusters' {
                                    Paragraph "The following table outlines the Nutanix clusters which have been added to the Rubrik cluster"
                                    if ($InfoLevel.Cluster -lt 3) { $NutanixClusters | Table -Name 'Nutanix Clusters' }
                                    else { $NutanixClusters | Table -Name 'Nutanix Clusters' -ColumnWidths 30, 70 -List }
                                }
                            }
                            if (0 -ne ($WindowsHosts | Measure-Object).count ) {
                                Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Cluster Settings] Output Windows Host Information"
                                Section -Style Heading4 'Windows Hosts' {
                                    Paragraph "The following table outlines the Windows Hosts which have been added to the Rubrik cluster"
                                    if ($InfoLevel.Cluster -lt 3) { $WindowsHosts | Table -Name 'Windows Hosts' }
                                    else { $WindowsHosts | Table -Name 'Windows Hosts' -ColumnWidths 30, 70 -List }
                                }
                            }
                            if (0 -ne ($LinuxHosts | Measure-Object).count ) {
                                Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Cluster Settings] Output Linux Host Information"
                                Section -Style Heading4 'Linux Hosts' {
                                    Paragraph "The following table outlines the Linux Hosts which have been added to the Rubrik cluster"
                                    if ($InfoLevel.Cluster -lt 3) { $LinuxHosts | Table -Name 'Linux Hosts' }
                                    else { $LinuxHosts | Table -Name 'Linux Hosts' -ColumnWidths 30, 70 -List }
                                }
                            }
                        } # End Heading 3 Backup Sources
                        Section -Style Heading3 'Replication Configuration' {
                            Paragraph "The following contains information around the replication configuration on the cluster"
                            Write-PScriboMessage -message "[Rubrik] [$($brik)] [Cluster Settings] Retrieving Replication Sources"
                            $ReplicationSources = Get-RubrikReplicationSource | Select-Object @{N = "Cluster Name"; E = { $_.sourceClusterName } },
                            @{N = "Cluster Address"; E = { $_.sourceClusterAddress } },
                            @{N = "Cluster UUID"; E = { $_.sourceClusterUuid } },
                            @{N = "Replication Network Setup"; E = { $_.replicationSetup } }
                            Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Cluster Settings] Retrieving Replication Targets"
                            $ReplicationTargets = Get-RubrikReplicationTarget | Select-Object @{N = "Cluster Name"; E = { $_.targetClusterName } },
                            @{N = "Cluster Address"; E = { $_.targetClusterAddress } },
                            @{N = "Cluster UUID"; E = { $_.targetClusterUuid } },
                            @{N = "Replication Network Setup"; E = { $_.replicationSetup } }
                            Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Cluster Settings] Output Replication Sources"
                            if (($ReplicationSources | Measure-Object).count -gt 0) {
                                Section -Style Heading4 'Replication Sources' {
                                    Paragraph "The following table outlines locations which have been configured as a replication source to this cluster"
                                    $ReplicationSources | Table -Name 'Replication Sources'
                                }
                            }
                            Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Cluster Settings] Output Replication Targets"
                            if (($ReplicationTargets | Measure-Object).count -gt 0) {
                                Section -Style Heading4 'Replication Targets' {
                                    Paragraph "The following table outlines locations which have been configured as a replication targets for this cluster"
                                    $ReplicationTargets | Table -Name 'Replication Targets'
                                }
                            }
                        } # End Heading 3 Replication Configuration
                        Section -Style Heading3 'Archive Targets' {
                            Paragraph "The following contains information around configured archive targets on the cluster"
                            # Gather Information
                            # Global Configs for all InfoLevels
                            Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Cluster Settings] Retrieving Archive Information"
                            $ArchiveTargets = Get-RubrikArchive | Select-Object -Property @{N = "Name"; E = { $_.name } },
                            @{N = "Bucket"; E = { $_.bucket } }, @{N = "State"; E = { $_.currentState } },
                            @{N = "LocationType"; E = { $_.locationType } }
                            if ($InfoLevel.Cluster -lt 3) {
                                Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Cluster Settings] Output S3 Targets"
                                Section -Style Heading4 'S3 Targets' {
                                    if ( ($ArchiveTargets | Where-Object { $_.locationType -eq 'S3' -or $_.locationType -eq 'S3Compatible' } | Measure-Object ).count -gt 0) {
                                        $ArchiveTargets | Where-Object { $_.locationType -eq 'S3' -or $_.locationType -eq 'S3Compatible' } | Table -Name 'S3 Archives'
                                    } else { Paragraph "There are currently no S3 targets configured on the cluster." }
                                }
                                Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Cluster Settings] Output Glacier Targets"
                                Section -Style Heading4 'Glacier Targets' {
                                    if (($ArchiveTargets | Where-Object { $_.locationType -eq 'Glacier' } | Measure-Object  ).count -gt 0) {
                                        $ArchiveTargets | Where-Object { $_.locationType -eq 'Glacier' } | Table -Name 'Glacier Archives'
                                    } else { Paragraph "There are currently no Glacier targets configured on the cluster." }
                                }
                                Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Cluster Settings] Output Azure Targets"
                                Section -Style Heading4 'Azure Targets' {
                                    if (($ArchiveTargets | Where-Object { $_.locationType -eq 'Azure' } | Measure-Object ).count -gt 0) {
                                        $ArchiveTargets | Where-Object { $_.locationType -eq 'Azure' } | Table -Name 'Azure Archives'
                                    } else { Paragraph "There are currently no Azure targets configured on the cluster." }
                                }
                                Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Cluster Settings] Output Google Targets"
                                Section -Style Heading4 'Google Targets' {
                                    if (($ArchiveTargets | Where-Object { $_.locationType -eq 'Google' } | Measure-Object  ).count -gt 0) {
                                        $ArchiveTargets | Where-Object { $_.locationType -eq 'Google' } | Table -Name 'Google Archives'
                                    } else { Paragraph "There are currently no Google Cloud targets configured on the cluster." }
                                }
                                Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Cluster Settings] Output NFS Targets"
                                Section -Style Heading4 'NFS Targets' {
                                    if (($ArchiveTargets | Where-Object { $_.locationType -eq 'Nfs' } | Measure-Object ).count -gt 0) {
                                        $ArchiveTargets | Where-Object { $_.locationType -eq 'NFS' } | Table -Name 'NFS Archives'
                                    } else { Paragraph "There are currently no NFS targets configured on the cluster." }
                                }
                                Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Cluster Settings] Output Tape Targets"
                                Section -Style Heading4 'Tape Targets' {
                                    if (($ArchiveTargets | Where-Object { $_.locationType -eq 'Qstar' } | Measure-Object  ).count -gt 0) {
                                        $ArchiveTargets | Where-Object { $_.locationType -eq 'QStar' } | Table -Name 'Tape Archives'
                                    } else { Paragraph "There are currently no tape targets configured on the cluster." }
                                }
                            } else {
                                Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Cluster Settings] Output S3 Targets"
                                Section -Style Heading4 'S3 Archive Targets' {
                                    if ( ($ArchiveTargets | Where-Object { $_.locationType -eq 'S3' } | Measure-Object ).count -gt 0) {
                                        $S3Targets = Get-RubrikArchive -ArchiveType S3 -DetailedObject | Select-Object @{Name = "Name"; Expression = { $_.definition.name } },
                                        @{Name = "Bucket"; Expression = { $_.definition.bucket } },
                                        @{Name = "Region"; Expression = { $_.definition.defaultRegion } },
                                        @{Name = "Storage Class"; Expression = { $_.definition.storageClass } },
                                        @{Name = "Consolidation Enabled"; Expression = { $_.definition.isConsolidationEnabled } },
                                        @{Name = "Encryption Type"; Expression = { $_.definition.encryptionType } },
                                        @{Name = "Access Key"; Expression = { $_.definition.accessKey } },
                                        @{Name = "Compute Enabled"; Expression = { $_.definition.isComputeEnabled } },
                                        @{Name = "Security Group"; Expression = { $_.definition.defaultComputeNetworkConfig.securityGroupId } },
                                        @{Name = "VPC"; Expression = { $_.definition.defaultComputeNetworkConfig.vNetId } },
                                        @{Name = "Subnet"; Expression = { $_.definition.defaultComputeNetworkConfig.subnetId } }
                                        $S3Targets | Table -Name 'S3 Archives' -List -ColumnWidths 30, 70
                                    } else { Paragraph "There are currently no S3 targets configured on the cluster." }
                                }
                                Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Cluster Settings] Output Glacier Targets"
                                Section -Style Heading4 'Glacier Targets' {
                                    if (($ArchiveTargets | Where-Object { $_.locationType -eq 'Glacier' } | Measure-Object  ).count -gt 0) {
                                        $GlacierTargets = Get-RubrikARchive -ArchiveType Glacier -DetailedObject | Select-Object @{Name = "Name"; Expression = { $_.definition.name } },
                                        @{Name = "Host"; Expression = { $_.definition.host } },
                                        @{Name = "Export"; Expression = { $_.definition.exportDir } },
                                        @{Name = "Available Space (TB)"; Expression = { $_.availableSpace / 1TB } }
                                        @{Name = "Auth Type"; Expression = { $_.definition.authType } },
                                        @{Name = "Version"; Expression = { $_.definition.nfsVersion } },
                                        @{Name = "Consolidation Enabled"; Expression = { $_.definition.isConsolidationEnabled } },
                                        @{Name = "File Lock Period (seconds)"; Expression = { $_.definition.fileLockPeriodInSeconds } },
                                        @{Name = "NFS Options"; Expression = { $_.definition.otherNfsOptions } }
                                    } else { Paragraph "There are currently no Glacier targets configured on the cluster." }
                                }
                                Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Cluster Settings] Output Azure Targets"
                                Section -Style Heading4 'Azure Targets' {
                                    if (($ArchiveTargets | Where-Object { $_.locationType -eq 'Azure' } | Measure-Object ).count -gt 0) {
                                        $AzureTargets = Get-RubrikArchive -ArchiveType Azure -DetailedObject | Select-Object @{Name = "Name"; Expression = { $_.definition.name } },
                                        @{Name = "Bucket"; Expression = { $_.definition.bucket } },
                                        @{Name = "Region"; Expression = { $_.definition.azureComputeSummary.region } },
                                        @{Name = "Storage Account"; Expression = { $_.definition.azureComputeSummary.generalPurposeStorageAccountName } },
                                        @{Name = "Container Name"; Expression = { $_.definition.azureComputeSummary.containerName } },
                                        @{Name = "Consolidation Enabled"; Expression = { $_.definition.isConsolidationEnabled } },
                                        @{Name = "Encryption Type"; Expression = { $_.definition.encryptionType } },
                                        @{Name = "Access Key"; Expression = { $_.definition.accessKey } },
                                        @{Name = "Compute Enabled"; Expression = { $_.definition.isComputeEnabled } },
                                        @{Name = "Security Group"; Expression = { $_.definition.defaultComputeNetworkConfig.securityGroupId } },
                                        @{Name = "Network"; Expression = { $_.definition.defaultComputeNetworkConfig.vNetId } },
                                        @{Name = "Subnet"; Expression = { $_.definition.defaultComputeNetworkConfig.subnetId } },
                                        @{Name = "Resource Group"; Expression = { $_.definition.defaultComputeNetworkConfig.resourceGroupId } }

                                        $AzureTargets | Table -Name 'Azure Archive Targets' -List -ColumnWidths 30, 70
                                    } else { Paragraph "There are currently no Azure targets configured on the cluster." }
                                }
                                Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Cluster Settings] Output Google Cloud Targets"
                                Section -Style Heading4 'Google Targets' {
                                    if (($ArchiveTargets | Where-Object { $_.locationType -eq 'Google' } | Measure-Object  ).count -gt 0) {
                                    } else { Paragraph "There are currently no Google Cloud targets configured on the cluster." }
                                }
                                Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Cluster Settings] Output NFS Targets"
                                Section -Style Heading4 'NFS Targets' {
                                    if (($ArchiveTargets | Where-Object { $_.locationType -eq 'NFS' } | Measure-Object  ).count -gt 0) {
                                        $NFSTargets = Get-RubrikARchive -ArchiveType Nfs -DetailedObject | Select-Object @{Name = "Name"; Expression = { $_.definition.name } },
                                        @{Name = "Host"; Expression = { $_.definition.host } },
                                        @{Name = "Bucket"; Expression = { $_.definition.bucket } },
                                        @{Name = "Export"; Expression = { $_.definition.exportDir } },
                                        @{Name = "Available Space (TB)"; Expression = { $_.availableSpace / 1TB } }
                                        @{Name = "Auth Type"; Expression = { $_.definition.authType } },
                                        @{Name = "Version"; Expression = { $_.definition.nfsVersion } },
                                        @{Name = "Consolidation Enabled"; Expression = { $_.definition.isConsolidationEnabled } },
                                        @{Name = "File Lock Period (seconds)"; Expression = { $_.definition.fileLockPeriodInSeconds } },
                                        @{Name = "NFS Options"; Expression = { $_.definition.otherNfsOptions } }

                                        $NFSTargets | Table -Name 'NFS Archive Targets' -List -ColumnWidths 30, 70
                                    } else { Paragraph "There are currently no NFS targets configured on the cluster." }
                                }
                                Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Cluster Settings] Output Tape Targets"
                                Section -Style Heading4 'Tape Targets' {
                                    if (($ArchiveTargets | Where-Object { $_.locationType -eq 'Qstar' } | Measure-Object  ).count -gt 0) {
                                    } else { Paragraph "There are currently no tape targets configured on the cluster." }
                                }
                            }
                        } # End Heading 3 Archive Targets
                    } #End Heading 2
                    Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Cluster Settings] Cluster Settings Section Complete"
                }# end of Infolevel 1
                if ($InfoLevel.SLADomains -ge 1) {
                    Write-PScriboMessage -Message "[Rubrik] [$($brik)] [SLA Domains] Beginning SLA Domain Section with Info Level $($InfoLevel.SLADomains)"
                    Section -Style Heading2 "SLA Domains" {
                        Paragraph ("The following section provides information on the configured SLA Domains")
                        BlankLine
                        if ($InfoLevel.SLADomains -lt 3) {
                            Write-PScriboMessage -Message "[Rubrik] [$($brik)] [SLA Domains] Retrieving SLA Domain Information"
                            $SLADomains = Get-RubrikSLA -PrimaryClusterId 'local' | Select-Object @{N = "Name"; E = { $_.name } },
                            @{N = "Base Frequency"; E = { if ($_.frequencies.hourly) { '{0} Hours' -f $_.frequencies.hourly.frequency } elseif ($_.frequencies.daily) { '{0} Days' -f $_.frequencies.daily.frequency } } },
                            @{N = "Object Count"; E = { $_.numProtectedObjects } },
                            @{N = "Archival Location"; E = { (Get-RubrikArchive -id $_.archivalSpecs.locationId).Name } },
                            @{N = "Replication Location"; E = { (Get-RubrikReplicationTarget -id $_.replicationSpecs.locationId).targetClusterName } }
                            Write-PScriboMessage -Message "[Rubrik] [$($brik)] [SLA Domains] Output SLA Domain Information"
                            $SLADomains | Table -Name 'SLA Domain Summary'
                        } elseif ($InfoLevel.SLADomains -le 5) {
                            $SLADomains = Get-RubrikSLA -PrimaryClusterId 'local'
                            foreach ($SLADomain in $SLADomains) {
                                Section -Style Heading3 $SLADomain.name {
                                    Write-PScriboMessage -Message "[Rubrik] [$($brik)] [SLA Domains] Retrieving detailed SLA Domain Information for $($sladomain.name)"
                                    Paragraph ("The following outlines the configuration options for $($sladomain.name)")

                                    Section -Style Heading4 "General Settings" {
                                        $BaseFrequency = if ($SLADomain.frequencies.hourly) {
                                            '{0} Hours' -f $SLADomain.frequencies.hourly.frequency
                                        } elseif ($SLADomain.frequencies.daily) {
                                            '{0} Days' -f $SLADomain.frequencies.daily.frequency
                                        }
                                        if ($null -ne $SLADomain.archivalSpecs.locationId) {
                                            $ArchiveLocationName = (Get-RubrikArchive -id $SLADomain.archivalSpecs.locationId).Name
                                        } else { $ArchiveLocationName = "" }
                                        if ($null -ne $SLADomain.replicationSpecs.locationId) {
                                            $ReplicationLocationName = (Get-RubrikReplicationTarget -id $SLADomain.replicationSpecs.locationId).targetClusterName
                                        } else { $ReplicationLocationName = "" }
                                        $SLAGeneral = [ordered] @{
                                            'ID' = $SLADomain.id
                                            'Name' = $SLADomain.name
                                            'Object Count' = $SLADomain.numProtectedObjects
                                            'Base Frequency' = $BaseFrequency
                                            'Archival Location' = $ArchiveLocationName
                                            'Replication Target' = $ReplicationLocationName
                                        }
                                        Write-PScriboMessage -Message "[Rubrik] [$($brik)] [SLA Domains] Output SLA Domain General Settings"
                                        [PSCustomObject]$SLAGeneral | Table -Name "General Settings" -ColumnWidths 30, 70 -List
                                    }
                                    Section -Style Heading4 "SLA Frequency Settings" {
                                        Write-PScriboMessage -Message "[Rubrik] [$($brik)] [SLA Domains] Retrieving SLA Domain Frequency Information"
                                        if ($null -ne $SLADomain.advancedUiConfig -and '' -ne $SLADomain.advancedUiConfig) {
                                            $SLAFrequency = @()

                                            if ($null -ne $SLADomain.frequencies.hourly.retention) {
                                                $HourlyRetentionType = ($SLADomain.advancedUiConfig | Where-Object { $_.timeUnit -eq 'Hourly' }).retentionType
                                                switch ($HourlyRetentionType) {
                                                    "Weekly" { $HourlyRetention = "$($SLADomain.frequencies.hourly.retention) Week(s)" }
                                                    "Daily" { $HourlyRetention = "$($SLADomain.frequencies.hourly.retention) Day(s)" }
                                                }

                                                $hourly = [ordered]@{
                                                    'Take backups every' = "$($SLADomain.frequencies.hourly.frequency) hour(s)"
                                                    'Retain backups for' = $HourlyRetention
                                                }
                                                $SLAFrequency += [pscustomobject]$hourly
                                            }
                                            if ($null -ne $SLADomain.frequencies.daily.retention) {
                                                $DailyRetentionType = ($SLADomain.advancedUiConfig | Where-Object { $_.timeUnit -eq 'Daily' }).retentionType
                                                switch ($DailyRetentionType) {
                                                    "Weekly" { $DailyRetention = "$($SLADomain.frequencies.daily.retention) Week(s)" }
                                                    "Daily" { $DailyRetention = "$($SLADomain.frequencies.daily.retention) Day(s)" }
                                                }
                                                $daily = [ordered]@{
                                                    'Take backups every' = "$($SLADomain.frequencies.daily.frequency) day(s)"
                                                    'Retain backups for' = $DailyRetention
                                                }
                                                $SLAFrequency += [pscustomobject]$daily
                                            }
                                            if ($null -ne $SLADomain.frequencies.weekly.retention) {
                                                #Weekly Retention is always weeks
                                                $WeeklyRetention = "$($SLADomain.frequencies.weekly.retention) Week(s)"
                                                $weekly = [ordered]@{
                                                    'Take backups every' = "$($SLADomain.frequencies.weekly.frequency) Week(s) on $($SLADomain.frequencies.weekly.dayOfWeek)"
                                                    'Retain backups for' = $WeeklyRetention
                                                }
                                                $SLAFrequency += [pscustomobject]$weekly
                                            }
                                            if ($null -ne $SLADomain.frequencies.monthly.retention) {
                                                $MonthlyBackupTime = $SLADomain.frequencies.monthly.dayofMonth
                                                switch ($MonthlyBackupTime) {
                                                    "LastDay" { $MonthStart = "the last day of the month." }
                                                    "Fifteenth" { $MonthStart = "the 15th day of the month." }
                                                    "FirstDay" { $MonthStart = "the first day of the month." }
                                                }
                                                $MonthlyRetentionType = ($SLADomain.advancedUiConfig | Where-Object { $_.timeUnit -eq 'Monthly' }).retentionType
                                                switch ($MonthlyRetentionType) {
                                                    "Monthly" { $MonthlyRetention = "$($SLADomain.frequencies.monthly.retention) Month(s)" }
                                                    "Quarterly" { $MonthlyRetention = "$($SLADomain.frequencies.monthly.retention) Quarter(s)" }
                                                    "Yearly" { $MonthlyRetention = "$($SLADomain.frequencies.monthly.retention) Year(s)" }
                                                }
                                                $monthly = [ordered]@{
                                                    'Take backups every' = "$($SLADomain.frequencies.monthly.frequency) Month(s) on $MonthStart"
                                                    'Retain backups for' = $MonthlyRetention
                                                }
                                                $SLAFrequency += [pscustomobject]$monthly
                                            }
                                            if ($null -ne $SLADomain.frequencies.quarterly.retention) {
                                                $QuarterlyBackupTime = $SLADomain.frequencies.quarterly.dayofQuarter
                                                switch ($QuarterlyBackupTime) {
                                                    "LastDay" { $QuarterStart = "the last day of the quarter" }
                                                    "FirstDay" { $QuarterStart = "the first day of the quarter" }
                                                }
                                                $QuarterMonthStart = $SLADomain.frequencies.quarterly.firstQuarterStartMonth

                                                $QuarterRetentionType = ($SLADomain.advancedUiConfig | Where-Object { $_.timeUnit -eq 'Quarterly' }).retentionType
                                                switch ($QuarterRetentionType) {
                                                    "Quarterly" { $QuarterRetention = "$($SLADomain.frequencies.quarterly.retention) Quarter(s)" }
                                                    "Yearly" { $QuarterRetention = "$($SLADomain.frequencies.quarterly.retention) Year(s)" }
                                                }
                                                $quarterly = [ordered]@{
                                                    'Take backups every' = "$($SLADomain.frequencies.quarterly.frequency) Quarter(s) on $QuarterStart begining in $QuarterMonthStart"
                                                    'Retain backups for' = $QuarterRetention
                                                }
                                                $SLAFrequency += [pscustomobject]$quarterly
                                            }
                                            if ($null -ne $SLADomain.frequencies.yearly.retention) {
                                                $YearlyBackupTime = $SLADomain.frequencies.yearly.dayOfYear
                                                switch ($YearlyBackupTime) {
                                                    "LastDay" { $YearStart = "the last day of the year" }
                                                    "FirstDay" { $YearStart = "the first day of the year" }
                                                }
                                                $YearMonthStart = $SLADomain.frequencies.yearly.yearStartMonth

                                                #Yearly time unit is always years
                                                $YearlyRetention = "$($SLADomain.frequencies.yearly.retention) Year(s)"
                                                $yearly = [ordered]@{
                                                    'Take backups every' = "$($SLADomain.frequencies.yearly.frequency) Year(s) on $YearStart begining in $YearMonthStart"
                                                    'Retain backups for' = $YearlyRetention
                                                }
                                                $SLAFrequency += [pscustomobject]$yearly
                                            }
                                        } else {
                                            $SLAFrequency = @()

                                            if ($null -ne $SLADomain.frequencies.hourly.retention) {
                                                if ($SLADomain.frequencies.hourly.retention -gt 23) {
                                                    $HourlyRetention = "$($SLADomain.frequencies.hourly.retention/24) Day(s)"
                                                } else { $HourlyRetention = "$($SLADomain.frequencies.hourly.retention) Hour(s)" }
                                                $hourly = @{
                                                    'Take backups every' = "$($SLADomain.frequencies.hourly.frequency) Hour(s)"
                                                    'Retain backups for' = $HourlyRetention
                                                }
                                                $SLAFrequency += [pscustomobject]$hourly
                                            }
                                            if ($null -ne $SLADomain.frequencies.daily.retention) {
                                                $daily = @{
                                                    'Take backups every' = "$($SLADomain.frequencies.daily.frequency) Day(s)"
                                                    'Retain backups for' = "$($SLADomain.frequencies.daily.retention) Day(s)"
                                                }
                                                $SLAFrequency += [pscustomobject]$daily
                                            }
                                            if ($null -ne $SLADomain.frequencies.monthly.retention) {
                                                $monthly = @{
                                                    'Take backups every' = "$($SLADomain.frequencies.monthly.frequency) Month(s)"
                                                    'Retain backups for' = "$($SLADomain.frequencies.monthly.retention) Month(s)"
                                                }
                                                $SLAFrequency += [pscustomobject]$monthly
                                            }
                                            if ($null -ne $SLADomain.frequencies.yearly.retention) {
                                                $yearly = @{
                                                    'Take backups every' = "$($SLADomain.frequencies.yearly.frequency) Year(s)"
                                                    'Retain backups for' = "$($SLADomain.frequencies.yearly.retention) Year(s)"
                                                }
                                                $SLAFrequency += [pscustomobject]$yearly
                                            }
                                        }
                                        Write-PScriboMessage -Message "[Rubrik] [$($brik)] [SLA Domains] Output SLA Domain Frequency Settings"
                                        $SLAFrequency | Table -Name "SLA Frequencies" -Columns 'Take backups every', 'Retain backups for'
                                    }
                                    Section -Style Heading4 "SLA Backup Window" {
                                        if ($SLADomain.allowedBackupWindows) {
                                            $starthour = $SLADomain.allowedBackupWindows.startTimeAttributes.hour
                                            $startminutes = $SLADomain.allowedBackupWindows.startTimeAttributes.minutes
                                            if (0 -eq $startminutes) { $startminutes = "00" }

                                            $startdatetime = Get-Date -Date "1978-10-04 $starthour`:$startminutes"
                                            $enddatetime = $startDatetime.AddHours($SLADomain.allowedBackupWindows.durationInHours)

                                            $backupWindowString = "From " + $startdatetime.TOString("h:mm tt") + " to " + $enddatetime.TOString("h:mm tt")
                                        } else {
                                            $backupWindowString = "No backup window defined"
                                        }


                                        if ($firstFullAllowedBackupWindows) {


                                        } else {
                                            $firstFullString = "First Opportunity"
                                        }

                                        if ($SLADomain.firstFullAllowedBackupWindows) {

                                            $startday = $SLADomain.firstFullAllowedBackupWindows.startTimeAttributes.dayOfWeek
                                            $starthour = $SLADomain.firstFullAllowedBackupWindows.startTimeAttributes.hour
                                            $startminutes = $SLADomain.firstFullAllowedBackupWindows.startTimeAttributes.minutes
                                            if (0 -eq $startminutes) { $startminutes = "00" }

                                            switch ($startday) {
                                                1 { $startday = "Sunday" }
                                                2 { $startday = "Monday" }
                                                3 { $startday = "Tuesday" }
                                                4 { $startday = "Wednesday" }
                                                5 { $startday = "Thursday" }
                                                6 { $startday = "Friday" }
                                                7 { $startday = "Saturday" }
                                            }

                                            $startdate = @(@(0..7) | ForEach-Object { $(Get-Date).AddDays($_) } | Where-Object { $_.DayOfWeek -ieq "$startday" })[0]

                                            $startdate = Get-Date -Date "$($startdate.Year)-$($startdate.month)-$($startdate.day) $starthour`:$startminutes"
                                            $enddate = $startdate.addHours($SLADomain.firstFullAllowedBackupWindows.durationinHours)
                                            $firstFullString = "Between " + $startdate.DayOfWeek + " at " + $startdate.ToString("h:mm tt") + " and " + $enddate.DayOfWeek + " at " + $enddate.TOString("h:mm tt")

                                        } else {
                                            $firstFullString = "First Opportunity"
                                        }

                                        $BackupWindows = @{
                                            'Backup Window' = "$backupWindowString"
                                            'Take First Full' = "$firstFullString"
                                        }
                                        Write-PScriboMessage -Message "[Rubrik] [$($brik)] [SLA Domains] Output SLA Domain Backup Windows"
                                        [pscustomobject]$BackupWindows | Table -Name "SLA Backup Windows" -Columns "Backup Window", "Take First Full" -List
                                    }
                                    Section -Style Heading4 "SLA Archival Settings" {
                                        if ($null -ne $SLADomain.archivalSpecs.locationId) {
                                            Write-PScriboMessage -Message "[Rubrik] [$($brik)] [SLA Domains] Retrieving SLA Domain Archive Information"
                                            $ArchiveInformation = Get-RubrikArchive -id $SLADomain.archivalSpecs.locationId -DetailedObject

                                            $Archive = [ordered] @{
                                                'Name' = $ArchiveInformation.definition.name
                                                'Archive Location Type' = $ArchiveInformation.locationType
                                                'Archive data after' = "$($SLADomain.archivalSpecs.archivalThreshold/60/60/24) Day(s)"
                                            }
                                            Write-PScriboMessage -Message "[Rubrik] [$($brik)] [SLA Domains] Output SLA Domain Archive Information"
                                            [pscustomobject]$Archive | Table -Name "Archival Information" -List -ColumnWidths 30, 70
                                        } else {
                                            Paragraph ("SLA Domain is not configured for archival")
                                        }
                                    }
                                    Section -Style Heading4 "SLA Replication Settings" {
                                        if ($null -ne $SLADomain.replicationSpecs.locationId) {
                                            Write-PScriboMessage -Message "[Rubrik] [$($brik)] [SLA Domains] Retrieving SLA Domain Replication Settings"
                                            $ReplicationInformation = Get-RubrikReplicationTarget -id $SLADomain.replicationSpecs.locationId

                                            $Replication = [ordered] @{
                                                'Name' = $ReplicationInformation.targetClusterName
                                                'Target Replication Cluster Address' = $ReplicationInformation.targetClusterAddress
                                                'Keep Replica on target cluster for' = "$($SLADomain.replicationSpecs.retentionLimit/60/60/24) Day(s)"
                                            }
                                            Write-PScriboMessage "[Rubrik] [$($brik)] [SLA Domains] Output SLA Domain Replication Settings"
                                            [pscustomobject]$Replication | Table -Name "Replication Information" -List -ColumnWidths 30, 70
                                        } else {
                                            Paragraph ("SLA Domain is not configured for replication")
                                        }
                                    }

                                    Section -Style Heading4 "SLA Protected Object Count" {
                                        if ($SLADomain.numProtectedObjects -gt 0) {
                                            Write-PScriboMessage -Message "[Rubrik] [$($brik)] [SLA Domains] Output SLA Domain Protected Object Summary"
                                            $SLADomain | Table -Name "Protected Object Summary" -Columns numVms, numHypervVms, numNutanixVms, numVcdVapps, numEc2Instances, numDbs, numOracleDbs, numFilesets, numWindowsVolumeGroups, numManagedVolumes, numShares, numStorageArrayVolumeGroups -Headers 'VMware VMs', 'HyperV VMs', 'Nutanix VMs', 'VCD vApps', 'EC2 Instances', 'MSSQL DBs', 'Oracle DBs', 'Filesets', 'Windows Volume Groups', 'Managed Volumes', 'NAS Shares', 'Storage Array Volumes' -List -ColumnWidths 30, 70
                                        } else {
                                            Paragraph ("There are no objects assigned to this SLA Domain")
                                        }

                                    }

                                    if ($InfoLevel.SLADomains -eq 5) {
                                        Section -Style Heading4 "SLA Protected Objects Details" {
                                            Paragraph ("The following displays details about the objects protected by this SLA Domain")
                                            if ($SLADomain.numProtectedObjects -gt 0) {
                                                if ($SLADomain.numVms -gt 0) {
                                                    Section -Style Heading5 "VMware VMs" {
                                                        Write-PScriboMessage -Message "[Rubrik] [$($brik)] [SLA Domains] Retrieving VMware VMs protected by SLA"
                                                        $Objects = Get-RubrikVM -SLAID $SLADomain.Id | Select-Object -Property @{N = "Name"; E = { $_.name } }, @{N = "Assignment Type"; E = { $_.slaAssignment } } | Sort-Object -Property Name
                                                        Write-PScriboMessage -Message "[Rubrik] [$($brik)] [SLA Domains] Output Protected VMware VMS"
                                                        $Objects | Table -Name "Protected VMware VMs" -ColumnWidths 50, 50
                                                    }
                                                }
                                                if ($SLADomain.numHyperVvms -gt 0) {
                                                    Section -Style Heading5 "HyperV VMs" {
                                                        Write-PScriboMessage -Message "[Rubrik] [$($brik)] [SLA Domains] Retrieving protected Hyper-V VMs"
                                                        $Objects = Get-RubrikHyperVVM -SLAID $SLADomain.Id | Select-Object -Property @{N = "Name"; E = { $_.name } }, @{N = "Assignment Type"; E = { $_.slaAssignment } } | Sort-Object -Property Name
                                                        Write-PScriboMessage -Message "[Rubrik] [$($brik)] [SLA Domains] Ouput HyperV VMs"
                                                        $Objects | Table -Name "Protected HyperV VMs" -ColumnWidths 50, 50
                                                    }
                                                }
                                                if ($SLADomain.numNutanixvms -gt 0) {
                                                    Section -Style Heading5 "Nutanix VMs" {
                                                        Write-PScriboMessage -Message "[Rubrik] [$($brik)] [SLA Domains] Retrieving protected Nutanix VMs"
                                                        $Objects = Get-RubrikNutanixVM -SLAID $SLADomain.Id | Select-Object -Property @{N = "Name"; E = { $_.name } }, @{N = "Assignment Type"; E = { $_.slaAssignment } } | Sort-Object -Property Name
                                                        Write-PScriboMessage -Message "[Rubrik] [$($brik)] [SLA Domains] Output Nutanix VMs"
                                                        $Objects | Table -Name "Protected Nutanix VMs" -ColumnWidths 50, 50
                                                    }
                                                }
                                                if ($SLADomain.numVcdVapps -gt 0) {
                                                    Section -Style Heading5 "VCD vApps" {
                                                        Write-PScriboMessage -Message "[Rubrik] [$($brik)] [SLA Domains] Retrieving Protected vCloud Director vApps"
                                                        $Objects = Get-RubrikvApp -SLAID $SLADomain.Id | Select-Object -Property @{N = "Name"; E = { $_.name } }, @{N = "Assignment Type"; E = { $_.slaAssignment } } | Sort-Object -Property Name
                                                        Write-PScriboMessage -Message "[Rubrik] [$($brik)] [SLA Domains] Output VCD vApps"
                                                        $Objects | Table -Name "Protected VCD vApps"  -ColumnWidths 50, 50
                                                    }
                                                }
                                                #-=MWP=- Reserve for EC2 Instances - need to create cmdlet -=MWP=-
                                                if ($SLADomain.numDbs -gt 0) {
                                                    Section -Style Heading5 "MSSQL Databases" {
                                                        Write-PScriboMessage -Message "[Rubrik] [$($brik)] [SLA Domains] Retrieving protected MSSQL DBs"
                                                        $Objects = Get-RubrikDatabase -SLAID $SLADomain.Id | Select-Object -Property @{N = "Name"; E = { $_.name } }, @{N = "Assignment Type"; E = { $_.slaAssignment } }, @{N = "Parent Host"; E = { $_.rootProperties.rootName } } | Sort-Object -Property Name
                                                        Write-PScriboMessage -Message "[Rubrik] [$($brik)] [SLA Domains] Ouput MSSQL Databases"
                                                        $Objects | Table -Name "Protected MSSQL Databases" -ColumnWidths 33, 33, 34
                                                    }
                                                }
                                                if ($SLADomain.numOracleDbs -gt 0) {
                                                    Section -Style Heading5 "Oracle Databases" {
                                                        Write-PScriboMessage -Message "[Rubrik] [$($brik)] [SLA Domains] Retrieving Protected Oracle DBs"
                                                        $Objects = Get-RubrikOracleDB -SLAID $SLADomain.Id | Select-Object -Property @{N = "Name"; E = { $_.name } }, @{N = "Assignment Type"; E = { $_.slaAssignment } }, @{N = "ParentHost"; E = { $_.instances.hostName } } | Sort-Object -Property Name
                                                        Write-PScriboMessage -Message "[Rubrik] [$($brik)] [SLA Domains] Output Oracle DBs"
                                                        $Objects | Table -Name "Protected Oracle Databases" -ColumnWidths 33, 33, 34
                                                    }
                                                }
                                                if ($SLADomain.numFilesets -gt 0) {
                                                    Section -Style Heading5 "Filesets" {
                                                        Write-PScriboMessage -Message "[Rubrik] [$($brik)] [SLA Domains] Retrieving Protected filesets"
                                                        $Objects = Get-RubrikFileset -SLAID $SLADomain.Id | Select-Object -Property @{N = "Name"; E = { $_.name } }, @{N = "Assignment Type"; E = { "Direct" } }, @{N = "Attached to host"; E = { $_.hostname } } | Sort-Object -Property Name
                                                        Write-PScriboMessage -Message "[Rubrik] [$($brik)] [SLA Domains] Output Protected Filesets"
                                                        $Objects | Table -Name "Protected Filesets" -ColumnWidths 33, 33, 34
                                                    }
                                                }
                                                if ($SLADomain.numWindowsVolumeGroups -gt 0) {
                                                    Section -Style Heading5 "Windows Volume Groups" {
                                                        Write-PScriboMessage -Message "[Rubrik] [$($brik)] [SLA Domains] Retrieving Protected Windows Volume Groups"
                                                        $Objects = Get-RubrikVolumeGroup -SLAID $SLADomain.Id | Select-Object -Property @{N = "Name"; E = { $_.name } }, @{N = "Assignment Type"; E = { $_.slaAssignment } }, @{N = "Attached to host"; E = { $_.hostname } } | Sort-Object -Property Name
                                                        Write-PScriboMessage -Message "[Rubrik] [$($brik)] [SLA Domains] Output Protected Volume Groups"
                                                        $Objects | Table -Name "Protected Volume Groups"  -ColumnWidths 33, 33, 34
                                                    }
                                                }
                                                if ($SLADomain.numManagedVolumes -gt 0) {
                                                    Section -Style Heading5 "Managed Volumes" {
                                                        Write-PScriboMessage -Message "[Rubrik] [$($brik)] [SLA Domains] Retrieving Protected Managed Volumes"
                                                        $Objects = Get-RubrikManagedVolume -SLAID $SLADomain.Id | Select-Object -Property @{N = "Name"; E = { $_.name } }, @{N = "Assignment Type"; E = { $_.slaAssignment } } | Sort-Object -Property Name
                                                        Write-PScriboMessage -Message "[Rubrik] [$($brik)] [SLA Domains]Output Managed Volumes [Rubrik] [$($brik)] [SLA Domains] "
                                                        $Objects | Table -Name "Protected Managed Volumes" -ColumnWidths 50, 50
                                                    }
                                                }
                                                #-=MWP=- reserve for NAS Shares /internal/host_fileset/share
                                                # reserve for storage volume group protection
                                            } else {
                                                Paragraph ("There are no objects assigned to this SLA Domain")
                                            }
                                        }
                                    }
                                }
                            }
                        } # End of ForEach SLA Domain
                    } # End of Style Heading2 SLA Domains
                    Write-PScriboMessage -Message "[Rubrik] [$($brik)] [SLA Domains] SLA Domain Section Complete"
                }
                if ($InfoLevel.ProtectedObjects -ge 1) {
                    Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Protected Objects] Beginning Protected Objects Section with Info Level $($InfoLevel.ProtectedObjects)"
                    Section -Style Heading2 "Protected Objects" {
                        Paragraph("The following shows details around all protected objects configured within the Rubrik cluster")
                        if ($InfoLevel.ProtectedObjects -in (1, 2)) {
                            Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Protected Objects] Retrieving Protected VMware VMs "
                            $VMwareVMs = Get-RubrikVM -Relic:$false -PrimaryClusterID 'local' | Where-Object { $_.effectiveSlaDomainName -ne 'Unprotected' } | Select-Object -Property @{N = "Name"; E = { $_.name } },
                            @{N = "SLA Domain"; E = { $_.effectiveSlaDomainName } }, @{N = "Assignment Type"; E = { $_.slaAssignment } }
                            Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Protected Objects] Retrieving Protected Hyper V VMs "
                            $HyperVVMs = Get-RubrikHypervVM -Relic:$false -PrimaryClusterID local | Where-Object { $_.effectiveSlaDomainName -ne 'Unprotected' } | Select-Object -Property @{N = "Name"; E = { $_.name } },
                            @{N = "SLA Domain"; E = { $_.effectiveSlaDomainName } }, @{N = "Assignment Type"; E = { $_.slaAssignment } }
                            Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Protected Objects] Retrieving Protected Nutanix VMs"
                            $NutanixVMs = Get-RubrikNutanixVM -Relic:$false -PrimaryClusterID local | Where-Object { $_.effectiveSlaDomainName -ne 'Unprotected' } | Select-Object -Property @{N = "Name"; E = { $_.name } },
                            @{N = "SLA Domain"; E = { $_.effectiveSlaDomainName } }, @{N = "Assignment Type"; E = { $_.slaAssignment } }
                            Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Protected Objects] Retrieving Protected MSSQL DBs "
                            $MSSQLDatabases = Get-RubrikDatabase -Relic:$false -PrimaryClusterID local | Where-Object { $_.effectiveSlaDomainName -ne 'Unprotected' } | Select-Object -Property @{N = "Name"; E = { $_.name } },
                            @{N = "Recovery Model"; E = { $_.recoveryModel } }, @{N = "SLA Domain"; E = { $_.effectiveSlaDomainName } },
                            @{N = "Assignment Type"; E = { $_.slaAssignment } }
                            Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Protected Objects] Retrieving Protected Oracle DBs "
                            $OracleDatabases = Get-RubrikOracleDB -Relic:$false -PrimaryClusterID local | Where-Object { $_.effectiveSlaDomainName -ne 'Unprotected' } | Select-Object -Property @{N = "Name"; E = { $_.name } },
                            @{N = "SID"; E = { $_.sid } }, @{N = "SLA Domain"; E = { $_.effectiveSlaDomainName } },
                            @{N = "Assignment Type"; E = { $_.slaAssignment } }
                            Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Protected Objects] Retrieving Protected Filesets "
                            $Filesets = Get-RubrikFileset -Relic:$false -PrimaryClusterID local | Where-Object { $_.effectiveSlaDomainId -ne 'Unprotected' -and $null -eq $_.shareId }
                            if ($null -ne $Filesets -and 0 -ne $Filesets[0].total ) {
                                $Filesets = Get-RubrikFileset -Relic:$false -PrimaryClusterID local -DetailedObject | Where-Object { $_.effectiveSlaDomainId -ne 'Unprotected' -and $null -eq $_.shareId } | Select-Object -Property @{N = "Hostname"; E = { $_.hostname } },
                                @{N = "Operating System"; E = { $_.operatingSystemType } }, @{N = "Fileset Name"; E = { $_.name } },
                                @{N = "SLA Domain"; E = { $_.effectiveSlaDomainName } }
                            }
                            Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Protected Objects] Retrieving Protected NAS Shares "
                            $NasShares = Get-RubrikFileset -Relic:$false -PrimaryClusterID local | Where-Object { $_.effectiveSlaDomainId -ne 'Unprotected' -and $null -ne $_.shareId }
                            if ($null -ne $NasShares -and 0 -ne $NasShares[0].total) {
                                $NasShares = Get-RubrikFileset -Relic:$false -PrimaryClusterID local -DetailedObject | Where-Object { $_.effectiveSlaDomainId -ne 'Unprotected' -and $null -ne $_.shareId } | Select-Object -Property @{N = "Hostname"; E = { $_.hostname } },
                                @{N = "Fileset Name"; E = { $_.name } }, @{N = "SLA Domain"; E = { $_.effectiveSlaDomainName } }
                            }
                            Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Protected Objects] Retrieving Protected Volume Groups "
                            $VolumeGroups = Get-RubrikVolumeGroup -Relic:$false -PrimaryClusterID local | Where-Object { $_.effectiveSlaDomainId -ne 'Unprotected' } | Select-Object -Property @{N = "Hostname"; E = { $_.hostname } },
                            @{N = "Volume Group name"; E = { $_.name } }, @{N = "SLA Domain"; E = { $_.effectiveSlaDomainName } },
                            @{N = "Assignment Type"; E = { $_.slaAssignment } }
                            Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Protected Objects] Retrieving Protected Managed Volumes "
                            $ManagedVolumes = Get-RubrikManagedVolume -Relic:$false -PrimaryClusterID local | Where-Object { $_.effectiveSlaDomainId -ne 'Unprotected' } | Select-Object -Property @{N = "Name"; E = { $_.name } },
                            @{N = "Volume Size"; E = { $_.volumeSize } }, @{N = "SLA Domain"; E = { $_.effectiveSlaDomainName } },
                            @{N = "Assignment Type"; E = { $_.slaAssignment } }
                        } elseif ($InfoLevel.ProtectedObjects -in (3, 4)) {
                            #first level if check on total is temporary
                            #this must be in place for sending additional GETs or Foreach
                            #as we may bet back null results (but have data/hasmore/total stanza hidden)
                            #from the SDK. - This is temporary until code is properly handled within the
                            #Rubrik PowerShell SDK
                            #Applies to HyperV,Nutanix, MSSQL, Oracle, VolumeGroups below
                            Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Protected Objects] Retrieving Protected VMware VMs "
                            $VMwareVMs = Get-RubrikVM -Relic:$false -PrimaryClusterID 'local' | Select-Object -Property @{N = "Name"; E = { $_.name } },
                            @{N = "IP Address"; E = { $_.ipAddress } }, @{N = "vCenterName"; E = { ($_.infraPath | Where-Object { $_.managedId -like 'vCenter::*' } ).name } },
                            @{N = "RBSInstalled"; E = { $_.agentStatus.agentStatus } }, @{N = "SLA Domain"; E = { $_.effectiveSlaDomainName } },
                            @{N = "Assignment Type"; E = { $_.slaAssignment } } | Where-Object { $_.effectiveSlaDomainName -ne 'Unprotected' }
                            Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Protected Objects] Retrieving Protected HyperV VMs "
                            $HyperVVMs = Get-RubrikHypervVM -Relic:$false -PrimaryClusterID local
                            if ($null -ne $HyperVVMs -and 0 -ne $HypervVMs[0].total) {
                                Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Protected Objects] HyperV VMs detected, retrieving additional details "
                                $HyperVVMs = $HyperVVMs | Where-Object { $_.effectiveSlaDomainName -ne 'Unprotected' } | ForEach-Object { Get-RubrikHyperVVM -id $_.id | Select-Object -Property @{N = "Name"; E = { $_.name } },
                                    @{N = "SCVMM Server"; E = { ($_.infraPath | Where-Object { $_.Id -like 'HypervScvmm::*' } ).name } }, @{N = "RBS Registered"; E = { $_.isAgentRegistered } },
                                    @{N = "SLA Domain"; E = { $_.effectiveSlaDomainName } }, @{N = "Assignment Type"; E = { $_.slaAssignment } } }
                            } else {
                                Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Protected Objects] No HyperV VMs detected, setting to null"
                                $HyperVVMs = $null
                            }
                            Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Protected Objects] Retrieving Protected Nutanix VMs "
                            $NutanixVMs = Get-RubrikNutanixVM -Relic:$false -PrimaryClusterID local
                            if ($null -ne $NutanixVMs -and 0 -ne $NutanixVMs[0].total) {
                                Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Protected Objects] Nutanix VMs detected, retrieving additional details "
                                $NutanixVMs = $NutanixVMs | Where-Object { $_.effectiveSlaDomainName -ne 'Unprotected' } | ForEach-Object { Get-RubrikNutanixVM -id $_.id | Select-Object -Property @{N = "Name"; E = { $_.name } },
                                    @{N = "Cluster Name"; E = { $_.nutanixClusterName } }, @{N = "RBS Registered"; E = { $_.isAgentRegistered } },
                                    @{N = "SLA Domain"; E = { $_.effectiveSlaDomainName } }, @{N = "Assignment Type"; E = { $_.slaAssignment } } }
                            } else {
                                Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Protected Objects] No Nutanix VMs detected, setting to null"
                                $NutanixVMs = $null
                            }
                            Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Protected Objects] Retrieving Protected MSSQL DBs "
                            $MSSQLDatabases = Get-RubrikDatabase -Relic:$false -PrimaryClusterID local
                            if ($null -ne $MSSQLDatabases -and 0 -ne $MSSQLDatabases[0].total) {
                                Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Protected Objects] MSSQL DBs detected, retrieving additional details "
                                $MSSQLDatabases = $MSSQLDatabases | Where-Object { $_.effectiveSlaDomainName -ne 'Unprotected' } | ForEach-Object { Get-RubrikDatabase -id $_.id | Select-Object -Property @{N = "Name"; E = { $_.name } },
                                    @{N = "Instance"; E = { if ($null -eq $_.instanceName) { "N/A" } else { $_.instanceName } } }, @{N = "LocationName"; E = { $_.rootProperties.rootName } },
                                    @{N = "Recovery Model"; E = { if ($null -eq $_.recoveryModel) { "N/A" } else { $_.recoveryModel } } }, @{N = "Log Backup Frequency (seconds)"; E = { $_.logBackupFrequencyInSeconds } },
                                    @{N = "Log Retention (hours)"; E = { $_.logBackupRetentionHours } }, @{N = "SLA Domain"; E = { $_.effectiveSlaDomainName } },
                                    @{N = "Assignment Type"; E = { $_.slaAssignment } } }
                            } else {
                                Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Protected Objects] No MSSQL Databases detected, setting to null"
                                $MSSQLDatabases = $null
                            }
                            Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Protected Objects] Retrieving Protected Oracle DBs "
                            $OracleDatabases = Get-RubrikOracleDB -Relic:$false -PrimaryClusterID local
                            if ($null -ne $OracleDatabases -and 0 -ne $OracleDatabases[0].total) {
                                Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Protected Objects] Oracle DBs detected, retrieving additional details "
                                $OracleDatabases = $OracleDatabases | Where-Object { $_.effectiveSlaDomainName -ne 'Unprotected' } | ForEach-Object { Get-RubrikOracleDb -id $_.id | Select-Object -Property @{N = "Name"; E = { $_.name } },
                                    @{N = "SID"; E = { $_.sid } }, @{N = "# Tablespaces"; E = { $_.numTablespaces } },
                                    @{N = "Oracle Host"; E = { $_.standaloneHostName } }, @{N = "Log Enabled"; E = { $_.isArchiveLogModeEnabled } },
                                    @{N = "Log Backup Frequency (minutes)"; E = { $_.logBackupFrequencyInMinutes } }, @{N = "Log Retention (Hours)"; E = { $_.logRetentionHours } },
                                    @{N = "SLA Domain"; E = { $_.effectiveSlaDomainName } }, @{N = "Assignment Type"; E = { $_.slaAssignment } } }
                            } else {
                                Write-PScriboMessage -Message "No Oracle DBs detected, setting to null"
                                $OracleDatabases = $null
                            }

                            $Filesets = Get-RubrikFileset -Relic:$false -PrimaryClusterID local | Where-Object { $_.effectiveSlaDomainId -ne 'Unprotected' -and $null -eq $_.shareId }
                            if ($null -ne $Filesets -and 0 -ne $Filesets[0].total) {
                                Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Protected Objects] Retrieving Protected Filesets "
                                $Filesets = Get-RubrikFileset -Relic:$false -PrimaryClusterID local -DetailedObject | Where-Object { $_.effectiveSlaDomainId -ne 'Unprotected' -and $null -eq $_.shareId } | Select-Object -Property @{N = "Hostname"; E = { $_.hostname } },
                                @{N = "Operating System"; E = { $_.operatingSystemType } }, @{N = "Fileset Name"; E = { $_.name } },
                                @{N = "Includes"; E = { $_.includes | Out-String } }, @{N = "Excludes"; E = { $_.excludes | Out-String } },
                                @{N = "SLA Domain"; E = { $_.effectiveSlaDomainName } }
                            }
                            else {
                                Write-PScriboMessage -Message "No Filesets detected, setting to null"
                                $Filesets = $null
                            }
                            $NasShares = Get-RubrikFileset -Relic:$false -PrimaryClusterID local | Where-object { $_.effectiveSlaDomainId -ne 'Unprotected' -and $null -ne $_.shareId }
                            if ($null -ne $NasShares -and 0 -ne $NasShares[0].total) {
                                Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Protected Objects] Retrieving Protected NAS Shares "
                                $NasShares = Get-RubrikFileset -Relic:$false -PrimaryClusterID local -DetailedObject | Where-Object { $_.effectiveSlaDomainId -ne 'Unprotected' -and $null -ne $_.shareId } | Select-Object -Property @{N = "Hostname"; E = { $_.hostname } },
                                @{N = "Operating System"; E = { $_.operatingSystemType } } , @{N = "Fileset Name"; E = { $_.name } },
                                @{N = "Includes"; E = { $_.includes | Out-String } }, @{N = "Excludes"; E = { $_.excludes | Out-String } },
                                @{N = "SLA Domain"; E = { $_.effectiveSlaDomainName } }
                            }
                            else {
                                Write-PScriboMessage "No NAS Shares detected, setting to null"
                                $NasShares = $null
                            }
                            Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Protected Objects] Retrieving Protected Volume Groups "
                            $VolumeGroups = Get-RubrikVolumeGroup -Relic:$false -PrimaryClusterID local
                            if ($null -ne $VolumeGroups -and 0 -ne $VolumeGroups[0].total) {
                                Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Protected Objects] Volume Groups detected, retrieving additional details "
                                $VolumeGroups = $VolumeGroups | Where-Object { $_.effectiveSlaDomainId -ne 'Unprotected' } | ForEach-Object { Get-RubrikVolumeGroup -id $_.id | Select-Object -Property @{N = "Hostname"; E = { $_.hostname } },
                                    @{N = "Volume Group name"; E = { $_.name } }, @{N = "Includes"; E = { $_.includes | Out-String } },
                                    @{N = "SLA Domain"; E = { $_.effectiveSlaDomainName } }, @{N = "Assignment Type"; E = { $_.slaAssignment } } }
                            } else {
                                Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Protected Objects] No Volume Groups detected, setting to null"
                                $VolumeGroups = $null
                            }
                            Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Protected Objects] Retrieving Protected Managed Volumes "
                            $ManagedVolumes = Get-RubrikManagedVolume -Relic:$false -PrimaryClusterID local | Where-Object { $_.effectiveSlaDomainId -ne 'Unprotected' } | Select-Object -Property @{N = "Name"; E = { $_.name } },
                            @{N = "Volume Size"; E = { $_.volumeSize } }, @{N = "Used"; E = { $_.usedSize } },
                            @{N = "Is Writable"; E = { $_.isWritable } }, @{N = "State"; E = { $_.state } },
                            @{N = "# Channels"; E = { $_.numChannels } }, @{N = "SLA Domain"; E = { $_.effectiveSlaDomainName } },
                            @{N = "Assignment Type"; E = { $_.slaAssignment } }
                        } elseif ($InfoLevel.ProtectedObjects -ge 5) {
                            #first level if check on total is temporary
                            #this must be in place for sending additional GETs or Foreach
                            #as we may bet back null results (but have data/hasmore/total stanza hidden)
                            #from the SDK. - This is temporary until code is properly handled within the
                            #Rubrik PowerShell SDK
                            #Applies to VMware VMs, HyperV, Nutanix, MSSQL, Oracle, VolumeGroups below
                            Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Protected Objects] Retrieving Protected VMware VMs "
                            $VMwareVMs = Get-RubrikVM -Relic:$false -PrimaryClusterID 'local'
                            if ($null -ne $VMwareVMs) {
                                Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Protected Objects] VMware VMs detected, gathering additional details "
                                $VMwareVMs = $VMwareVMs | Where-Object { $_.effectiveSlaDomainName -ne 'Unprotected' } | ForEach-Object { Get-RubrikVM -id $_.id | Select-Object -Property @{N = "Name"; E = { $_.name } },
                                    @{N = "IP Address"; E = { $_.ipAddress } }, @{N = "Guest OS"; E = { $_.guestOsType } },
                                    @{N = "ESXiHost"; E = { ($_.infraPath | Where-Object { $_.managedId -like 'VMwareHost::*' } ).name } },
                                    @{N = "ComputeCluster"; E = { ($_.infraPath | Where-Object { $_.managedId -like 'ComputeCluster::*' } ).name } },
                                    @{N = "Datacenter"; E = { ($_.infraPath | Where-Object { $_.managedId -like 'DataCenter::*' } ).name } },
                                    @{N = "vCenterName"; E = { ($_.infraPath | Where-Object { $_.managedId -like 'vCenter::*' } ).name } },
                                    @{N = "RBSInstalled"; E = { $_.agentStatus.agentStatus } }, @{N = "VMware Tools"; E = { $_.vmwareToolsInstalled } },
                                    @{N = "SLA Domain"; E = { $_.effectiveSlaDomainName } }, @{N = "Assignment Type"; E = { $_.slaAssignment } }, @{N = "Snapshot Count"; E = { $_.snapshotCount } },
                                    @{N = "Oldest Backup"; E = { ($_.snapshots | Sort-Object -Property Date | Select-Object -First 1).date } },
                                    @{N = "Latest Backup"; E = { ($_.snapshots | Sort-Object -Property Date | Select-Object -Last 1).date } } }
                            } else {
                                Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Protected Objects] No VMware VMs detected, setting to null"
                                $VMwareVMs = $null
                            }
                            Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Protected Objects] Retrieving Protected Hyper-V VMs "
                            $HyperVVMs = Get-RubrikHypervVM -Relic:$false -PrimaryClusterID local
                            if ($null -ne $HypervVMs -and 0 -ne $HypervVMs[0].total) {
                                Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Protected Objects] HyperV VMs detectected, gathering addtional details "
                                $HyperVVMs = $HyperVVMs | Where-Object { $_.effectiveSlaDomainName -ne 'Unprotected' } | ForEach-Object { Get-RubrikHyperVVM -id $_.id | Select-Object -Property @{N = "Name"; E = { $_.name } },
                                    @{N = "HyperV Server"; E = { ($_.infraPath | Where-Object { $_.Id -like 'HypervServer::*' } ).name } },
                                    @{N = "HyperV Cluster"; E = { ($_.infraPath | Where-Object { $_.Id -like 'HypervCluster::*' } ).name } },
                                    @{N = "SCVMM Server"; E = { ($_.infraPath | Where-Object { $_.Id -like 'HypervScvmm::*' } ).name } },
                                    @{N = "RBS Registered"; E = { $_.isAgentRegistered } }, @{N = "SLA Domain"; E = { $_.effectiveSlaDomainName } },
                                    @{N = "Assignment Type"; E = { $_.slaAssignment } }, @{N = "Snapshot Count"; E = { ( Get-RubrikSnapshot -id $_.id).count } },
                                    @{N = "Latest Backup"; E = { ( Get-RubrikSnapshot -id $_.id -latest  ).date } },
                                    @{N = "Oldest Backup"; E = { (Get-RubrikSnapshot -id $_.id | Sort-Object -Property date | Select-Object -First 1).date } } }
                            } else {
                                Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Protected Objects] No HyperV VMs detected, setting to null"
                                $HyperVVMs = $null
                            }
                            Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Protected Objects] Retrieving Protected Nutanix VMs "
                            $NutanixVMs = Get-RubrikNutanixVM -Relic:$false -PrimaryClusterID local
                            if ($null -ne $NutanixVMs -and 0 -ne $NutanixVMs[0].total) {
                                Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Protected Objects] Nutanix VMs detected, gathering addtional details "
                                $NutanixVMs = $NutanixVMs | Where-Object { $_.effectiveSlaDomainName -ne 'Unprotected' } | ForEach-Object { Get-RubrikNutanixVM -id $_.id | Select-Object -Property @{N = "Name"; E = { $_.name } },
                                    @{N = "Cluster Name"; E = { $_.nutanixClusterName } }, @{N = "RBS Registered"; E = { $_.isAgentRegistered } },
                                    @{N = "SLA Domain"; E = { $_.effectiveSlaDomainName } }, @{N = "Assignment Type"; E = { $_.slaAssignment } },
                                    @{N = "Snapshot Count"; E = { ( Get-RubrikSnapshot -id $_.id).count } },
                                    @{N = "Latest Backup"; E = { ( Get-RubrikSnapshot -id $_.id -latest  ).date } },
                                    @{N = "Oldest Backup"; E = { (Get-RubrikSnapshot -id $_.id | Sort-Object -Property date | Select-Object -First 1).date } } }
                            } else {
                                Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Protected Objects] No Nutanix VMs detected, setting to null"
                                $NutanixVMs = $null
                            }
                            Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Protected Objects] Retrieving Protected MSSQL Databases "
                            $MSSQLDatabases = Get-RubrikDatabase -Relic:$false -PrimaryClusterID local
                            if ($null -ne $MSSQLDatabases -and 0 -ne $MSSQLDatabases[0].total) {
                                Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Protected Objects] MSSQL DBs detected, gathering addtional information "
                                $MSSQLDatabases = $MSSQLDatabases | Where-Object { $_.effectiveSlaDomainName -ne 'Unprotected' } | ForEach-Object { Get-RubrikDatabase -id $_.id | Select-Object -Property @{N = "Name"; E = { $_.name } },
                                    @{N = "Instance"; E = { if ($null -eq $_.instanceName) { "N/A" } else { $_.instanceName } } }, @{N = "Location Name"; E = { $_.rootProperties.rootName } },
                                    @{N = "Recovery Model"; E = { if ($null -eq $_.recoveryModel) { "N/A" } else { $_.recoveryModel } } }, @{N = "Log Backup Frequency (seconds)"; E = { $_.logBackupFrequencyInSeconds } },
                                    @{N = "Log Retention (hours)"; E = { $_.logBackupRetentionHours } }, @{N = "Secondary Log Shipping"; E = { $_.isLogShippingSecondary } },
                                    @{N = "Is in Availability Group"; E = { $_.isInAvailabilityGroup } }, @{N = "Copy Only"; E = { $_.copyOnly } },
                                    @{N = "SLA Domain"; E = { $_.effectiveSlaDomainName } }, @{N = "Assignment Type"; E = { $_.slaAssignment } },
                                    @{N = "Snapshot Count"; E = { $_.snapshotCount } }, @{N = "Oldest Backup"; E = { $_.oldestRecoveryPoint } },
                                    @{N = "Latest Backup"; E = { $_.latestRecoveryPoint } } }
                            } else {
                                Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Protected Objects] No MSSQL DBs detected, setting to null"
                                $MSSQLDatabases = $null
                            }
                            Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Protected Objects] Retrieving Oracle DBs "
                            $OracleDatabases = Get-RubrikOracleDB -Relic:$false -PrimaryClusterID local
                            if ($null -ne $OracleDatabases -and 0 -ne $OracleDatabases[0].total) {
                                Write-PScriboMessage "[Rubrik] [$($brik)] [Protected Objects] Oracle DBs detected, gathering additional information "
                                $OracleDatabases = $OracleDatabases | Where-Object { $_.effectiveSlaDomainName -ne 'Unprotected' } | ForEach-Object { Get-RubrikOracleDb -id $_.id | Select-Object -Property @{N = "Name"; E = { $_.name } },
                                    @{N = "SID"; E = { $_.sid } }, @{N = "# Tablespaces"; E = { $_.numTablespaces } },
                                    @{N = "Oracle Host"; E = { $_.standaloneHostName } }, @{N = "Log Enabled"; E = { $_.isArchiveLogModeEnabled } },
                                    @{N = "Log Backup Frequency (minutes)"; E = { $_.logBackupFrequencyInMinutes } }, @{N = "Log Retention (Hours)"; E = { $_.logRetentionHours } },
                                    @{N = "SLA Domain"; E = { $_.effectiveSlaDomainName } }, @{N = "Assignment Type"; E = { $_.slaAssignment } },
                                    @{N = "Snapshot Count"; E = { $_.snapshotCount } }, @{N = "Oldest Backup"; E = { $_.oldestRecoveryPoint } },
                                    @{N = "Latest Backup"; E = { $_.latestRecoveryPoint } } }
                            } else {
                                Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Protected Objects] No Oracle DBs detected, setting to null"
                                $OracleDatabases = $null
                            }
                            $Filesets = Get-RubrikFileset -Relic:$false -PrimaryClusterID local  | Where-Object { $_.effectiveSlaDomainId -ne 'Unprotected' -and $null -eq $_.shareId }
                            if ($null -ne $filesets -and 0 -ne $Filesets[0].total) {
                                Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Protected Objects] Retrieving Protected Filesets "
                                $Filesets = Get-RubrikFileset -Relic:$false -PrimaryClusterID local -DetailedObject | Where-Object { $_.effectiveSlaDomainId -ne 'Unprotected' -and $null -eq $_.shareId } | Select-Object -Property @{N = "Hostname"; E = { $_.hostname } },
                                @{N = "Operating System"; E = { $_.operatingSystemType } }, @{N = "Fileset Name"; E = { $_.name } },
                                @{N = "Includes"; E = { $_.includes | Out-String } }, @{N = "Excludes"; E = { $_.excludes | Out-String } },
                                @{N = "SLA Domain"; E = { $_.effectiveSlaDomainName } }, @{N = "Snapshot Count"; E = { $_.snapshotCount } },
                                @{N = "Oldest Backup"; E = { (Get-RubrikSnapshot -id $_.id | Sort-Object -Property Date | Select-Object -First 1).date } },
                                @{N = "Latest Backup"; E = { (Get-RubrikSnapshot -id $_.id | Sort-Object -Property Date | Select-Object -Last 1).date } }
                            }
                            else {
                                Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Protected Objects] No Filesets detected, setting to null"
                                $Filesets = $null
                            }
                            $NasShares = Get-RubrikFileset -Relic:$false -PrimaryClusterID local  | Where-Object { $_.effectiveSlaDomainId -ne 'Unprotected' -and $null -ne $_.shareId }
                            if ($null -ne $NasShares -and 0 -ne $NasShares[0].total ) {
                                Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Protected Objects] Retrieving Protected NAS Share s"
                                $NasShares = Get-RubrikFileset -Relic:$false -PrimaryClusterID local -DetailedObject | Where-Object { $_.effectiveSlaDomainId -ne 'Unprotected' -and $null -ne $_.shareId } | Select-Object -Property @{N = "Hostname"; E = { $_.hostname } },
                                @{N = "Operating System"; E = { $_.operatingSystemType } }, @{N = "Fileset Name"; E = { $_.name } },
                                @{N = "Includes"; E = { $_.includes | Out-String } }, @{N = "Excludes"; E = { $_.excludes | Out-String } },
                                @{N = "SLA Domain"; E = { $_.effectiveSlaDomainName } }, @{N = "Snapshot Count"; E = { $_.snapshotCount } },
                                @{N = "Oldest Backup"; E = { (Get-RubrikSnapshot -id $_.id | Sort-Object -Property Date | Select-Object -First 1).date } },
                                @{N = "Latest Backup"; E = { (Get-RubrikSnapshot -id $_.id | Sort-Object -Property Date | Select-Object -Last 1).date } }
                            }
                            else {
                                Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Protected Objects] No NAS Shares detected, setting to null"
                                $NasShares = $null
                            }

                            Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Protected Objects] Retrieving Protected Volume Groups "
                            $VolumeGroups = Get-RubrikVolumeGroup -Relic:$false -PrimaryClusterID local
                            if ($null -ne $VolumeGroups -and 0 -ne $VolumeGroups[0].total) {
                                Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Protected Objects] Volume Groups detected, gathering additional details "
                                $VolumeGroups = $VolumeGroups | Where-Object { $_.effectiveSlaDomainId -ne 'Unprotected' } | ForEach-Object { Get-RubrikVolumeGroup -id $_.id | Select-Object -Property @{N = "Hostname"; E = { $_.hostname } },
                                    @{N = "Volume Group name"; E = { $_.name } }, @{N = "Includes"; E = { $_.includes | Out-String } },
                                    @{N = "SLA Domain"; E = { $_.effectiveSlaDomainName } }, @{N = "Assignment Type"; E = { $_.slaAssignment } },
                                    @{N = "SnapshotCount"; E = { ( Get-RubrikSnapshot -id $_.id).count } },
                                    @{N = "LatestBackup"; E = { ( Get-RubrikSnapshot -id $_.id -latest  ).date } },
                                    @{N = "OldestBackup"; E = { (Get-RubrikSnapshot -id $_.id | Sort-Object -Property date | Select-Object -First 1).date } } }
                            } else {
                                Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Protected Objects] No Volume Groups detected, setting to null"
                                $VolumeGroups = $null
                            }
                            Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Protected Objects] Retrieving Protected Managed Volumes "
                            $ManagedVolumes = Get-RubrikManagedVolume -Relic:$false -PrimaryClusterID local | Where-Object { $_.effectiveSlaDomainId -ne 'Unprotected' } | Select-Object -Property @{N = "Name"; E = { $_.name } },
                            @{N = "Volume Size"; E = { $_.volumeSize } }, @{N = "Used"; E = { $_.usedSize } },
                            @{N = "Is Writable"; E = { $_.isWritable } }, @{N = "State"; E = { $_.state } },
                            @{N = "# Channels"; E = { $_.numChannels } }, @{N = "SLA Domain"; E = { $_.effectiveSlaDomainName } },
                            @{N = "Assignment Type"; E = { $_.slaAssignment } }, @{N = "Snapshot Count"; E = { $_.snapshotCount } },
                            @{N = "Latest Backup"; E = { ( Get-RubrikSnapshot -id $_.id -latest  ).date } },
                            @{N = "Oldest Backup"; E = { (Get-RubrikSnapshot -id $_.id | Sort-Object -Property date | Select-Object -First 1).date } }
                        }

                        if (0 -ne ($VMwareVMs | Measure-Object).count) {
                            Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Protected Objects] Output VMware VMs "
                            Section -Style Heading3 "VMware Virtual Machines" {
                                if ($InfoLevel.ProtectedObjects -ge 5) {
                                    $VMwareVMs | Sort-Object -Property Name | Table -Name "Protected VMware VMs" -List -ColumnWidths 30, 70
                                } else {
                                    $VMwareVMs | Sort-Object -Property Name | Table -Name "Protected VMware VMs"
                                }
                            }
                        }
                        if (0 -ne ($HyperVVMs | Measure-Object).count) {
                            Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Protected Objects] Output HyperV VMs "
                            Section -Style Heading3 "Hyper-V Virtual Machines" {
                                if ($InfoLevel.ProtectedObjects -ge 5) {
                                    $HyperVVMs | Sort-Object -Property Name | Table -Name "Protected HyperV VMs" -List -ColumnWidths 30, 70
                                } else {
                                    $HyperVVMs | Sort-Object -Property Name | Table -Name "Protected HyperV VMs"
                                }
                            }
                        }
                        if (0 -ne ($NutanixVMs | Measure-Object).count) {
                            Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Protected Objects] Output Nutanix VMs "
                            Section -Style Heading3 "Nutanix Virtual Machines" {
                                if ($InfoLevel.ProtectedObjects -ge 5) {
                                    $NutanixVMs | Sort-Object -Property Name | Table -Name "Protected Nutanix VMs" -List -ColumnWidths 30, 70
                                } else {
                                    $NutanixVMs | Sort-Object -Property Name | Table -Name "Protected Nutanix VMs"
                                }
                            }
                        }
                        if (0 -ne ($MSSQLDatabases | Measure-Object).count) {
                            Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Protected Objects] Output MSSQL DBs "
                            Section -Style Heading3 "MSSQL Databases" {
                                if ($InfoLevel.ProtectedObjects -ge 5) {
                                    $MSSQLDatabases | Sort-Object -Property Name | Table -Name "Protected MSSQL Databases" -List -ColumnWidths 30, 70
                                } else {
                                    $MSSQLDatabases | Sort-Object -Property Name | Table -Name "Protected MSSQL Databases"
                                }
                            }
                        }
                        if (0 -ne ($OracleDatabases | Measure-Object).count) {
                            Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Protected Objects] Output Oracle DBs "
                            Section -Style Heading3 "Oracle Databases" {
                                if ($InfoLevel.ProtectedObjects -ge 5) {
                                    $OracleDatabases | Sort-Object -Property Name | Table -Name "Protected Oracle Databases" -List -ColumnWidths 30, 70
                                } else {
                                    $OracleDatabases | Sort-Object -Property Name | Table -Name "Protected Oracle Databases"
                                }
                            }
                        }
                        if (0 -ne ($Filesets | Measure-Object).count) {
                            Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Protected Objects] Output Filesets "
                            Section -Style Heading3 "Filesets" {
                                if ($InfoLevel.ProtectedObjects -ge 5) {
                                    $Filesets | Sort-Object -Property operatingSystemType, Name | Table -Name "Protected Filesets" -List -ColumnWidths 30, 70
                                } else {
                                    $Filesets | Sort-Object -Property operatingSystemType, Name | Table -Name "Protected Filesets"
                                }
                            }
                        }
                        if (0 -ne ($NasShares | Measure-Object).count) {
                            Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Protected Objects] Output NAS Shares "
                            Section -Style Heading3 "NAS Shares" {
                                if ($InfoLevel.ProtectedObjects -ge 5) {
                                    $NasShares | Sort-Object -Property operatingSystemType, Name | Table -Name "Protected NAS Shares" -List -ColumnWidths 30, 70
                                } else {
                                    $NasShares | Sort-Object -Property operatingSystemType, Name | Table -Name "Protected NAS Shares"
                                }
                            }
                        }
                        if (0 -ne ($VolumeGroups | Measure-Object).count) {
                            Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Protected Objects] Output Volume Groups "
                            Section -Style Heading3 "Volume Groups" {
                                if ($InfoLevel.ProtectedObjects -ge 5) {
                                    $VolumeGroups | Sort-Object -Property hostName | Table -Name "Protected Volume Groups" -List -ColumnWidths 30, 70
                                } else {
                                    $VolumeGroups | Sort-Object -Property hostName | Table -Name "Protected Volume Groups"
                                }
                            }
                        }
                        if (0 -ne ($ManagedVolumes | Measure-Object).count) {
                            Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Protected Objects] Output Managed Volumes "
                            Section -Style Heading3 "Managed Volumes" {
                                if ($InfoLevel.ProtectedObjects -ge 5) {
                                    $ManagedVolumes | Sort-Object -Property name | Table -Name "Protected Managed Volumes" -List -ColumnWidths 30, 70
                                } else {
                                    $ManagedVolumes | Sort-Object -Property name | Table -Name "Protected Managed Volumes"
                                }
                            }
                        }
                    } # end of Style Heading2 Protected Objects
                    Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Protected Objects] Protected Objects Section Complete"
                }
                if ($InfoLevel.SnapshotRetention -ge 1) {
                    Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Snapshot Retention] Beginning Snapshot Retention Section with Info Level $($InfoLevel.SnapshotRetention)"
                    Section -Style Heading2 "Snapshot Retention" {
                        Paragraph ("The following displays all relic, expired, and unmanaged objects within the Rubrik cluster")
                        Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Snapshot Retention] Retrieving Unmanaged Objects"
                        $UnmanagedObjects = Get-RubrikUnmanagedObject
                        if (($UnmanagedObjects | Measure-Object).Count -gt 0) {
                            Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Snapshot Retention] Output Unmanaged Objects"
                            if ($InfoLevel.SnapshotRetention -in (1, 2)) {
                                $UnmanagedObjects | Sort-Object -Property Name, objecttype | Table -Name "Unmanaged Objects" -Columns Name, objectType, retentionSlaDomainName -Headers 'Name', 'ObjectType', 'Retention SLA Domain'
                            } elseif ($InfoLevel.SnapshotRetention -in (3, 4, 5)) {
                                $UnmanagedObjects | Sort-Object -Property Name, objecttype | Table -Name "Unmanaged Objects" -Columns Name, objectType, retentionSlaDomainName, autoSnapshotCount, manualSnapshotCount, localStorage, archiveStorage, unmanagedStatus -Headers 'Name', 'ObjectType', 'Retention SLA Domain', 'Automatic Snapshots', 'Manual Snapshots', 'Local Storage', 'Archival Storage', 'Unmanaged Status' -List -ColumnWidths 30, 70
                            }
                        }
                    }
                    Write-PScriboMessage -Message "[Rubrik] [$($brik)] [Snapshot Retention] Snapshot Retention Section Complete"
                } # end of Style Heading2 Snapshot Retention
            }
        } # End of if $RubrikCluster
    } # End of foreach $cluster


    #endregion Script Body

} # End Invoke-AsBuiltReport.Rubrik.CDM function