Public/Infrastructure/Get-ADSiteInfo.ps1

function Get-ADSiteInfo {
    [CmdletBinding()]
    param()
    
    try {
        Write-Log "Retrieving AD site information..." -Level Info
        
        # Get all sites
        $sites = Get-ADReplicationSite -Filter * -ErrorAction SilentlyContinue | 
        ForEach-Object {
            $site = $_
            
            # Get subnets for this site
            $subnets = Get-ADReplicationSubnet -Filter "site -eq '$($site.DistinguishedName)'" | 
            ForEach-Object {
                [PSCustomObject]@{
                    Name        = $_.Name
                    Location    = $_.Location
                    Description = $_.Description
                }
            }
            
            # Get site links
            $siteLinks = Get-ADReplicationSiteLink -Filter *
            # $siteLinks = Get-ADReplicationSiteLink -Filter * |
            # Where-Object { $_.Sites -contains $site.DistinguishedName } |
            # ForEach-Object {
            # [PSCustomObject]@{
            # Name = $_.Name
            # Cost = $_.Cost
            # ReplicationFrequencyInMinutes = $_.ReplicationFrequencyInMinutes
            # Schedule = $_.ReplicationSchedule
            # Sites = $_.Sites | ForEach-Object {
            # (Get-ADObject $_ -Properties Name).Name
            # }
            # Options = $_.Options
            # }
            # }
            
            # Get replication connections
            $replConnections = Get-ADReplicationConnection
            # $replConnections = Get-ADReplicationConnection -Filter "FromServer -like '*$($site.Name)*' -or ToServer -like '*$($site.Name)*'" |
            # ForEach-Object {
            # [PSCustomObject]@{
            # FromServer = $_.FromServer
            # ToServer = $_.ToServer
            # Schedule = $_.Schedule
            # Options = $_.Options
            # }
            # }

            # Create the site object with all information
            [PSCustomObject]@{
                Name                   = $site.Name
                Description            = $site.Description
                Location               = $site.Location
                Created                = $site.Created
                Modified               = $site.Modified
                Subnets                = $subnets
                SiteLinks              = $siteLinks
                ReplicationConnections = $replConnections
                DistinguishedName      = $site.DistinguishedName
            }
        }

        # Create a summary object that includes overall topology information
        $siteTopology = [PSCustomObject]@{
            Sites                = $sites
            TotalSites           = ($sites | Measure-Object).Count
            TotalSubnets         = ($sites.Subnets | Measure-Object).Count
            TotalSiteLinks       = ($sites.SiteLinks | Sort-Object -Property Name -Unique | Measure-Object).Count
            TotalReplConnections = ($sites.ReplicationConnections | Measure-Object).Count
        }

        return $siteTopology
    }
    catch {
        Write-Log "Error retrieving site information: $($_.Exception.Message)" -Level Error
        return $null
    }
}