Dargslan.WinDNSServer.psm1
|
<# .SYNOPSIS Windows DNS Server management toolkit — zone inventory, record audit, forwarder configuration, DNS analytics, and zone health monitoring .DESCRIPTION Part of the Dargslan Windows Admin Toolkit collection. More tools and resources at https://dargslan.com Free Cheat Sheets: https://dargslan.com/cheat-sheets .LINK https://dargslan.com .LINK https://github.com/Dargslan/powershell-admin-scripts #> function Get-DNSServerReport { <# .SYNOPSIS Audit DNS Server zones and configuration .DESCRIPTION Lists DNS zones, record counts, forwarders, and server configuration for health assessment. Part of Dargslan.WinDNSServer — https://dargslan.com #> [CmdletBinding()] param([switch]$Json) $zones = Get-DnsServerZone -ErrorAction SilentlyContinue if (-not $zones) { Write-Warning "DNS Server not installed or no zones configured"; return } $report = [ordered]@{ ServerConfig = [PSCustomObject]@{ Forwarders = (Get-DnsServerForwarder -ErrorAction SilentlyContinue).IPAddress -join ", " RootHints = (Get-DnsServerRootHint -ErrorAction SilentlyContinue | Measure-Object).Count Recursion = (Get-DnsServerRecursion -ErrorAction SilentlyContinue).Enable ListeningIPs = (Get-DnsServerSetting -ErrorAction SilentlyContinue).ListeningIPAddress -join ", " } Zones = $zones | ForEach-Object { $records = Get-DnsServerResourceRecord -ZoneName $_.ZoneName -ErrorAction SilentlyContinue [PSCustomObject]@{ ZoneName = $_.ZoneName; ZoneType = $_.ZoneType; IsAutoCreated = $_.IsAutoCreated IsDsIntegrated = $_.IsDsIntegrated; IsReverseLookupZone = $_.IsReverseLookupZone RecordCount = ($records | Measure-Object).Count ARecords = ($records | Where-Object RecordType -eq "A" | Measure-Object).Count CNAMEs = ($records | Where-Object RecordType -eq "CNAME" | Measure-Object).Count MXRecords = ($records | Where-Object RecordType -eq "MX" | Measure-Object).Count } } Statistics = Get-DnsServerStatistics -ErrorAction SilentlyContinue | Select-Object -ExpandProperty QueryStatistics -ErrorAction SilentlyContinue Summary = [PSCustomObject]@{ TotalZones = ($zones | Measure-Object).Count; PrimaryZones = ($zones | Where-Object ZoneType -eq "Primary" | Measure-Object).Count; ForwardZones = ($zones | Where-Object { -not $_.IsReverseLookupZone } | Measure-Object).Count } } if ($Json) { return $report | ConvertTo-Json -Depth 3 } Write-Host "`n [DNS Server Report]" -ForegroundColor Cyan $report.Summary | Format-List $report.Zones | Where-Object { -not $_.IsAutoCreated } | Format-Table ZoneName, ZoneType, RecordCount, ARecords, IsDsIntegrated -AutoSize $report.ServerConfig | Format-List return $report } Export-ModuleMember -Function * |