Src/Private/Report/Get-AbrAzPrivateDnsZone.ps1

function Get-AbrAzPrivateDnsZone {
    <#
    .SYNOPSIS
        Used by As Built Report to retrieve Azure Private DNS Zone information
    .DESCRIPTION
        Documents the configuration of Azure Private DNS Zones including record set counts,
        virtual network links, and provisioning state.
    .NOTES
        Version: 0.1.0
        Author: Tim Carman
        Twitter: @tpcarman
        Github: tpcarman
    .EXAMPLE
 
    .LINK
 
    #>

    [CmdletBinding()]
    param ()

    begin {
        $LocalizedData = $reportTranslate.GetAbrAzPrivateDnsZone
        Write-PScriboMessage ($LocalizedData.InfoLevel -f $InfoLevel.PrivateDnsZone)
    }

    process {
        try {
            if ($InfoLevel.PrivateDnsZone -ge 1) {
                $AzPrivateDnsZones = Get-AzResource -ResourceType 'Microsoft.Network/privateDnsZones' -ExpandProperties -ErrorAction SilentlyContinue | Sort-Object Name
                if ($AzPrivateDnsZones) {
                    Write-PScriboMessage $LocalizedData.Collecting
                    Section -Style Heading4 $LocalizedData.Heading {
                        if ($Options.ShowSectionInfo) {
                            Paragraph $LocalizedData.SectionInfo
                            BlankLine
                        }

                        # Pre-collect VNet links per zone for InfoLevel 2 detail.
                        # Key is "ResourceGroup/ZoneName" to handle the same zone name in multiple resource groups.
                        $VNetLinksMap = @{}
                        if ($InfoLevel.PrivateDnsZone -ge 2) {
                            foreach ($AzPrivateDnsZone in $AzPrivateDnsZones) {
                                $VNetLinksMap["$($AzPrivateDnsZone.ResourceGroupName)/$($AzPrivateDnsZone.Name)"] = Get-AzPrivateDnsVirtualNetworkLink -ResourceGroupName $AzPrivateDnsZone.ResourceGroupName -ZoneName $AzPrivateDnsZone.Name -ErrorAction SilentlyContinue
                            }
                        }

                        $LockMap = @{}
                        $AllLocks = Get-AzResourceLock -ErrorAction SilentlyContinue
                        foreach ($Lock in $AllLocks) {
                            $Key = $Lock.ResourceId.ToLower()
                            if (-not $LockMap.ContainsKey($Key)) { $LockMap[$Key] = @() }
                            $LockMap[$Key] += $Lock
                        }

                        $AzPrivateDnsZoneInfo = @()
                        foreach ($AzPrivateDnsZone in $AzPrivateDnsZones) {
                            $InObj = [Ordered]@{
                                $LocalizedData.Name                      = $AzPrivateDnsZone.Name
                                $LocalizedData.ResourceGroup             = $AzPrivateDnsZone.ResourceGroupName
                                $LocalizedData.Location                  = if ($AzLocationLookup."$($AzPrivateDnsZone.Location)") { $AzLocationLookup."$($AzPrivateDnsZone.Location)" } else { $AzPrivateDnsZone.Location }
                                $LocalizedData.Subscription              = "$($AzSubscriptionLookup.(($AzPrivateDnsZone.ResourceId).split('/')[2]))"
                                $LocalizedData.SubscriptionID            = ($AzPrivateDnsZone.ResourceId).split('/')[2]
                                $LocalizedData.RecordSets                = $AzPrivateDnsZone.Properties.NumberOfRecordSets
                                $LocalizedData.MaxRecordSets             = $AzPrivateDnsZone.Properties.MaxNumberOfRecordSets
                                $LocalizedData.VirtualNetworkLinks       = $AzPrivateDnsZone.Properties.NumberOfVirtualNetworkLinks
                                $LocalizedData.VNetLinksWithRegistration = $AzPrivateDnsZone.Properties.NumberOfVirtualNetworkLinksWithRegistration
                                $LocalizedData.ProvisioningState         = $AzPrivateDnsZone.Properties.ProvisioningState
                            }

                            $InObj[$LocalizedData.Locks] = $(
                                $rl = $LockMap[$AzPrivateDnsZone.ResourceId.ToLower()]
                                if ($rl) { ($rl | ForEach-Object { "$($_.Name) ($($_.Properties.Level))" }) -join [Environment]::NewLine }
                                else { $LocalizedData.None }
                            )

                            if ($Options.ShowTags) {
                                $InObj[$LocalizedData.Tags] = if ($null -eq $AzPrivateDnsZone.Tags -or $AzPrivateDnsZone.Tags.Count -eq 0) {
                                    $LocalizedData.None
                                } else {
                                    ($AzPrivateDnsZone.Tags.Keys | ForEach-Object { "$_`:`t$($AzPrivateDnsZone.Tags[$_])" }) -join [Environment]::NewLine
                                }
                            }

                            $AzPrivateDnsZoneInfo += [PSCustomObject]$InObj
                        }

                        if ($Healthcheck.PrivateDnsZone.ProvisioningState) {
                            $AzPrivateDnsZoneInfo | Where-Object { $_.$($LocalizedData.ProvisioningState) -ne 'Succeeded' } | Set-Style -Style Critical -Property $LocalizedData.ProvisioningState
                        }
                        if ($Healthcheck.PrivateDnsZone.VirtualNetworkLinks) {
                            $AzPrivateDnsZoneInfo | Where-Object { [int]$_.$($LocalizedData.VirtualNetworkLinks) -eq 0 } | Set-Style -Style Warning -Property $LocalizedData.VirtualNetworkLinks
                        }

                        if ($InfoLevel.PrivateDnsZone -ge 2) {
                            Paragraph ($LocalizedData.ParagraphDetail -f $AzSubscription.Name)
                            foreach ($AzPrivateDnsZone in $AzPrivateDnsZoneInfo) {
                                Section -Style NOTOCHeading5 -ExcludeFromTOC "$($AzPrivateDnsZone.($LocalizedData.Name))" {
                                    $TableParams = @{
                                        Name         = "$($LocalizedData.TableHeading) - $($AzPrivateDnsZone.($LocalizedData.Name))"
                                        List         = $true
                                        ColumnWidths = 40, 60
                                    }
                                    if ($Report.ShowTableCaptions) {
                                        $TableParams['Caption'] = "- $($TableParams.Name)"
                                    }
                                    $AzPrivateDnsZone | Table @TableParams

                                    $AzZoneName = $AzPrivateDnsZone.($LocalizedData.Name)
                                    $AzZoneRg   = $AzPrivateDnsZone.($LocalizedData.ResourceGroup)
                                    $VNetLinks = $VNetLinksMap["$AzZoneRg/$AzZoneName"]
                                    if ($VNetLinks) {
                                        Section -Style NOTOCHeading6 -ExcludeFromTOC $LocalizedData.VirtualNetworkLinks {
                                            $VNetLinkInfo = @()
                                            foreach ($VNetLink in $VNetLinks) {
                                                $InObj = [Ordered]@{
                                                    $LocalizedData.LinkName                = $VNetLink.Name
                                                    $LocalizedData.VirtualNetwork          = ($VNetLink.VirtualNetworkId).split('/')[-1]
                                                    $LocalizedData.AutoRegistration        = $VNetLink.RegistrationEnabled
                                                    $LocalizedData.VirtualNetworkLinkState = $VNetLink.VirtualNetworkLinkState
                                                    $LocalizedData.ProvisioningState       = $VNetLink.ProvisioningState
                                                }
                                                $VNetLinkInfo += [PSCustomObject]$InObj
                                            }
                                            $TableParams = @{
                                                Name         = "$($LocalizedData.VirtualNetworkLinks) - $($AzZoneName)"
                                                List         = $false
                                                ColumnWidths = 30, 25, 15, 15, 15
                                            }
                                            if ($Report.ShowTableCaptions) {
                                                $TableParams['Caption'] = "- $($TableParams.Name)"
                                            }
                                            $VNetLinkInfo | Table @TableParams
                                        }
                                    }
                                }
                            }
                        } else {
                            Paragraph ($LocalizedData.ParagraphSummary -f $AzSubscription.Name)
                            BlankLine
                            $TableParams = @{
                                Name         = "$($LocalizedData.TableHeading) - $($AzSubscription.Name)"
                                List         = $false
                                Columns      = $LocalizedData.Name, $LocalizedData.ResourceGroup, $LocalizedData.Location, $LocalizedData.RecordSets, $LocalizedData.VirtualNetworkLinks, $LocalizedData.ProvisioningState
                                ColumnWidths = 25, 20, 15, 15, 10, 15
                            }
                            if ($Report.ShowTableCaptions) {
                                $TableParams['Caption'] = "- $($TableParams.Name)"
                            }
                            $AzPrivateDnsZoneInfo | Table @TableParams
                        }
                    }
                }
            }
        } catch {
            Write-PScriboMessage -IsWarning "$($LocalizedData.ErrorMessage) $($_.Exception.Message)"
        }
    }

    end {}
}