Src/Private/Report/Get-AbrADDFSHealth.ps1

function Get-AbrADDFSHealth {
    <#
    .SYNOPSIS
    Used by As Built Report to retrieve Microsoft AD Domain DFS Health information.
    .DESCRIPTION
 
    .NOTES
        Version: 0.9.12
        Author: Jonathan Colon
        Twitter: @jcolonfzenpr
        Github: rebelinux
    .EXAMPLE
 
    .LINK
 
    #>

    [CmdletBinding()]
    param (
        $Domain,
        [string[]]$DCs,
        $ValidDcFromDomain
    )

    begin {
        Write-PScriboMessage -Message ($reportTranslate.GetAbrADDFSHealth.Collecting -f $Domain.DNSRoot)
        Show-AbrDebugExecutionTime -Start -TitleMessage 'DFS Health'
    }

    process {
        if ($HealthCheck.Domain.DFS) {
            try {
                if ($Options.Exclude.DCs) {
                    $DFS = Get-WinADDFSHealth -Domain $Domain.DNSRoot -Credential $Credential -ExcludeDomains $Options.Exclude.Domains -ExcludeDomainControllers $Options.Exclude.DCs
                } else { $DFS = Get-WinADDFSHealth -Domain $Domain.DNSRoot -Credential $Credential -ExcludeDomains $Options.Exclude.Domains }
                if ($DFS) {
                    Section -ExcludeFromTOC -Style NOTOCHeading4 $reportTranslate.GetAbrADDFSHealth.SysvolReplicationTitle {
                        Paragraph ($reportTranslate.GetAbrADDFSHealth.SysvolReplicationParagraph -f $Domain.DNSRoot.ToString().ToUpper())
                        BlankLine
                        $OutObj = [System.Collections.Generic.List[object]]::new()
                        foreach ($Controller in $DCs) {
                            try {
                                $RepState = $DFS | Where-Object { $_.DomainController -eq $Controller.Split('.')[0] } | Select-Object -Property ReplicationState, GroupPolicyCount, SysvolCount, IdenticalCount, StopReplicationOnAutoRecovery
                                $inObj = [ordered] @{
                                    $reportTranslate.GetAbrADDFSHealth.DCName = $Controller.Split('.')[0]
                                    $reportTranslate.GetAbrADDFSHealth.ReplicationStatus = switch ([string]::IsNullOrEmpty($RepState.ReplicationState)) {
                                        $true { $reportTranslate.GetAbrADDFSHealth.SysvolReplicationOffline }
                                        $false { $RepState.ReplicationState }
                                        default { '--' }
                                    }
                                    $reportTranslate.GetAbrADDFSHealth.GPOCount = switch ([string]::IsNullOrEmpty($RepState.GroupPolicyCount)) {
                                        $true { '0' }
                                        $false { $RepState.GroupPolicyCount }
                                        default { '--' }
                                    }
                                    $reportTranslate.GetAbrADDFSHealth.SysvolCount = switch ([string]::IsNullOrEmpty($RepState.SysvolCount)) {
                                        $true { '0' }
                                        $false { $RepState.SysvolCount }
                                        default { '--' }
                                    }
                                    $reportTranslate.GetAbrADDFSHealth.IdenticalCount = switch ([string]::IsNullOrEmpty($RepState.IdenticalCount)) {
                                        $true { '0' }
                                        $false { $RepState.IdenticalCount }
                                        default { '--' }
                                    }
                                    $reportTranslate.GetAbrADDFSHealth.StopReplicationOnAutoRecovery = switch ([string]::IsNullOrEmpty($RepState.StopReplicationOnAutoRecovery)) {
                                        $true { '0' }
                                        $false { $RepState.StopReplicationOnAutoRecovery }
                                        default { '--' }
                                    }

                                }
                                $OutObj.Add([pscustomobject](ConvertTo-HashToYN $inObj))
                            } catch {
                                Write-PScriboMessage -IsWarning -Message "Sysvol Replication Status Iten Section: $($_.Exception.Message)"
                            }
                        }

                        if ($HealthCheck.Domain.DFS) {
                            $ReplicationStatusError = @(
                                'Uninitialized',
                                'Auto recovery',
                                'In error state',
                                'Disabled',
                                'Offline'
                            )
                            $ReplicationStatusWarn = @(
                                'Initialized',
                                'Initial synchronization'
                            )
                            $OutObj | Where-Object { $_.$($reportTranslate.GetAbrADDFSHealth.IdenticalCount) -like 'No' } | Set-Style -Style Warning -Property $reportTranslate.GetAbrADDFSHealth.IdenticalCount
                            $OutObj | Where-Object { $_.$($reportTranslate.GetAbrADDFSHealth.ReplicationStatus) -eq 'Normal' } | Set-Style -Style OK -Property $reportTranslate.GetAbrADDFSHealth.ReplicationStatus
                            $OutObj | Where-Object { $_.$($reportTranslate.GetAbrADDFSHealth.ReplicationStatus) -in $ReplicationStatusError } | Set-Style -Style Critical -Property $reportTranslate.GetAbrADDFSHealth.ReplicationStatus
                            $OutObj | Where-Object { $_.$($reportTranslate.GetAbrADDFSHealth.ReplicationStatus) -in $ReplicationStatusWarn } | Set-Style -Style Warning -Property $reportTranslate.GetAbrADDFSHealth.ReplicationStatus
                        }

                        $TableParams = @{
                            Name = "$($reportTranslate.GetAbrADDFSHealth.SysvolReplicationTableName) - $($Domain.DNSRoot.ToString().ToUpper())"
                            List = $false
                            ColumnWidths = 20, 16, 16, 16, 16, 16
                        }

                        if ($Report.ShowTableCaptions) {
                            $TableParams['Caption'] = "- $($TableParams.Name)"
                        }
                        $OutObj | Sort-Object -Property $reportTranslate.GetAbrADDFSHealth.DCName | Table @TableParams
                        if ($HealthCheck.Domain.DFS -and (($OutObj | Where-Object { $_.$($reportTranslate.GetAbrADDFSHealth.IdenticalCount) -like 'No' }) -or ($OutObj | Where-Object { $_.$($reportTranslate.GetAbrADDFSHealth.ReplicationStatus) -in $ReplicationStatusError }))) {
                            Paragraph $reportTranslate.GetAbrADDFSHealth.SysvolReplicationHealthCheck -Bold -Underline
                            BlankLine
                            Paragraph {
                                Text $reportTranslate.GetAbrADDFSHealth.SysvolReplicationCorrectiveActions -Bold
                                Text $reportTranslate.GetAbrADDFSHealth.SysvolReplicationBP
                            }
                            BlankLine
                        }
                    }
                } else {
                    Write-PScriboMessage -Message ($reportTranslate.GetAbrADDFSHealth.SysvolReplicationNoData -f $Domain.DNSRoot)
                }
            } catch {
                Write-PScriboMessage -IsWarning -Message "Sysvol Replication Status Table Section: $($_.Exception.Message)"
            }
            try {

                $DCPssSession = Get-ValidPSSession -ComputerName $ValidDcFromDomain -SessionName $($ValidDcFromDomain) -PSSTable ([ref]$PSSTable)
                if ($DCPssSession) {
                    # Code taken from ClaudioMerola (https://github.com/ClaudioMerola/ADxRay)
                    $SYSVOLFolder = Invoke-CommandWithTimeout -Session $DCPssSession -ScriptBlock { Get-ChildItem -Path "\\$(($using:Domain).DNSRoot)\SYSVOL\$(($using:Domain).DNSRoot)" -Recurse | Where-Object -FilterScript { -not $_.PSIsContainer } | Group-Object -Property Extension | ForEach-Object -Process {
                            New-Object -TypeName PSObject -Property @{
                                'Extension' = $_.name
                                'Count' = $_.count
                                'TotalSize' = '{0:N2}' -f ((($_.group | Measure-Object length -Sum).Sum) / 1MB)
                            } } | Sort-Object -Descending -Property 'Totalsize' }
                } else {
                    if (-not $_.Exception.MessageId) {
                        $ErrorMessage = $_.FullyQualifiedErrorId
                    } else { $ErrorMessage = $_.Exception.MessageId }
                    Write-PScriboMessage -IsWarning -Message "Sysvol Content Status Section: New-PSSession: Unable to connect to $($ValidDcFromDomain): $ErrorMessage"
                }
                if ($SYSVOLFolder) {
                    Section -ExcludeFromTOC -Style NOTOCHeading4 $reportTranslate.GetAbrADDFSHealth.SysvolContentTitle {
                        Paragraph ($reportTranslate.GetAbrADDFSHealth.SysvolContentParagraph -f $Domain.DNSRoot.ToString().ToUpper())
                        BlankLine
                        $OutObj = [System.Collections.Generic.List[object]]::new()
                        foreach ($Extension in $SYSVOLFolder) {
                            try {
                                $inObj = [ordered] @{
                                    $reportTranslate.GetAbrADDFSHealth.Extension = $Extension.Extension
                                    $reportTranslate.GetAbrADDFSHealth.FileCount = $Extension.Count
                                    $reportTranslate.GetAbrADDFSHealth.Size = "$($Extension.TotalSize) MB"
                                }
                                $OutObj.Add([pscustomobject](ConvertTo-HashToYN $inObj))
                            } catch {
                                Write-PScriboMessage -IsWarning -Message "Sysvol Health $($Extension.Extension) Section: $($_.Exception.Message)"
                            }
                        }

                        if ($HealthCheck.Domain.DFS) {
                            $OutObj | Where-Object { $_.$($reportTranslate.GetAbrADDFSHealth.Extension) -notin ('.bat', '.exe', '.nix', '.vbs', '.pol', '.reg', '.xml', '.admx', '.adml', '.inf', '.ini', '.adm', '.kix', '.msi', '.ps1', '.cmd', '.ico', '.cmtx') } | Set-Style -Style Warning -Property $reportTranslate.GetAbrADDFSHealth.Extension
                        }

                        $TableParams = @{
                            Name = "$($reportTranslate.GetAbrADDFSHealth.SysvolContentTableName) - $($Domain.DNSRoot.ToString().ToUpper())"
                            List = $false
                            ColumnWidths = 33, 33, 34
                        }

                        if ($Report.ShowTableCaptions) {
                            $TableParams['Caption'] = "- $($TableParams.Name)"
                        }
                        $OutObj | Sort-Object -Property $reportTranslate.GetAbrADDFSHealth.Extension | Table @TableParams
                        if ($OutObj | Where-Object { $_.$($reportTranslate.GetAbrADDFSHealth.Extension) -notin ('.bat', '.exe', '.nix', '.vbs', '.pol', '.reg', '.xml', '.admx', '.adml', '.inf', '.ini', '.adm', '.kix', '.msi', '.ps1', '.cmd', '.ico') }) {
                            Paragraph $reportTranslate.GetAbrADDFSHealth.ContentHealthCheck -Bold -Underline
                            BlankLine
                            Paragraph {
                                Text $reportTranslate.GetAbrADDFSHealth.ContentCorrectiveActions -Bold
                                Text $reportTranslate.GetAbrADDFSHealth.ContentSysvolBP
                            }
                        }
                    }
                } else {
                    Write-PScriboMessage -Message ($reportTranslate.GetAbrADDFSHealth.SysvolContentNoData -f $Domain.DNSRoot)
                }
            } catch {
                Write-PScriboMessage -IsWarning -Message "Sysvol Health Table Section: $($_.Exception.Message)"
            }
            try {
                $DCPssSession = Get-ValidPSSession -ComputerName $ValidDcFromDomain -SessionName $($ValidDcFromDomain) -PSSTable ([ref]$PSSTable)
                if ($DCPssSession) {
                    # Code taken from ClaudioMerola (https://github.com/ClaudioMerola/ADxRay)
                    $NetlogonFolder = Invoke-CommandWithTimeout -Session $DCPssSession -ScriptBlock { Get-ChildItem -Path "\\$(($using:Domain).DNSRoot)\NETLOGON\" -Recurse | Where-Object -FilterScript { -not $_.PSIsContainer } | Group-Object -Property Extension | ForEach-Object -Process {
                            New-Object -TypeName PSObject -Property @{
                                'Extension' = $_.name
                                'Count' = $_.count
                                'TotalSize' = '{0:N2}' -f ((($_.group | Measure-Object length -Sum).Sum) / 1MB)
                            } } | Sort-Object -Descending -Property 'Totalsize' }
                } else {
                    if (-not $_.Exception.MessageId) {
                        $ErrorMessage = $_.FullyQualifiedErrorId
                    } else { $ErrorMessage = $_.Exception.MessageId }
                    Write-PScriboMessage -IsWarning -Message "Netlogon Content Status Section: New-PSSession: Unable to connect to $($ValidDcFromDomain): $ErrorMessage"
                }
                if ($NetlogonFolder) {
                    Section -ExcludeFromTOC -Style NOTOCHeading4 $reportTranslate.GetAbrADDFSHealth.NetlogonContentTitle {
                        Paragraph ($reportTranslate.GetAbrADDFSHealth.NetlogonContentParagraph -f $Domain.DNSRoot.ToString().ToUpper())
                        BlankLine
                        $OutObj = [System.Collections.Generic.List[object]]::new()
                        foreach ($Extension in $NetlogonFolder) {
                            try {
                                $inObj = [ordered] @{
                                    $reportTranslate.GetAbrADDFSHealth.Extension = $Extension.Extension
                                    $reportTranslate.GetAbrADDFSHealth.FileCount = $Extension.Count
                                    $reportTranslate.GetAbrADDFSHealth.Size = "$($Extension.TotalSize) MB"
                                }
                                $OutObj.Add([pscustomobject](ConvertTo-HashToYN $inObj))
                            } catch {
                                Write-PScriboMessage -IsWarning -Message "Netlogon Health $($Extension.Extension) Section: $($_.Exception.Message)"
                            }
                        }

                        if ($HealthCheck.Domain.DFS) {
                            $OutObj | Where-Object { $_.$($reportTranslate.GetAbrADDFSHealth.Extension) -notin ('.bat', '.exe', '.nix', '.vbs', '.pol', '.reg', '.xml', '.admx', '.adml', '.inf', '.ini', '.adm', '.kix', '.msi', '.ps1', '.cmd', '.ico', '.cmtx') } | Set-Style -Style Warning -Property $reportTranslate.GetAbrADDFSHealth.Extension
                        }

                        $TableParams = @{
                            Name = "$($reportTranslate.GetAbrADDFSHealth.NetlogonContentTableName) - $($Domain.DNSRoot.ToString().ToUpper())"
                            List = $false
                            ColumnWidths = 33, 33, 34
                        }

                        if ($Report.ShowTableCaptions) {
                            $TableParams['Caption'] = "- $($TableParams.Name)"
                        }
                        $OutObj | Sort-Object -Property $reportTranslate.GetAbrADDFSHealth.Extension | Table @TableParams
                        if ($OutObj | Where-Object { $_.$($reportTranslate.GetAbrADDFSHealth.Extension) -notin ('.bat', '.exe', '.nix', '.vbs', '.pol', '.reg', '.xml', '.admx', '.adml', '.inf', '.ini', '.adm', '.kix', '.msi', '.ps1', '.cmd', '.ico') }) {
                            Paragraph $reportTranslate.GetAbrADDFSHealth.ContentHealthCheck -Bold -Underline
                            BlankLine
                            Paragraph {
                                Text $reportTranslate.GetAbrADDFSHealth.ContentCorrectiveActions -Bold
                                Text $reportTranslate.GetAbrADDFSHealth.ContentNetlogonBP
                            }
                        }
                    }
                } else {
                    Write-PScriboMessage -Message ($reportTranslate.GetAbrADDFSHealth.NetlogonContentNoData -f $Domain.DNSRoot)
                }
            } catch {
                Write-PScriboMessage -IsWarning -Message "Netlogon Content Status Section: $($_.Exception.Message)"
            }
        }
    }

    end {
        Show-AbrDebugExecutionTime -End -TitleMessage 'DFS Health'
    }

}