Src/Private/Report/Get-AbrADSiteReplication.ps1
|
function Get-AbrADSiteReplication { <# .SYNOPSIS Used by As Built Report to retrieve Microsoft AD Domain Sites Replication information. .DESCRIPTION .NOTES Version: 0.9.12 Author: Jonathan Colon Twitter: @jcolonfzenpr Github: rebelinux .EXAMPLE .LINK #> [CmdletBinding()] param ( $Domain, [string[]] $DCs, [string]$ValidDCFromDomain ) begin { Show-AbrDebugExecutionTime -Start -TitleMessage 'Site Replication' } process { if ($DCs) { Write-PScriboMessage -Message ($reportTranslate.GetAbrADSiteReplication.Collecting -f $Domain.DNSRoot) try { $ReplInfo = [System.Collections.Generic.List[object]]::new() foreach ($DC in $DCs) { if (Get-DCWinRMState -ComputerName $DC -DCStatus ([ref]$DCStatus)) { $Replication = Invoke-CommandWithTimeout -Session $TempPssSession -ScriptBlock { Get-ADReplicationConnection -Server $using:DC -Properties * } if ($Replication) { try { foreach ($Repl in $Replication) { try { $inObj = [ordered] @{ $reportTranslate.GetAbrADSiteReplication.Name = & { if ($Repl.AutoGenerated) { $reportTranslate.GetAbrADSiteReplication.AutoGeneratedValue } else { $Repl.Name } } $reportTranslate.GetAbrADSiteReplication.FromSite = $Repl.fromserver.Split(',')[3].SubString($Repl.fromserver.Split(',')[3].IndexOf('=') + 1) $reportTranslate.GetAbrADSiteReplication.GUID = $Repl.ObjectGUID $reportTranslate.GetAbrADSiteReplication.Description = $Repl.Description $reportTranslate.GetAbrADSiteReplication.FromServer = ConvertTo-ADObjectName $Repl.ReplicateFromDirectoryServer.Split(',', 2)[1] -Session $TempPssSession -DC $DC $reportTranslate.GetAbrADSiteReplication.ToServer = ConvertTo-ADObjectName $Repl.ReplicateToDirectoryServer -Session $TempPssSession -DC $DC $reportTranslate.GetAbrADSiteReplication.ReplicatedNamingContexts = $Repl.ReplicatedNamingContexts $reportTranslate.GetAbrADSiteReplication.TransportProtocol = $Repl.InterSiteTransportProtocol $reportTranslate.GetAbrADSiteReplication.AutoGenerated = $Repl.AutoGenerated $reportTranslate.GetAbrADSiteReplication.Enabled = $Repl.enabledConnection $reportTranslate.GetAbrADSiteReplication.Created = ($Repl.Created).ToUniversalTime().toString('r') } $ReplInfo.Add([pscustomobject](ConvertTo-HashToYN $inObj)) if ($HealthCheck.Site.Replication) { $ReplInfo | Where-Object { $_.$($reportTranslate.GetAbrADSiteReplication.Enabled) -ne 'Yes' } | Set-Style -Style Warning -Property $reportTranslate.GetAbrADSiteReplication.Enabled $ReplInfo | Where-Object { $_.$($reportTranslate.GetAbrADSiteReplication.AutoGenerated) -ne 'Yes' } | Set-Style -Style Warning -Property $reportTranslate.GetAbrADSiteReplication.AutoGenerated } } catch { Write-PScriboMessage -IsWarning -Message "$($_.Exception.Message) (Site Replication Connection Item)" } } } catch { Write-PScriboMessage -IsWarning -Message "$($_.Exception.Message) (Site Replication Connection Section)" } } } } if ($ReplInfo) { if ($InfoLevel.Domain -ge 2) { Section -Style Heading4 $reportTranslate.GetAbrADSiteReplication.ReplicationConnectionTitle { Paragraph $reportTranslate.GetAbrADSiteReplication.ReplicationConnectionParagraph BlankLine foreach ($Repl in ($ReplInfo | Sort-Object -Property 'Replicate From Directory Server')) { Section -Style NOTOCHeading4 -ExcludeFromTOC "Site: $($Repl.$($reportTranslate.GetAbrADSiteReplication.FromSite)): From: $($Repl.$($reportTranslate.GetAbrADSiteReplication.FromServer)) To: $($Repl.$($reportTranslate.GetAbrADSiteReplication.ToServer))" { $TableParams = @{ Name = "$($reportTranslate.GetAbrADSiteReplication.ReplicationConnectionTableName) - $($Repl.$($reportTranslate.GetAbrADSiteReplication.ToServer))" List = $true ColumnWidths = 40, 60 } if ($Report.ShowTableCaptions) { $TableParams['Caption'] = "- $($TableParams.Name)" } $Repl | Table @TableParams } } } } else { Section -Style Heading4 $reportTranslate.GetAbrADSiteReplication.ReplicationConnectionTitle { Paragraph $reportTranslate.GetAbrADSiteReplication.ReplicationConnectionSummaryParagraph BlankLine $TableParams = @{ Name = "$($reportTranslate.GetAbrADSiteReplication.ReplicationConnectionTableName) - $($Domain.DNSRoot.ToString().ToUpper())" List = $false Columns = $reportTranslate.GetAbrADSiteReplication.Name, $reportTranslate.GetAbrADSiteReplication.FromServer, $reportTranslate.GetAbrADSiteReplication.FromSite ColumnWidths = 33, 33, 34 } if ($Report.ShowTableCaptions) { $TableParams['Caption'] = "- $($TableParams.Name)" } $ReplInfo | Sort-Object -Property 'Replicate From Directory Server' | Table @TableParams } } } else { Write-PScriboMessage -Message ($reportTranslate.GetAbrADSiteReplication.ReplicationConnectionNoData -f $Domain.DNSRoot) } } catch { Write-PScriboMessage -IsWarning -Message "$($_.Exception.Message) (Replication Connection)" } } try { if ($HealthCheck.Site.Replication) { $DCPssSession = Get-ValidPSSession -ComputerName $ValidDCFromDomain -SessionName $($ValidDCFromDomain) -PSSTable ([ref]$PSSTable) if ($DCPssSession) { $RepStatus = Invoke-CommandWithTimeout -Session $DCPssSession -ScriptBlock { repadmin /showrepl /repsto /csv | ConvertFrom-Csv } } else { if (-not $_.Exception.MessageId) { $ErrorMessage = $_.FullyQualifiedErrorId } else { $ErrorMessage = $_.Exception.MessageId } Write-PScriboMessage -IsWarning -Message "Replication Status Section: New-PSSession: Unable to connect to $($ValidDCFromDomain): $ErrorMessage" } if ($RepStatus) { Section -Style Heading4 $reportTranslate.GetAbrADSiteReplication.ReplicationStatusTitle { $OutObj = [System.Collections.Generic.List[object]]::new() foreach ($Status in $RepStatus) { try { $inObj = [ordered] @{ $reportTranslate.GetAbrADSiteReplication.FromServer = $Status.'Source DSA' $reportTranslate.GetAbrADSiteReplication.ToServer = $Status.'Destination DSA' $reportTranslate.GetAbrADSiteReplication.FromSite = $Status.'Source DSA Site' $reportTranslate.GetAbrADSiteReplication.LastSuccessTime = $Status.'Last Success Time' $reportTranslate.GetAbrADSiteReplication.LastFailureStatus = $Status.'Last Failure Status' $reportTranslate.GetAbrADSiteReplication.LastFailureTime = $Status.'Last Failure Time' $reportTranslate.GetAbrADSiteReplication.Failures = $Status.'Number of Failures' } $OutObj.Add([pscustomobject](ConvertTo-HashToYN $inObj)) } catch { Write-PScriboMessage -IsWarning -Message "$($_.Exception.Message) (Replication Status)" } } if ($HealthCheck.Site.Replication) { $OutObj | Where-Object { $_.$($reportTranslate.GetAbrADSiteReplication.LastFailureStatus) -gt 0 } | Set-Style -Style Warning -Property $reportTranslate.GetAbrADSiteReplication.LastFailureStatus } $TableParams = @{ Name = "$($reportTranslate.GetAbrADSiteReplication.ReplicationStatusTableName) - $($Domain.Name.ToUpper())" List = $false ColumnWidths = 14, 14, 14, 15, 14, 15, 14 } if ($Report.ShowTableCaptions) { $TableParams['Caption'] = "- $($TableParams.Name)" } $OutObj | Sort-Object -Property $reportTranslate.GetAbrADSiteReplication.FromServer | Table @TableParams if ($HealthCheck.Site.Replication -and ($OutObj | Where-Object { $_.$($reportTranslate.GetAbrADSiteReplication.LastFailureStatus) -gt 0 })) { Paragraph $reportTranslate.GetAbrADSiteReplication.ReplicationStatusHealthCheck -Bold -Underline BlankLine Paragraph { Text $reportTranslate.GetAbrADSiteReplication.ReplicationStatusBestPractices -Bold Text $reportTranslate.GetAbrADSiteReplication.ReplicationStatusBP } BlankLine } } } else { Write-PScriboMessage -Message ($reportTranslate.GetAbrADSiteReplication.ReplicationStatusNoData -f $Domain.DNSRoot) } } } catch { Write-PScriboMessage -IsWarning -Message "$($_.Exception.Message) (Site Replication Status)" } } end { Show-AbrDebugExecutionTime -End -TitleMessage 'Site Replication' } } |