Ben Owen

Full time nerd. Professional eater of cake.

Decluttering DNS with PowerShell

My web server hosts a number of small sites - personal, family and friends. Today, I was setting up a secondary DNS name server - something I've been meaning to do for a while - on my new storage box (which I provisioned following my recent no-backup experience!), when I noticed that several domains that I was migrating did not actually resolve to my server anymore.

I put together a short PowerShell script to pull together the domain names and IP addresses of all the domains in my DNS:

$zones = (Get-DnsServerZone | where { $_.ZoneName -notlike "*arpa*" -and $_.ZoneName -ne "TrustAnchors" })
$zones | ForEach-Object {
    echo $_.ZoneName;
    Try {
        [System.Net.Dns]::GetHostAddresses($_.ZoneName) | foreach { echo $_.IPAddressToString }
    } Catch {
        echo "DNS lookup failed.";

I've never really used PowerShell before today (other than for deprovisioning Candy Crush from Windows 10 Professional), so I'm sure there is probably a more elegant way to do it!

For those who are in the same boat, the script breaks down as follows:

  1. Get all the zones from the DNS server, filtering out the reverse zones (e.g. and the "TrustAnchors" entry.
  2. For each remaining zone, output it's name. Try to look up the zone name in DNS - if successful, print out all the associated IP addresses. If not successful, just log a failure message and move on.

This left me with a list of all the DNS zones I was hosting, and the IP addresses that they currently mapped to. It turned out that four domains had been moved to other servers, so I was able to delete them.