Src/Private/Report/Get-AbrADSite.ps1
|
function Get-AbrADSite { <# .SYNOPSIS Used by As Built Report to retrieve Microsoft AD Domain Sites information. .DESCRIPTION .NOTES Version: 0.9.12 Author: Jonathan Colon Twitter: @jcolonfzenpr Github: rebelinux .EXAMPLE .LINK #> [CmdletBinding()] param ( ) begin { Write-PScriboMessage -Message ($reportTranslate.GetAbrADSite.Collecting -f $ForestInfo) Show-AbrDebugExecutionTime -Start -TitleMessage 'AD Site' } process { try { $Site = Invoke-CommandWithTimeout -Session $TempPssSession -ScriptBlock { Get-ADReplicationSite -Filter * -Properties * } if ($Site) { Section -Style Heading3 $reportTranslate.GetAbrADSite.Replication { Paragraph $reportTranslate.GetAbrADSite.ReplicationParagraph1 BlankLine Paragraph $reportTranslate.GetAbrADSite.ReplicationParagraph2 if ($Options.EnableDiagrams) { try { try { $Graph = Get-AbrDiagrammer -DiagramType 'Replication' -DiagramOutput base64 -PSSessionObject $TempPssSession } catch { Write-PScriboMessage -IsWarning -Message "Replication Diagram Graph: $($_.Exception.Message)" } if ($Graph) { $BestAspectRatio = Get-BestImageAspectRatio -GraphObj $Graph -MaxWidth 600 -MaxHeight 600 PageBreak Section -Style Heading4 $reportTranslate.GetAbrADSite.ReplicationDiagram { Image -Base64 $Graph -Text $reportTranslate.GetAbrADSite.ReplicationDiagram -Width $BestAspectRatio.Width -Height $BestAspectRatio.Height -Align Center PageBreak } } } catch { Write-PScriboMessage -IsWarning -Message "Replication Diagram Section: $($_.Exception.Message)" } } Section -Style Heading4 $reportTranslate.GetAbrADSite.Sites { $OutObj = [System.Collections.Generic.List[object]]::new() foreach ($Item in $Site) { try { $SubnetArray = [System.Collections.Generic.List[object]]::new() $Subnets = $Item.Subnets foreach ($Object in $Subnets) { $SubnetName = Invoke-CommandWithTimeout -Session $TempPssSession -ScriptBlock { Get-ADReplicationSubnet $using:Object } $SubnetArray.Add($SubnetName.Name) } $inObj = [ordered] @{ $reportTranslate.GetAbrADSite.SiteName = $Item.Name $reportTranslate.GetAbrADSite.Description = $Item.Description $reportTranslate.GetAbrADSite.SubnetsCol = switch (($SubnetArray).count) { 0 { $reportTranslate.GetAbrADSite.NoSubnetAssigned } default { $SubnetArray } } $reportTranslate.GetAbrADSite.DomainControllers = & { $ServerArray = [System.Collections.Generic.List[object]]::new() $Servers = try { Get-ADObjectSearch -DN "CN=Servers,$($Item.DistinguishedName)" -Filter { objectClass -eq 'Server' } -Properties 'DNSHostName' -SelectPrty 'DNSHostName', 'Name' -Session $TempPssSession } catch { 'Unknown' } foreach ($Object in $Servers) { $ServerArray.Add($Object.Name) } if ($ServerArray) { $ServerArray } else { $reportTranslate.GetAbrADSite.NoDCAssigned } } } $OutObj.Add([pscustomobject](ConvertTo-HashToYN $inObj)) } catch { Write-PScriboMessage -IsWarning -Message "$($_.Exception.Message) (Domain Site)" } } if ($HealthCheck.Site.BestPractice) { $List = [System.Collections.Generic.List[object]]::new() $Num = 0 if ($OutObj | Where-Object { $_.$($reportTranslate.GetAbrADSite.Description) -eq '--' }) { $OutObj | Where-Object { $_.$($reportTranslate.GetAbrADSite.Description) -eq '--' } | Set-Style -Style Warning -Property $reportTranslate.GetAbrADSite.Description $Num++ foreach ( $OBJ in ($OutObj | Where-Object { $_.$($reportTranslate.GetAbrADSite.Description) -eq '--' }) ) { $OBJ.$($reportTranslate.GetAbrADSite.Description) = $OBJ.$($reportTranslate.GetAbrADSite.Description) + " ($Num)" } $List.Add($reportTranslate.GetAbrADSite.DescBP) } if ($OutObj | Where-Object { $_.$($reportTranslate.GetAbrADSite.SubnetsCol) -eq $reportTranslate.GetAbrADSite.NoSubnetAssigned }) { $OutObj | Where-Object { $_.$($reportTranslate.GetAbrADSite.SubnetsCol) -eq $reportTranslate.GetAbrADSite.NoSubnetAssigned } | Set-Style -Style Warning -Property $reportTranslate.GetAbrADSite.SubnetsCol $Num++ foreach ( $OBJ in ($OutObj | Where-Object { $_.$($reportTranslate.GetAbrADSite.SubnetsCol) -eq $reportTranslate.GetAbrADSite.NoSubnetAssigned }) ) { $OBJ.$($reportTranslate.GetAbrADSite.SubnetsCol) = $OBJ.$($reportTranslate.GetAbrADSite.SubnetsCol) + " ($Num)" } $List.Add($reportTranslate.GetAbrADSite.SiteSubnetBP) } if ($OutObj | Where-Object { $_.$($reportTranslate.GetAbrADSite.DomainControllers) -eq $reportTranslate.GetAbrADSite.NoDCAssigned }) { $OutObj | Where-Object { $_.$($reportTranslate.GetAbrADSite.DomainControllers) -eq $reportTranslate.GetAbrADSite.NoDCAssigned } | Set-Style -Style Warning -Property $reportTranslate.GetAbrADSite.DomainControllers $Num++ foreach ( $OBJ in ($OutObj | Where-Object { $_.$($reportTranslate.GetAbrADSite.DomainControllers) -eq $reportTranslate.GetAbrADSite.NoDCAssigned } ) ) { $OBJ.$($reportTranslate.GetAbrADSite.DomainControllers) = $OBJ.$($reportTranslate.GetAbrADSite.DomainControllers) + " ($Num)" } $List.Add($reportTranslate.GetAbrADSite.SiteDCBP) } } $TableParams = @{ Name = "$($reportTranslate.GetAbrADSite.Sites) - $($ForestInfo)" List = $false ColumnWidths = 25, 30, 20, 25 } if ($Report.ShowTableCaptions) { $TableParams['Caption'] = "- $($TableParams.Name)" } $OutObj | Sort-Object -Property $reportTranslate.GetAbrADSite.SiteName | Table @TableParams if ($List) { Paragraph $reportTranslate.GetAbrADSite.HealthCheck -Bold -Underline List -Item $List -Numbered } } try { $Replications = Invoke-CommandWithTimeout -Session $TempPssSession -ScriptBlock { Get-ADReplicationConnection -Properties * -Filter * } if ($Replications) { Section -ExcludeFromTOC -Style NOTOCHeading4 $reportTranslate.GetAbrADSite.ConnectionObjects { $OutObj = [System.Collections.Generic.List[object]]::new() foreach ($Repl in $Replications) { try { $inObj = [ordered] @{ $reportTranslate.GetAbrADSite.Name = & { if ($Repl.AutoGenerated) { $reportTranslate.GetAbrADSite.AutoGenerated } else { $Repl.Name } } $reportTranslate.GetAbrADSite.FromServer = $Repl.ReplicateFromDirectoryServer.Split(',')[1].SubString($Repl.ReplicateFromDirectoryServer.Split(',')[1].IndexOf('=') + 1) $reportTranslate.GetAbrADSite.ToServer = $Repl.ReplicateToDirectoryServer.Split(',')[0].SubString($Repl.ReplicateToDirectoryServer.Split(',')[0].IndexOf('=') + 1) $reportTranslate.GetAbrADSite.FromSite = $Repl.fromserver.Split(',')[3].SubString($Repl.fromserver.Split(',')[3].IndexOf('=') + 1) } $OutObj.Add([pscustomobject](ConvertTo-HashToYN $inObj)) if ($HealthCheck.Site.Replication) { $OutObj | Where-Object { $_.$($reportTranslate.GetAbrADSite.Name) -ne $reportTranslate.GetAbrADSite.AutoGenerated } | Set-Style -Style Warning -Property $reportTranslate.GetAbrADSite.Name } } catch { Write-PScriboMessage -IsWarning -Message "$($_.Exception.Message) (Site Replication Connection Item)" } } $TableParams = @{ Name = "$($reportTranslate.GetAbrADSite.ConnectionObjects) - $($ForestInfo)" List = $false ColumnWidths = 25, 25, 25, 25 } if ($Report.ShowTableCaptions) { $TableParams['Caption'] = "- $($TableParams.Name)" } $OutObj | Sort-Object -Property $reportTranslate.GetAbrADSite.FromSite | Table @TableParams if ($HealthCheck.Site.BestPractice -and ($OutObj | Where-Object { $_.$($reportTranslate.GetAbrADSite.Name) -ne $reportTranslate.GetAbrADSite.AutoGenerated })) { Paragraph $reportTranslate.GetAbrADSite.HealthCheck -Bold -Underline BlankLine if ($OutObj | Where-Object { $_.$($reportTranslate.GetAbrADSite.Name) -ne $reportTranslate.GetAbrADSite.AutoGenerated }) { Paragraph { Text $reportTranslate.GetAbrADSite.BestPractice -Bold Text $reportTranslate.GetAbrADSite.ConnectionObjectsBP } } } } } else { Write-PScriboMessage -Message "No Connection Objects information found in $ForestInfo, Disabling this section." } } catch { Write-PScriboMessage -IsWarning -Message "$($_.Exception.Message) (Connection Objects)" } try { $Subnet = Invoke-CommandWithTimeout -Session $TempPssSession -ScriptBlock { Get-ADReplicationSubnet -Filter * -Properties * } if ($Subnet) { Section -Style Heading4 $reportTranslate.GetAbrADSite.SiteSubnets { $OutObj = [System.Collections.Generic.List[object]]::new() foreach ($Item in $Subnet) { try { $inObj = [ordered] @{ $reportTranslate.GetAbrADSite.Subnet = $Item.Name $reportTranslate.GetAbrADSite.Description = $Item.Description $reportTranslate.GetAbrADSite.Sites = switch ([string]::IsNullOrEmpty($Item.Site)) { $true { $reportTranslate.GetAbrADSite.NoSiteAssigned } $false { $Item.Site.Split(',')[0].SubString($Item.Site.Split(',')[0].IndexOf('=') + 1) } default { $reportTranslate.GetAbrADSite.Unknown } } } $OutObj.Add([pscustomobject](ConvertTo-HashToYN $inObj)) if ($HealthCheck.Site.BestPractice) { $OutObj | Where-Object { $_.$($reportTranslate.GetAbrADSite.Description) -eq '--' } | Set-Style -Style Warning -Property $reportTranslate.GetAbrADSite.Description $OutObj | Where-Object { $_.$($reportTranslate.GetAbrADSite.Sites) -eq $reportTranslate.GetAbrADSite.NoSiteAssigned } | Set-Style -Style Warning -Property $reportTranslate.GetAbrADSite.Sites } } catch { Write-PScriboMessage -IsWarning -Message "$($_.Exception.Message) (Site Subnets)" } } if ($HealthCheck.Site.BestPractice) { $List = [System.Collections.Generic.List[object]]::new() $Num = 0 if ($OutObj | Where-Object { $_.$($reportTranslate.GetAbrADSite.Description) -eq '--' }) { $OutObj | Where-Object { $_.$($reportTranslate.GetAbrADSite.Description) -eq '--' } | Set-Style -Style Warning -Property $reportTranslate.GetAbrADSite.Description $Num++ foreach ( $OBJ in ($OutObj | Where-Object { $_.$($reportTranslate.GetAbrADSite.Description) -eq '--' }) ) { $OBJ.$($reportTranslate.GetAbrADSite.Description) = $OBJ.$($reportTranslate.GetAbrADSite.Description) + " ($Num)" } $List.Add($reportTranslate.GetAbrADSite.DescBP) } if ($OutObj | Where-Object { $_.$($reportTranslate.GetAbrADSite.Sites) -eq $reportTranslate.GetAbrADSite.NoSiteAssigned }) { $OutObj | Where-Object { $_.$($reportTranslate.GetAbrADSite.Sites) -eq $reportTranslate.GetAbrADSite.NoSiteAssigned } | Set-Style -Style Warning -Property $reportTranslate.GetAbrADSite.Sites $Num++ foreach ( $OBJ in ($OutObj | Where-Object { $_.$($reportTranslate.GetAbrADSite.Sites) -eq $reportTranslate.GetAbrADSite.NoSiteAssigned }) ) { $OBJ.$($reportTranslate.GetAbrADSite.Sites) = $OBJ.$($reportTranslate.GetAbrADSite.Sites) + " ($Num)" } $List.Add($reportTranslate.GetAbrADSite.SubnetSiteBP) } } $TableParams = @{ Name = "$($reportTranslate.GetAbrADSite.SiteSubnets) - $($ForestInfo)" List = $false ColumnWidths = 20, 40, 40 } if ($Report.ShowTableCaptions) { $TableParams['Caption'] = "- $($TableParams.Name)" } $OutObj | Sort-Object -Property $reportTranslate.GetAbrADSite.Subnet | Table @TableParams if ($List) { Paragraph $reportTranslate.GetAbrADSite.HealthCheck -Bold -Underline List -Item $List -Numbered } if ($HealthCheck.Site.BestPractice) { try { $OutObj = [System.Collections.Generic.List[object]]::new() foreach ($Domain in $ADSystem.Domains | Where-Object { $_ -notin $Options.Exclude.Domains }) { $DomainInfo = Invoke-CommandWithTimeout -Session $TempPssSession -ScriptBlock { Get-ADDomain $using:Domain -ErrorAction Stop } foreach ($DC in ($DomainInfo.ReplicaDirectoryServers | Where-Object { $_ -notin $Options.Exclude.DCs })) { if (Get-DCWinRMState -ComputerName $DC -DCStatus ([ref]$DCStatus)) { try { $DCPssSession = Get-ValidPSSession -ComputerName $DC -SessionName $($DC) -PSSTable ([ref]$PSSTable) if ($DCPssSession) { $Path = "\\$DC\admin`$\debug\netlogon.log" if ((Invoke-CommandWithTimeout -Session $DCPssSession -ScriptBlock { Test-Path -Path $using:path -PathType Leaf }) -and (Invoke-CommandWithTimeout -Session $DCPssSession -ScriptBlock { (Get-Content -Path $using:path | Measure-Object -Line).lines -gt 0 })) { $NetLogonContents = Invoke-CommandWithTimeout -Session $DCPssSession -ScriptBlock { (Get-Content -Path $using:Path)[-200..-1] } foreach ($Line in $NetLogonContents) { if ($Line -match 'NO_CLIENT_SITE') { $inObj = [ordered] @{ $reportTranslate.GetAbrADSite.DC = $DC $reportTranslate.GetAbrADSite.IP = $Line.Split(':')[4].trim(' ').Split(' ')[1] } $OutObj.Add([pscustomobject](ConvertTo-HashToYN $inObj)) } if ($HealthCheck.Site.BestPractice) { $OutObj | Set-Style -Style Warning -Property $reportTranslate.GetAbrADSite.IP } } } else { Write-PScriboMessage -Message "Unable to read $Path on $DC" } } else { if (-not $_.Exception.MessageId) { $ErrorMessage = $_.FullyQualifiedErrorId } else { $ErrorMessage = $_.Exception.MessageId } Write-PScriboMessage -IsWarning -Message "Missing Subnet in AD Section: New-PSSession: Unable to connect to $($DC): $ErrorMessage" } } catch { Write-PScriboMessage -IsWarning -Message "Missing Subnet in AD Item table: $($_.Exception.Message)" } } } } if ($OutObj) { Section -ExcludeFromTOC -Style NOTOCHeading4 $reportTranslate.GetAbrADSite.MissingSubnets { Paragraph $reportTranslate.GetAbrADSite.MissingSubnetsParagraph BlankLine $TableParams = @{ Name = "$($reportTranslate.GetAbrADSite.MissingSubnetsTable) - $($ForestInfo)" List = $false ColumnWidths = 40, 60 } if ($Report.ShowTableCaptions) { $TableParams['Caption'] = "- $($TableParams.Name)" } $OutObj | Sort-Object -Property $reportTranslate.GetAbrADSite.DC, $reportTranslate.GetAbrADSite.IP | Get-Unique -AsString | Table @TableParams if ($HealthCheck.Site.BestPractice) { Paragraph $reportTranslate.GetAbrADSite.HealthCheck -Bold -Underline BlankLine Paragraph { Text $reportTranslate.GetAbrADSite.BestPractice -Bold Text $reportTranslate.GetAbrADSite.MissingSubnetsBP } BlankLine } } } else { Write-PScriboMessage -Message "No Missing Subnets in AD information found in $ForestInfo, Disabling this section." } } catch { Write-PScriboMessage -IsWarning -Message "Missing Subnet in AD Item Section: $($_.Exception.Message)" } } } } else { Write-PScriboMessage -Message "No Site Subnets information found in $ForestInfo, Disabling this section." } } catch { Write-PScriboMessage -IsWarning -Message "$($_.Exception.Message) (Site Subnets)" } if ($Options.EnableDiagrams) { try { try { $Graph = Get-AbrDiagrammer -DiagramType 'Sites' -DiagramOutput base64 -PSSessionObject $TempPssSession } catch { Write-PScriboMessage -IsWarning -Message "Site Topology Diagram Graph: $($_.Exception.Message)" } if ($Graph) { $BestAspectRatio = Get-BestImageAspectRatio -GraphObj $Graph -MaxWidth 600 -MaxHeight 600 PageBreak Section -Style Heading4 $reportTranslate.GetAbrADSite.SiteTopologyDiagram { Image -Base64 $Graph -Text $reportTranslate.GetAbrADSite.SiteTopologyDiagram -Width $BestAspectRatio.Width -Height $BestAspectRatio.Height -Align Center PageBreak } } } catch { Write-PScriboMessage -IsWarning -Message "Site Topology Diagram Section: $($_.Exception.Message)" } } try { $DomainDN = Invoke-CommandWithTimeout -Session $TempPssSession -ScriptBlock { (Get-ADDomain -Identity (Get-ADForest | Select-Object -ExpandProperty RootDomain )).DistinguishedName } $InterSiteTransports = try { Invoke-CommandWithTimeout -Session $TempPssSession -ErrorAction Stop -ScriptBlock { Get-ADObject -Filter { (objectClass -eq 'interSiteTransport') } -SearchBase "CN=Inter-Site Transports,CN=Sites,CN=Configuration,$using:DomainDN" -Properties * } } catch { $null } if ($InterSiteTransports) { Section -Style Heading4 $reportTranslate.GetAbrADSite.InterSiteTransports { Paragraph $reportTranslate.GetAbrADSite.InterSiteTransportsParagraph BlankLine try { $OutObj = [System.Collections.Generic.List[object]]::new() foreach ($Item in $InterSiteTransports) { $SiteArray = [System.Collections.Generic.List[object]]::new() switch ($Item.options) { $null { $BridgeAlSiteLinks = $reportTranslate.GetAbrADSite.Yes $IgnoreSchedules = $reportTranslate.GetAbrADSite.No } 0 { $BridgeAlSiteLinks = $reportTranslate.GetAbrADSite.Yes $IgnoreSchedules = $reportTranslate.GetAbrADSite.No } 1 { $BridgeAlSiteLinks = $reportTranslate.GetAbrADSite.Yes $IgnoreSchedules = $reportTranslate.GetAbrADSite.Yes } 2 { $BridgeAlSiteLinks = $reportTranslate.GetAbrADSite.No $IgnoreSchedules = $reportTranslate.GetAbrADSite.No } 3 { $BridgeAlSiteLinks = $reportTranslate.GetAbrADSite.No $IgnoreSchedules = $reportTranslate.GetAbrADSite.Yes } default { $BridgeAlSiteLinks = $reportTranslate.GetAbrADSite.Unknown $IgnoreSchedules = $reportTranslate.GetAbrADSite.Unknown } } $inObj = [ordered] @{ $reportTranslate.GetAbrADSite.Name = $Item.Name $reportTranslate.GetAbrADSite.BridgeAllSiteLinks = $BridgeAlSiteLinks $reportTranslate.GetAbrADSite.IgnoreSchedules = $IgnoreSchedules } $OutObj.Add([pscustomobject](ConvertTo-HashToYN $inObj)) } $TableParams = @{ Name = "$($reportTranslate.GetAbrADSite.InterSiteTransports) - $($ForestInfo)" List = $false ColumnWidths = 34, 33, 33 } if ($Report.ShowTableCaptions) { $TableParams['Caption'] = "- $($TableParams.Name)" } $OutObj | Sort-Object -Property $reportTranslate.GetAbrADSite.Name | Table @TableParams } catch { Write-PScriboMessage -IsWarning -Message "$($_.Exception.Message) (Inter-Site Transports section)" } try { Section -Style Heading4 $reportTranslate.GetAbrADSite.IPSection { try { $IPLink = Invoke-CommandWithTimeout -Session $TempPssSession -ScriptBlock { Get-ADReplicationSiteLink -Filter * -Properties * | Where-Object { $_.InterSiteTransportProtocol -eq 'IP' } } if ($IPLink) { Section -Style Heading5 $reportTranslate.GetAbrADSite.SiteLinks { foreach ($Item in $IPLink) { $OutObj = [System.Collections.Generic.List[object]]::new() try { $SiteArray = [System.Collections.Generic.List[object]]::new() $Sites = $Item.siteList foreach ($Object in $Sites) { $SiteName = Invoke-CommandWithTimeout -Session $TempPssSession -ScriptBlock { Get-ADReplicationSite -Identity $using:Object } $SiteArray.Add($SiteName.Name) } $inObj = [ordered] @{ $reportTranslate.GetAbrADSite.SiteLinkName = $Item.Name $reportTranslate.GetAbrADSite.Cost = $Item.Cost $reportTranslate.GetAbrADSite.ReplicationFrequency = "$($Item.ReplicationFrequencyInMinutes) min" $reportTranslate.GetAbrADSite.TransportProtocol = $Item.InterSiteTransportProtocol $reportTranslate.GetAbrADSite.Options = switch ($Item.Options) { $null { $reportTranslate.GetAbrADSite.ChangeNotificationDisabled } '0' { $reportTranslate.GetAbrADSite.Option0 } '1' { $reportTranslate.GetAbrADSite.Option1 } '2' { $reportTranslate.GetAbrADSite.Option2 } '3' { $reportTranslate.GetAbrADSite.Option3 } '4' { $reportTranslate.GetAbrADSite.Option4 } '5' { $reportTranslate.GetAbrADSite.Option5 } '6' { $reportTranslate.GetAbrADSite.Option6 } '7' { $reportTranslate.GetAbrADSite.Option7 } default { "Unknown siteLink option: $($Item.Options)" } } $reportTranslate.GetAbrADSite.Sites = $SiteArray -join '; ' $reportTranslate.GetAbrADSite.ProtectedFromAccidentalDeletion = $Item.ProtectedFromAccidentalDeletion $reportTranslate.GetAbrADSite.Description = $Item.Description } $OutObj.Add([pscustomobject](ConvertTo-HashToYN $inObj)) if ($HealthCheck.Site.BestPractice) { $OutObj | Where-Object { $_.$($reportTranslate.GetAbrADSite.Description) -eq '--' } | Set-Style -Style Warning -Property $reportTranslate.GetAbrADSite.Description $OutObj | Where-Object { $_.$($reportTranslate.GetAbrADSite.Options) -eq $reportTranslate.GetAbrADSite.ChangeNotificationDisabled -or $Null -eq $_.$($reportTranslate.GetAbrADSite.Options) } | Set-Style -Style Warning -Property $reportTranslate.GetAbrADSite.Options $OutObj | Where-Object { $_.$($reportTranslate.GetAbrADSite.ProtectedFromAccidentalDeletion) -eq $reportTranslate.GetAbrADSite.No } | Set-Style -Style Warning -Property $reportTranslate.GetAbrADSite.ProtectedFromAccidentalDeletion } $TableParams = @{ Name = "$($reportTranslate.GetAbrADSite.SiteLinks) - $($Item.Name)" List = $true ColumnWidths = 40, 60 } if ($Report.ShowTableCaptions) { $TableParams['Caption'] = "- $($TableParams.Name)" } $OutObj | Sort-Object -Property $reportTranslate.GetAbrADSite.SiteLinkName | Table @TableParams if ($HealthCheck.Site.BestPractice -and (($OutObj | Where-Object { $_.$($reportTranslate.GetAbrADSite.ProtectedFromAccidentalDeletion) -eq $reportTranslate.GetAbrADSite.No }) -or (($OutObj | Where-Object { $_.$($reportTranslate.GetAbrADSite.Description) -eq '--' }) -or ($OutObj | Where-Object { $_.$($reportTranslate.GetAbrADSite.Options) -eq $reportTranslate.GetAbrADSite.ChangeNotificationDisabled -or $Null -eq $_.$($reportTranslate.GetAbrADSite.Options) })))) { Paragraph $reportTranslate.GetAbrADSite.HealthCheck -Bold -Underline BlankLine if ($OutObj | Where-Object { $_.$($reportTranslate.GetAbrADSite.Description) -eq '--' }) { Paragraph { Text $reportTranslate.GetAbrADSite.BestPractice -Bold Text $reportTranslate.GetAbrADSite.DescBP } BlankLine } if ($OutObj | Where-Object { $_.$($reportTranslate.GetAbrADSite.Options) -eq $reportTranslate.GetAbrADSite.ChangeNotificationDisabled -or $Null -eq $_.$($reportTranslate.GetAbrADSite.Options) }) { Paragraph { Text $reportTranslate.GetAbrADSite.BestPractice -Bold Text $reportTranslate.GetAbrADSite.SiteLinkChangeNotifBP } BlankLine } if ($OutObj | Where-Object { $_.$($reportTranslate.GetAbrADSite.ProtectedFromAccidentalDeletion) -eq $reportTranslate.GetAbrADSite.No }) { Paragraph { Text $reportTranslate.GetAbrADSite.BestPractice -Bold Text $reportTranslate.GetAbrADSite.SiteLinkProtectedBP } BlankLine } } } catch { Write-PScriboMessage -IsWarning -Message "$($_.Exception.Message) (IP Site Links table)" } } } } else { Write-PScriboMessage -Message "No IP Site Links information found in $ForestInfo, Disabling this section." } } catch { Write-PScriboMessage -IsWarning -Message "$($_.Exception.Message) (IP Site Links Section)" } try { $IPLinkBridges = Invoke-CommandWithTimeout -Session $TempPssSession -ScriptBlock { Get-ADReplicationSiteLinkBridge -Filter * -Properties * | Where-Object { $_.InterSiteTransportProtocol -eq 'IP' } } if ($IPLinkBridges) { Section -Style Heading5 $reportTranslate.GetAbrADSite.SiteLinkBridges { foreach ($Item in $IPLinkBridges) { $OutObj = [System.Collections.Generic.List[object]]::new() try { $SiteArray = [System.Collections.Generic.List[object]]::new() $Sites = $Item.siteLinkList foreach ($Object in $Sites) { $SiteName = Invoke-CommandWithTimeout -Session $TempPssSession -ScriptBlock { Get-ADReplicationSiteLink -Identity $using:Object } $SiteArray.Add($SiteName.Name) } $inObj = [ordered] @{ $reportTranslate.GetAbrADSite.SiteLinkBridgesName = $Item.Name $reportTranslate.GetAbrADSite.TransportProtocol = $Item.InterSiteTransportProtocol $reportTranslate.GetAbrADSite.SiteLinksCol = $SiteArray -join '; ' $reportTranslate.GetAbrADSite.ProtectedFromAccidentalDeletion = $Item.ProtectedFromAccidentalDeletion $reportTranslate.GetAbrADSite.Description = $Item.Description } $OutObj.Add([pscustomobject](ConvertTo-HashToYN $inObj)) if ($HealthCheck.Site.BestPractice) { $OutObj | Where-Object { $_.$($reportTranslate.GetAbrADSite.Description) -eq '--' } | Set-Style -Style Warning -Property $reportTranslate.GetAbrADSite.Description $OutObj | Where-Object { $_.$($reportTranslate.GetAbrADSite.ProtectedFromAccidentalDeletion) -eq $reportTranslate.GetAbrADSite.No } | Set-Style -Style Warning -Property $reportTranslate.GetAbrADSite.ProtectedFromAccidentalDeletion } $TableParams = @{ Name = "$($reportTranslate.GetAbrADSite.SiteLinkBridges) - $($Item.Name)" List = $true ColumnWidths = 40, 60 } if ($Report.ShowTableCaptions) { $TableParams['Caption'] = "- $($TableParams.Name)" } $OutObj | Table @TableParams if ($HealthCheck.Site.BestPractice -and (($OutObj | Where-Object { $_.$($reportTranslate.GetAbrADSite.ProtectedFromAccidentalDeletion) -eq $reportTranslate.GetAbrADSite.No }) -or (($OutObj | Where-Object { $_.$($reportTranslate.GetAbrADSite.Description) -eq '--' })))) { Paragraph $reportTranslate.GetAbrADSite.HealthCheck -Bold -Underline BlankLine if ($OutObj | Where-Object { $_.$($reportTranslate.GetAbrADSite.Description) -eq '--' }) { Paragraph { Text $reportTranslate.GetAbrADSite.BestPractice -Bold Text $reportTranslate.GetAbrADSite.DescBP } BlankLine } if ($OutObj | Where-Object { $_.$($reportTranslate.GetAbrADSite.ProtectedFromAccidentalDeletion) -eq $reportTranslate.GetAbrADSite.No }) { Paragraph { Text $reportTranslate.GetAbrADSite.BestPractice -Bold Text $reportTranslate.GetAbrADSite.SiteLinkBridgesProtectedBP } BlankLine } } } catch { Write-PScriboMessage -IsWarning -Message "$($_.Exception.Message) (IP Site Links Bridges table)" } } } } else { Write-PScriboMessage -Message "No IP Site Links Bridges information found in $ForestInfo, Disabling this section." } } catch { Write-PScriboMessage -IsWarning -Message "$($_.Exception.Message) (IP Site Links Section)" } } } catch { Write-PScriboMessage -IsWarning -Message "$($_.Exception.Message) (IP)" } try { $IPLink = Invoke-CommandWithTimeout -Session $TempPssSession -ScriptBlock { Get-ADReplicationSiteLink -Filter * -Properties * | Where-Object { $_.InterSiteTransportProtocol -eq 'SMTP' } } if ($IPLink) { Section -Style Heading4 $reportTranslate.GetAbrADSite.SMTPSection { Paragraph $reportTranslate.GetAbrADSite.SMTPParagraph try { Section -Style Heading5 $reportTranslate.GetAbrADSite.SiteLinks { foreach ($Item in $IPLink) { $OutObj = [System.Collections.Generic.List[object]]::new() try { $SiteArray = [System.Collections.Generic.List[object]]::new() $Sites = $Item.siteList foreach ($Object in $Sites) { $SiteName = Invoke-CommandWithTimeout -Session $TempPssSession -ScriptBlock { Get-ADReplicationSite -Identity $using:Object } $SiteArray.Add($SiteName.Name) } $inObj = [ordered] @{ $reportTranslate.GetAbrADSite.SiteLinkName = $Item.Name $reportTranslate.GetAbrADSite.Cost = $Item.Cost $reportTranslate.GetAbrADSite.ReplicationFrequency = "$($Item.ReplicationFrequencyInMinutes) min" $reportTranslate.GetAbrADSite.TransportProtocol = $Item.InterSiteTransportProtocol $reportTranslate.GetAbrADSite.Options = switch ($Item.Options) { $null { $reportTranslate.GetAbrADSite.ChangeNotificationDisabled } '0' { $reportTranslate.GetAbrADSite.Option0 } '1' { $reportTranslate.GetAbrADSite.Option1 } '2' { $reportTranslate.GetAbrADSite.Option2 } '3' { $reportTranslate.GetAbrADSite.Option3 } '4' { $reportTranslate.GetAbrADSite.Option4 } '5' { $reportTranslate.GetAbrADSite.Option5 } '6' { $reportTranslate.GetAbrADSite.Option6 } '7' { $reportTranslate.GetAbrADSite.Option7 } default { "Unknown siteLink option: $($Item.Options)" } } $reportTranslate.GetAbrADSite.Sites = $SiteArray -join '; ' $reportTranslate.GetAbrADSite.ProtectedFromAccidentalDeletion = $Item.ProtectedFromAccidentalDeletion $reportTranslate.GetAbrADSite.Description = $Item.Description } $OutObj.Add([pscustomobject](ConvertTo-HashToYN $inObj)) if ($HealthCheck.Site.BestPractice) { $OutObj | Where-Object { $_.$($reportTranslate.GetAbrADSite.Description) -eq '--' } | Set-Style -Style Warning -Property $reportTranslate.GetAbrADSite.Description $OutObj | Where-Object { $_.$($reportTranslate.GetAbrADSite.Options) -eq $reportTranslate.GetAbrADSite.ChangeNotificationDisabled -or $Null -eq $_.$($reportTranslate.GetAbrADSite.Options) } | Set-Style -Style Warning -Property $reportTranslate.GetAbrADSite.Options $OutObj | Where-Object { $_.$($reportTranslate.GetAbrADSite.ProtectedFromAccidentalDeletion) -eq $reportTranslate.GetAbrADSite.No } | Set-Style -Style Warning -Property $reportTranslate.GetAbrADSite.ProtectedFromAccidentalDeletion } $TableParams = @{ Name = "$($reportTranslate.GetAbrADSite.SiteLinks) - $($Item.Name)" List = $true ColumnWidths = 40, 60 } if ($Report.ShowTableCaptions) { $TableParams['Caption'] = "- $($TableParams.Name)" } $OutObj | Sort-Object -Property $reportTranslate.GetAbrADSite.SiteLinkName | Table @TableParams if ($HealthCheck.Site.BestPractice -and (($OutObj | Where-Object { $_.$($reportTranslate.GetAbrADSite.ProtectedFromAccidentalDeletion) -eq $reportTranslate.GetAbrADSite.No }) -or (($OutObj | Where-Object { $_.$($reportTranslate.GetAbrADSite.Description) -eq '--' }) -or ($OutObj | Where-Object { $_.$($reportTranslate.GetAbrADSite.Options) -eq $reportTranslate.GetAbrADSite.ChangeNotificationDisabled -or $Null -eq $_.$($reportTranslate.GetAbrADSite.Options) })))) { Paragraph $reportTranslate.GetAbrADSite.HealthCheck -Bold -Underline BlankLine if ($OutObj | Where-Object { $_.$($reportTranslate.GetAbrADSite.Description) -eq '--' }) { Paragraph { Text $reportTranslate.GetAbrADSite.BestPractice -Bold Text $reportTranslate.GetAbrADSite.DescBP } BlankLine } if ($OutObj | Where-Object { $_.$($reportTranslate.GetAbrADSite.Options) -eq $reportTranslate.GetAbrADSite.ChangeNotificationDisabled -or $Null -eq $_.$($reportTranslate.GetAbrADSite.Options) }) { Paragraph { Text $reportTranslate.GetAbrADSite.BestPractice -Bold Text $reportTranslate.GetAbrADSite.SMTPChangeNotifBP } BlankLine } if ($OutObj | Where-Object { $_.$($reportTranslate.GetAbrADSite.ProtectedFromAccidentalDeletion) -eq $reportTranslate.GetAbrADSite.No }) { Paragraph { Text $reportTranslate.GetAbrADSite.BestPractice -Bold Text $reportTranslate.GetAbrADSite.SiteLinkProtectedBP } BlankLine } } } catch { Write-PScriboMessage -IsWarning -Message "$($_.Exception.Message) (SMTP Site Links table)" } } } } catch { Write-PScriboMessage -IsWarning -Message "$($_.Exception.Message) (SMTP Site Links Section)" } try { $IPLinkBridges = Invoke-CommandWithTimeout -Session $TempPssSession -ScriptBlock { Get-ADReplicationSiteLinkBridge -Filter * -Properties * | Where-Object { $_.InterSiteTransportProtocol -eq 'SMTP' } } if ($IPLinkBridges) { Section -Style Heading5 $reportTranslate.GetAbrADSite.SiteLinkBridges { foreach ($Item in $IPLinkBridges) { $OutObj = [System.Collections.Generic.List[object]]::new() try { $SiteArray = [System.Collections.Generic.List[object]]::new() $Sites = $Item.siteLinkList foreach ($Object in $Sites) { $SiteName = Invoke-CommandWithTimeout -Session $TempPssSession -ScriptBlock { Get-ADReplicationSiteLink -Identity $using:Object } $SiteArray.Add($SiteName.Name) } $inObj = [ordered] @{ $reportTranslate.GetAbrADSite.SiteLinkBridgesName = $Item.Name $reportTranslate.GetAbrADSite.TransportProtocol = $Item.InterSiteTransportProtocol $reportTranslate.GetAbrADSite.SiteLinksCol = $SiteArray -join '; ' $reportTranslate.GetAbrADSite.ProtectedFromAccidentalDeletion = $Item.ProtectedFromAccidentalDeletion $reportTranslate.GetAbrADSite.Description = $Item.Description } $OutObj.Add([pscustomobject](ConvertTo-HashToYN $inObj)) if ($HealthCheck.Site.BestPractice) { $OutObj | Where-Object { $_.$($reportTranslate.GetAbrADSite.Description) -eq '--' } | Set-Style -Style Warning -Property $reportTranslate.GetAbrADSite.Description $OutObj | Where-Object { $_.$($reportTranslate.GetAbrADSite.ProtectedFromAccidentalDeletion) -eq $reportTranslate.GetAbrADSite.No } | Set-Style -Style Warning -Property $reportTranslate.GetAbrADSite.ProtectedFromAccidentalDeletion } $TableParams = @{ Name = "$($reportTranslate.GetAbrADSite.SiteLinkBridges) - $($Item.Name)" List = $true ColumnWidths = 40, 60 } if ($Report.ShowTableCaptions) { $TableParams['Caption'] = "- $($TableParams.Name)" } $OutObj | Table @TableParams if ($HealthCheck.Site.BestPractice -and (($OutObj | Where-Object { $_.$($reportTranslate.GetAbrADSite.ProtectedFromAccidentalDeletion) -eq $reportTranslate.GetAbrADSite.No }) -or (($OutObj | Where-Object { $_.$($reportTranslate.GetAbrADSite.Description) -eq '--' })))) { Paragraph $reportTranslate.GetAbrADSite.HealthCheck -Bold -Underline BlankLine if ($OutObj | Where-Object { $_.$($reportTranslate.GetAbrADSite.Description) -eq '--' }) { Paragraph { Text $reportTranslate.GetAbrADSite.BestPractice -Bold Text $reportTranslate.GetAbrADSite.DescBP } BlankLine } if ($OutObj | Where-Object { $_.$($reportTranslate.GetAbrADSite.ProtectedFromAccidentalDeletion) -eq $reportTranslate.GetAbrADSite.No }) { Paragraph { Text $reportTranslate.GetAbrADSite.BestPractice -Bold Text $reportTranslate.GetAbrADSite.SiteLinkBridgesProtectedBP } BlankLine } } } catch { Write-PScriboMessage -IsWarning -Message "$($_.Exception.Message) (SMTP Site Links Bridges table)" } } } } else { Write-PScriboMessage -Message "No SMTP Site Links Bridges information found in $ForestInfo, Disabling this section." } } catch { Write-PScriboMessage -IsWarning -Message "$($_.Exception.Message) (SMTP Site Links Section)" } } } else { Write-PScriboMessage -Message "No SMTP Site Links information found in $ForestInfo, Disabling this section." } } catch { Write-PScriboMessage -IsWarning -Message "$($_.Exception.Message) (SMTP)" } } } else { Write-PScriboMessage -Message "No SMTP Site Links information found in $ForestInfo, Disabling this section." } } catch { Write-PScriboMessage -IsWarning -Message "$($_.Exception.Message) (Site Subnets)" } try { $OutObj = [System.Collections.Generic.List[object]]::new() foreach ($Domain in $ADSystem.Domains | Where-Object { $_ -notin $Options.Exclude.Domains }) { $DomainInfo = Invoke-CommandWithTimeout -Session $TempPssSession -ScriptBlock { Get-ADDomain $using:Domain -ErrorAction Stop } foreach ($DC in ($DomainInfo.ReplicaDirectoryServers | Where-Object { $_ -notin $Options.Exclude.DCs })) { if (Get-DCWinRMState -ComputerName $DC -DCStatus ([ref]$DCStatus)) { $DCCIMSession = Get-ValidCIMSession -ComputerName $DC -SessionName $DC -CIMTable ([ref]$CIMTable) if ($DCCIMSession) { $Replication = Get-CimInstance -CimSession $DCCIMSession -Namespace 'root/microsoftdfs' -Class 'dfsrreplicatedfolderinfo' -Filter "ReplicatedFolderName = 'SYSVOL Share'" -EA 0 -Verbose:$False | Select-Object State try { $inObj = [ordered] @{ $reportTranslate.GetAbrADSite.DCName = $DC.split('.', 2)[0] $reportTranslate.GetAbrADSite.ReplicationStatus = switch ($Replication.State) { 0 { $reportTranslate.GetAbrADSite.StatusUninitialized } 1 { $reportTranslate.GetAbrADSite.StatusInitialized } 2 { $reportTranslate.GetAbrADSite.StatusInitialSync } 3 { $reportTranslate.GetAbrADSite.StatusAutoRecovery } 4 { $reportTranslate.GetAbrADSite.StatusNormal } 5 { $reportTranslate.GetAbrADSite.StatusInErrorState } 6 { $reportTranslate.GetAbrADSite.StatusDisabled } 7 { $reportTranslate.GetAbrADSite.StatusUnknown } default { $reportTranslate.GetAbrADSite.StatusOffline } } $reportTranslate.GetAbrADSite.Domain = $Domain } $OutObj.Add([pscustomobject](ConvertTo-HashToYN $inObj)) } catch { Write-PScriboMessage -IsWarning -Message "Sysvol Replication Item Section: $($_.Exception.Message)" } if ($HealthCheck.Site.BestPractice) { $ReplicationStatusError = @( $reportTranslate.GetAbrADSite.StatusUninitialized, $reportTranslate.GetAbrADSite.StatusAutoRecovery, $reportTranslate.GetAbrADSite.StatusInErrorState, $reportTranslate.GetAbrADSite.StatusDisabled, $reportTranslate.GetAbrADSite.StatusUnknown ) $ReplicationStatusWarn = @( $reportTranslate.GetAbrADSite.StatusInitialized, $reportTranslate.GetAbrADSite.StatusInitialSync ) $OutObj | Where-Object { $_.$($reportTranslate.GetAbrADSite.ReplicationStatus) -eq $reportTranslate.GetAbrADSite.StatusNormal } | Set-Style -Style OK -Property $reportTranslate.GetAbrADSite.ReplicationStatus $OutObj | Where-Object { $_.$($reportTranslate.GetAbrADSite.ReplicationStatus) -in $ReplicationStatusError } | Set-Style -Style Critical -Property $reportTranslate.GetAbrADSite.ReplicationStatus $OutObj | Where-Object { $_.$($reportTranslate.GetAbrADSite.ReplicationStatus) -in $ReplicationStatusWarn } | Set-Style -Style Warning -Property $reportTranslate.GetAbrADSite.ReplicationStatus } } } else { try { Write-PScriboMessage -Message "Unable to collect infromation from $DC." $inObj = [ordered] @{ $reportTranslate.GetAbrADSite.DCName = $DC.split('.', 2)[0] $reportTranslate.GetAbrADSite.ReplicationStatus = $reportTranslate.GetAbrADSite.StatusUnknown $reportTranslate.GetAbrADSite.Domain = $Domain } $OutObj.Add([pscustomobject](ConvertTo-HashToYN $inObj)) } catch { Write-PScriboMessage -IsWarning -Message "$($_.Exception.Message) (DNS IP Configuration Item)" } } } } if ($OutObj) { Section -Style Heading4 $reportTranslate.GetAbrADSite.SysvolReplication { $TableParams = @{ Name = "$($reportTranslate.GetAbrADSite.SysvolReplication) - $($Domain.ToString().ToUpper())" List = $false ColumnWidths = 33, 33, 34 } if ($Report.ShowTableCaptions) { $TableParams['Caption'] = "- $($TableParams.Name)" } $OutObj | Sort-Object -Property $reportTranslate.GetAbrADSite.Domain | Table @TableParams if ($HealthCheck.Site.BestPractice -and (($OutObj | Where-Object { $_.$($reportTranslate.GetAbrADSite.ReplicationStatus) -in $ReplicationStatusError }))) { Paragraph $reportTranslate.GetAbrADSite.HealthCheck -Bold -Underline BlankLine Paragraph { Text $reportTranslate.GetAbrADSite.BestPractice -Bold Text $reportTranslate.GetAbrADSite.SysvolBP } BlankLine } } } else { Write-PScriboMessage -Message "No Sysvol Replication information found in $ForestInfo, Disabling this section." } } catch { Write-PScriboMessage -IsWarning -Message "Sysvol Replication Table Section: $($_.Exception.Message)" } } } else { Write-PScriboMessage -Message "No Sites information found in $ForestInfo, Disabling this section." } } catch { Write-PScriboMessage -IsWarning -Message "$($_.Exception.Message) (Domain Site Global)" } } end { Show-AbrDebugExecutionTime -End -TitleMessage 'AD Site' } } |