DNS Forwarders Fours Ways

I'm lucky enough to occasionally eat in nice restaurants. A lot of the time, the menu makes for interesting (and pretentious) reading. One may see things along the lines of:

  • Deconstructed green forest gateaux
  • Condensed cauliflower cheese cake
  • Themes of cucumber on a medley of mangoes
  • Wafts of autumn mushroom mist
  • Everything-tastes-like-chicken three ways

 

And, so taking inspiration from one of my favourite, occasional pass times, I serve you "DNS Forwarders Four Ways". Enjoy.

 

#1 - DNSCMD.exe

 
###################
#DNSCMD.exe method
###################

$Servers = "HALODC01","HALODC02" 

$TotalForwarders = @()

foreach ($Server in $Servers) {
 
    $Hostnames = @()
    $Forwarders = @()

    $DnsInfo = dnscmd.exe $server /info 

    if ($DnsInfo -notcontains "Info query failed") {
    
        $ForwardersLine = ($DnsInfo | Select-String -CaseSensitive "Forwarders").LineNumber

        $AddressCount = $ForwardersLine + 3

        $AddressCount = $DnsInfo[$AddressCount] -Split "="

        $AddressCount = $AddressCount[1].Trim()

        $ForwardersLine = $ForwardersLine + 4

        for ($i = 0; $i -lt $AddressCount; $i++) {

            $ForwardersSplit = $DnsInfo[$ForwardersLine + $i] -split "="

            $ForwardersIp = $ForwardersSplit[-1] 

            $Hostname = (Get-ADDomainController -Filter {ipv4address -eq $ForwardersIp}).Name

            $Forwarders += $ForwardersIp

            $Hostnames += $Hostname

        }

        $Properties = [pscustomobject]@{

            Server = $Server
            Hostnames = $Hostnames
            Forwarders = $Forwarders

        }

        $TotalForwarders += $Properties

    }
    else {

        Write-Output "Info query failed for $Server"

    }

}

 

#2 - Get-WMiObject

 
######################
#GET-WMIOBJECT method
######################

$Servers = "HALODC01","HALODC02" 

$TotalForwarders = @()

foreach ($Server in $Servers) {
 
    $Hostnames = @()
    $Forwarders = @()

    $DnsInfo = (Get-WmiObject -Class microsoftdns_server -Namespace root/microsoftdns -ComputerName $Server).Forwarders

    if ($DnsInfo) {
    
        foreach ($ForwarderIp in $DnsInfo) {


            $Hostname = (Get-ADDomainController -Filter {ipv4address -eq $ForwarderIp}).Name

            $Forwarders += $ForwarderIp

            $Hostnames += $Hostname

        }

        $Properties = [pscustomobject]@{

            Server = $Server
            Hostnames = $Hostnames
            Forwarders = $Forwarders

        }

        $TotalForwarders += $Properties

    }
    else {

        Write-Output "Info query failed for $Server"

    }

}

$TotalForwarders 

 

#3 - Get-CimInstance

 
########################
#GET-CIMINSTANCE method
########################

$Servers = "HALODC01","HALODC02" 

$TotalForwarders = @()

foreach ($Server in $Servers) {
 
    $Hostnames = @()
    $Forwarders = @()

    $DnsInfo = (Get-CimInstance -ClassName microsoftdns_server -Namespace root/microsoftdns -ComputerName $Server).Forwarders

    if ($DnsInfo) {
    
        foreach ($ForwarderIp in $DnsInfo) {


            $Hostname = (Get-ADDomainController -Filter {ipv4address -eq $ForwarderIp}).Name

            $Forwarders += $ForwarderIp

            $Hostnames += $Hostname

        }

        $Properties = [pscustomobject]@{

            Server = $Server
            Hostnames = $Hostnames
            Forwarders = $Forwarders

        }

        $TotalForwarders += $Properties

    }
    else {

        Write-Output "Info query failed for $Server"

    }

}

$TotalForwarders

 

#4 - Get-DnsServerForwarder

 
###############################
#GET-DNSSERVERFORWARDER method
###############################

$Servers = "HALODC01","HALODC02" 

$TotalForwarders = @()

foreach ($Server in $Servers) {
 
    $Hostnames = @()
    $Forwarders = @()

    $DnsInfo = (Get-DnsServerForwarder -ComputerName $Server).IPAddress

    if ($DnsInfo) {
    
        foreach ($ForwarderIp in $DnsInfo) {


            $Hostname = (Get-ADDomainController -Filter {ipv4address -eq $ForwarderIp}).Name

            $Forwarders += $ForwarderIp

            $Hostnames += $Hostname

        }

        $Properties = [pscustomobject]@{

            Server = $Server
            Hostnames = $Hostnames
            Forwarders = $Forwarders

        }

        $TotalForwarders += $Properties

    }
    else {

        Write-Output "Info query failed for $Server"

    }

}

$TotalForwarders