For those who do not need to set up the complete module with all different 30+ helpful instructions here is the code for this operate:
operate Get-WinDNSIPAddresses { <# .SYNOPSIS Will get all of the DNS data from all of the zones inside a forest sorted by IPAddress .DESCRIPTION Will get all of the DNS data from all of the zones inside a forest sorted by IPAddress .PARAMETER IncludeZone Restrict the output of DNS data to particular zones .PARAMETER ExcludeZone Restrict the output of dNS data to solely zones not within the exclude record .PARAMETER IncludeDetails Provides extra info resembling creation time, modified time .PARAMETER Prettify Converts arrays into strings related with comma .PARAMETER IncludeDNSRecords Embrace full DNS data simply in case one want to additional course of them .PARAMETER AsHashtable Outputs the outcomes as a hashtable as an alternative of an array .EXAMPLE Get-WinDNSIPAddresses | Format-Desk * .EXAMPLE Get-WinDNSIPAddresses -Prettify | Format-Desk * .EXAMPLE Get-WinDNSIPAddresses -Prettify -IncludeDetails -IncludeDNSRecords | Format-Desk * .NOTES Normal notes #> [cmdletbinding()] param( [string[]] $IncludeZone, [string[]] $ExcludeZone, [switch] $IncludeDetails, [switch] $Prettify, [switch] $IncludeDNSRecords, [switch] $AsHashtable ) $DNSRecordsCached = [ordered] @{} $DNSRecordsPerZone = [ordered] @{} $ADRecordsPerZone = [ordered] @{} attempt { $oRootDSE = Get-ADRootDSE -ErrorAction Cease } catch { Write-Warning -Message "Get-WinDNSIPAddresses - Couldn't get the foundation DSE. Be sure to're logged in to machine with Lively Listing RSAT instruments put in, and there is connecitivity to the area. Error: $($_.Exception.Message)" return } $ADServer = ($oRootDSE.dnsHostName) $Exclusions="DomainDnsZones", 'ForestDnsZones', '@' $DNS = Get-DnsServerZone -ComputerName $ADServer [Array] $ZonesToProcess = foreach ($Zone in $DNS) { if ($Zone.ZoneType -eq 'Major' -and $Zone.IsDsIntegrated -eq $true -and $Zone.IsReverseLookupZone -eq $false) { if ($Zone.ZoneName -notlike "*_*" -and $Zone.ZoneName -ne 'TrustAnchors') { if ($IncludeZone -and $IncludeZone -notcontains $Zone.ZoneName) { proceed } if ($ExcludeZone -and $ExcludeZone -contains $Zone.ZoneName) { proceed } $Zone } } } foreach ($Zone in $ZonesToProcess) { Write-Verbose -Message "Get-WinDNSIPAddresses - Processing zone for DNS data: $($Zone.ZoneName)" $DNSRecordsPerZone[$Zone.ZoneName] = Get-DnsServerResourceRecord -ComputerName $ADServer -ZoneName $Zone.ZoneName -RRType A } if ($IncludeDetails) { $Filter = { (Title -notlike "@" -and Title -notlike "_*" -and ObjectClass -eq 'dnsNode' -and Title -ne 'ForestDnsZone' -and Title -ne 'DomainDnsZone' ) } foreach ($Zone in $ZonesToProcess) { $ADRecordsPerZone[$Zone.ZoneName] = [ordered]@{} Write-Verbose -Message "Get-WinDNSIPAddresses - Processing zone for AD data: $($Zone.ZoneName)" $TempObjects = @( if ($Zone.ReplicationScope -eq 'Area') { attempt { Get-ADObject -Server $ADServer -Filter $Filter -SearchBase ("DC=$($Zone.ZoneName),CN=MicrosoftDNS,DC=DomainDnsZones," + $oRootDSE.defaultNamingContext) -Properties CanonicalName, whenChanged, whenCreated, DistinguishedName, ProtectedFromAccidentalDeletion, dNSTombstoned } catch { Write-Warning -Message "Get-WinDNSIPAddresses - Error getting AD data for DomainDnsZones zone: $($Zone.ZoneName). Error: $($_.Exception.Message)" } } elseif ($Zone.ReplicationScope -eq 'Forest') { attempt { Get-ADObject -Server $ADServer -Filter $Filter -SearchBase ("DC=$($Zone.ZoneName),CN=MicrosoftDNS,DC=ForestDnsZones," + $oRootDSE.defaultNamingContext) -Properties CanonicalName, whenChanged, whenCreated, DistinguishedName, ProtectedFromAccidentalDeletion, dNSTombstoned } catch { Write-Warning -Message "Get-WinDNSIPAddresses - Error getting AD data for ForestDnsZones zone: $($Zone.ZoneName). Error: $($_.Exception.Message)" } } else { Write-Warning -Message "Get-WinDNSIPAddresses - Unknown replication scope: $($Zone.ReplicationScope)" } ) foreach ($DNSObject in $TempObjects) { $ADRecordsPerZone[$Zone.ZoneName][$DNSObject.Name] = $DNSObject } } } foreach ($Zone in $DNSRecordsPerZone.PSBase.Keys) { foreach ($Report in $DNSRecordsPerZone[$Zone]) { if ($Report.HostName -in $Exclusions) { proceed } if (-not $DNSRecordsCached[$Record.RecordData.IPv4Address]) { $DNSRecordsCached[$Record.RecordData.IPv4Address] = [ordered] @{ IPAddress = $Report.RecordData.IPv4Address DnsNames = [System.Collections.Generic.List[Object]]::new() Timestamps = [System.Collections.Generic.List[Object]]::new() Varieties = [System.Collections.Generic.List[Object]]::new() Depend = 0 } if ($ADRecordsPerZone.Keys.Depend -gt 0) { $DNSRecordsCached[$Record.RecordData.IPv4Address].WhenCreated = $ADRecordsPerZone[$Zone][$Record.HostName].whenCreated $DNSRecordsCached[$Record.RecordData.IPv4Address].WhenChanged = $ADRecordsPerZone[$Zone][$Record.HostName].whenChanged } if ($IncludeDNSRecords) { $DNSRecordsCached[$Record.RecordData.IPv4Address].Listing = [System.Collections.Generic.List[Object]]::new() } } $DNSRecordsCached[$Record.RecordData.IPv4Address].DnsNames.Add($Report.HostName + "." + $Zone) if ($IncludeDNSRecords) { $DNSRecordsCached[$Record.RecordData.IPv4Address].Listing.Add($Report) } if ($null -ne $Report.TimeStamp) { $DNSRecordsCached[$Record.RecordData.IPv4Address].Timestamps.Add($Report.TimeStamp) } else { $DNSRecordsCached[$Record.RecordData.IPv4Address].Timestamps.Add("Not accessible") } if ($Null -ne $Report.Timestamp) { $DNSRecordsCached[$Record.RecordData.IPv4Address].Varieties.Add('Dynamic') } else { $DNSRecordsCached[$Record.RecordData.IPv4Address].Varieties.Add('Static') } $DNSRecordsCached[$Record.RecordData.IPv4Address] = [PSCustomObject] $DNSRecordsCached[$Record.RecordData.IPv4Address] } } foreach ($DNS in $DNSRecordsCached.PSBase.Keys) { $DNSRecordsCached[$DNS].Depend = $DNSRecordsCached[$DNS].DnsNames.Depend if ($Prettify) { $DNSRecordsCached[$DNS].DnsNames = $DNSRecordsCached[$DNS].DnsNames -join ", " $DNSRecordsCached[$DNS].Timestamps = $DNSRecordsCached[$DNS].Timestamps -join ", " $DNSRecordsCached[$DNS].Varieties = $DNSRecordsCached[$DNS].Varieties -join ", " } } if ($AsHashtable) { $DNSRecordsCached } else { $DNSRecordsCached.Values } }