4

We've been moving data centers and I have a lot of old records that were not correctly but in DNS as CNAME records, but A records that have a direct IP (e.g. 192.168.100.n) and they're all moving to a new subnet (10.19.100.n).

I just need to write a powershell script to change all those records. I found this site:

http://www.indented.co.uk/index.php/2008/12/30/administering-microsoft-dns-in-powershell/

and from it I made this simple script:

$dnsServer = "meldc2"

$scope = New-Object Management.ManagementScope("\\$dnsServer\root\MicrosoftDNS")
$path = New-Object Management.ManagementPath("MicrosoftDNS_Zone")
$options = New-Object Management.ObjectGetOptions($Null,[System.TimeSpan]::MaxValue, $True)
$ZoneClass= New-Object Management.ManagementClass($scope,$path,$options)
$Zones = Get-WMIObject -Computer $dnsServer -Namespace "root\MicrosoftDNS" -Class "MicrosoftDNS_Zone"
$Zones | Get-Member
foreach($Z in $Zones) {
  $Z | Select-Object Name,DsIntegrated,ZoneType,Reverse,Data
}

but that only gets me a listing of root zones. I don't understand how to iterate over all the entries in each of the zones. Also, all the examples I've seen involve adding new zones, but there aren't any examples I can find on modifying existing A records.

Lorin Hochstein
  • 5,028
  • 15
  • 56
  • 72
djsumdog
  • 1,100
  • 2
  • 16
  • 29

1 Answers1

4

I would use dnscmd for modifying DNS records:

dnscmd meldc2.example.com /recorddelete example.com A host.example.com
dnscmd meldc2.example.com /recordadd example.com host A 10.19.100.n

This can be wrapped in a loop in either batch or PowerShell, e.g. like this:

$domain = "example.com"
dnscmd /enumrecords $domain `@ /type A | % {
  $name = $_.split(" ")[0]
  $ip = $_.split("`t")[-1] -replace "192.168.100", "10.19.100"
  dnscmd /recorddelete $domain A "$name.$domain"
  dnscmd /recordadd $domain $name A $ip
}
Ansgar Wiechers
  • 4,247
  • 2
  • 18
  • 26
  • I really need to iterate over the individual entries in each zone since each zone has a lot of subdomains. I need to specifically check to see if the IP matches the IP I need to chance and flip that particular entry. – djsumdog Oct 06 '12 at 20:52
  • 1
    Use `/enumrecords` to enumerate the records of the zone. See updated answer. – Ansgar Wiechers Oct 06 '12 at 21:29
  • Thanks! I added my full solution to yours and an explanation is available on my site: http://penguindreams.org/blog/reassigning-dns-entires-in-windowsactive-directory-using-powershell/ – djsumdog Oct 08 '12 at 01:34
  • 1
    One suggestion concerning your address check: rather than doing a boatload of `$ip.Contains()` in the `if` condition I'd create an array `$ip_list = @("192.168.0.14", "192.168.0.80", ...)` and change the condition to `if ($ip_list -contains $ip)`. – Ansgar Wiechers Oct 08 '12 at 08:47