Src/Private/Report/Get-AbrAzNetworkWatcher.ps1

function Get-AbrAzNetworkWatcher {
    <#
    .SYNOPSIS
        Used by As Built Report to retrieve Azure Network Watcher and Flow Log information
    .DESCRIPTION
        Documents the configuration of Azure Network Watchers and their associated NSG Flow Logs,
        including retention policy, traffic analytics, and storage account settings.
    .NOTES
        Version: 0.1.0
        Author: Tim Carman
        Twitter: @tpcarman
        Github: tpcarman
    .EXAMPLE
 
    .LINK
 
    #>

    [CmdletBinding()]
    param ()

    begin {
        $LocalizedData = $reportTranslate.GetAbrAzNetworkWatcher
        Write-PScriboMessage ($LocalizedData.InfoLevel -f $InfoLevel.NetworkWatcher)
    }

    process {
        try {
            if ($InfoLevel.NetworkWatcher -ge 1) {
                $AzNetworkWatchers = Get-AzNetworkWatcher -ErrorAction SilentlyContinue | Sort-Object Name
                if ($AzNetworkWatchers) {
                    Write-PScriboMessage $LocalizedData.Collecting

                    # Pre-collect flow logs per watcher for use at both InfoLevels
                    $FlowLogsMap = @{}
                    foreach ($AzWatcher in $AzNetworkWatchers) {
                        $FlowLogsMap[$AzWatcher.Name] = Get-AzNetworkWatcherFlowLog -NetworkWatcher $AzWatcher -ErrorAction SilentlyContinue
                    }

                    Section -Style Heading4 $LocalizedData.Heading {
                        if ($Options.ShowSectionInfo) {
                            Paragraph $LocalizedData.SectionInfo
                            BlankLine
                        }

                        $AzWatcherInfo = @()
                        foreach ($AzWatcher in $AzNetworkWatchers) {
                            $FlowLogCount = if ($FlowLogsMap[$AzWatcher.Name]) { @($FlowLogsMap[$AzWatcher.Name]).Count } else { 0 }
                            $InObj = [Ordered]@{
                                $LocalizedData.Name              = $AzWatcher.Name
                                $LocalizedData.ResourceGroup     = $AzWatcher.ResourceGroupName
                                $LocalizedData.Location          = $AzLocationLookup."$($AzWatcher.Location)"
                                $LocalizedData.Subscription      = "$($AzSubscriptionLookup.(($AzWatcher.Id).split('/')[2]))"
                                $LocalizedData.SubscriptionID    = ($AzWatcher.Id).split('/')[2]
                                $LocalizedData.FlowLogs          = $FlowLogCount
                                $LocalizedData.ProvisioningState = $AzWatcher.ProvisioningState
                            }

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

                            $AzWatcherInfo += [PSCustomObject]$InObj
                        }

                        if ($Healthcheck.NetworkWatcher.ProvisioningState) {
                            $AzWatcherInfo | Where-Object { $_.$($LocalizedData.ProvisioningState) -ne 'Succeeded' } | Set-Style -Style Critical -Property $LocalizedData.ProvisioningState
                        }

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

                                    $FlowLogs = $FlowLogsMap[$WatcherName]
                                    if ($FlowLogs) {
                                        Section -Style NOTOCHeading6 -ExcludeFromTOC $LocalizedData.FlowLogsHeading {
                                            $FlowLogInfo = @()
                                            foreach ($FlowLog in $FlowLogs) {
                                                $TargetResource = if ($FlowLog.TargetResourceId) {
                                                    ($FlowLog.TargetResourceId).split('/')[-1]
                                                } else {
                                                    $LocalizedData.None
                                                }
                                                $StorageAccount = if ($FlowLog.StorageId) {
                                                    ($FlowLog.StorageId).split('/')[-1]
                                                } else {
                                                    $LocalizedData.None
                                                }
                                                $RetentionDays = if ($FlowLog.RetentionPolicy.Enabled) {
                                                    $FlowLog.RetentionPolicy.Days
                                                } else {
                                                    $LocalizedData.Unlimited
                                                }
                                                $TrafficAnalytics = if ($FlowLog.FlowAnalyticsConfiguration.NetworkWatcherFlowAnalyticsConfiguration.Enabled) {
                                                    $LocalizedData.Enabled
                                                } else {
                                                    $LocalizedData.Disabled
                                                }
                                                $InObj = [Ordered]@{
                                                    $LocalizedData.FlowLogName       = $FlowLog.Name
                                                    $LocalizedData.TargetResource    = $TargetResource
                                                    $LocalizedData.FlowLogEnabled    = $FlowLog.Enabled
                                                    $LocalizedData.RetentionDays     = $RetentionDays
                                                    $LocalizedData.TrafficAnalytics  = $TrafficAnalytics
                                                    $LocalizedData.StorageAccount    = $StorageAccount
                                                    $LocalizedData.ProvisioningState = $FlowLog.ProvisioningState
                                                }
                                                $FlowLogInfo += [PSCustomObject]$InObj
                                            }

                                            if ($Healthcheck.NetworkWatcher.FlowLogEnabled) {
                                                $FlowLogInfo | Where-Object { -not $_.$($LocalizedData.FlowLogEnabled) } | Set-Style -Style Warning -Property $LocalizedData.FlowLogEnabled
                                            }

                                            $TableParams = @{
                                                Name         = "$($LocalizedData.FlowLogsHeading) - $WatcherName"
                                                List         = $false
                                                ColumnWidths = 20, 20, 10, 10, 15, 15, 10
                                            }
                                            if ($Report.ShowTableCaptions) {
                                                $TableParams['Caption'] = "- $($TableParams.Name)"
                                            }
                                            $FlowLogInfo | Table @TableParams
                                        }
                                    }
                                }
                            }
                        } else {
                            Paragraph ($LocalizedData.ParagraphSummary -f $AzSubscription.Name)
                            BlankLine
                            $TableParams = @{
                                Name         = "$($LocalizedData.TableHeading) - $($AzSubscription.Name)"
                                List         = $false
                                Columns      = $LocalizedData.Name, $LocalizedData.Location, $LocalizedData.FlowLogs, $LocalizedData.ProvisioningState
                                ColumnWidths = 30, 25, 20, 25
                            }
                            if ($Report.ShowTableCaptions) {
                                $TableParams['Caption'] = "- $($TableParams.Name)"
                            }
                            $AzWatcherInfo | Table @TableParams
                        }
                    }
                }
            }
        } catch {
            Write-PScriboMessage -IsWarning "$($LocalizedData.ErrorMessage) $($_.Exception.Message)"
        }
    }

    end {}
}