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.

1 Answer 1

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
}
4
  • 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
    Commented Oct 6, 2012 at 20:52
  • 1
    Use /enumrecords to enumerate the records of the zone. See updated answer. Commented Oct 6, 2012 at 21:29
  • Thanks! I added my full solution to yours and an explanation is available on my site: penguindreams.org/blog/…
    – djsumdog
    Commented Oct 8, 2012 at 1: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). Commented Oct 8, 2012 at 8:47

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .