Wenn man mit einem Webserver zu einem anderen Provider wechselt oder aus sonstigen Gründen neue (öffentliche) IP Adressen zugewiesen bekommt, dann müssen natürlich auch die entsprechenden DNS-Einträge geändert werden. Wenn es sich hierbei nur um eine Hand voll handelt, könnte man dies auch manuell machen. Ab einer gewissen Menge ist das einfach nicht mehr praktikabel, da es a) zu lange dauert und b) auch sehr fehleranfällig wäre.
Als sinnvolle Lösung bietet sich hier die PowerShell an – vorausgesetzt, man hat einen Microsoft Windows Server als DNS-Server und auf diesem das entsprechende DNSServer Modul für die PowerShell verfügbar.
Das Skript, welches am Ende des Beitrages zum Download angeboten wird, sieht so aus:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 | <# .Synopsis This script changes DNS A Records according to a CSV file - use at your own risk! .DESCRIPTION This script changes DNS A Records according to a CSV file. The csv file should look like this: "OldIP","NewIP" "1.2.3.4","5.6.7.8" "2.4.6.8","1.3.5.7" to change all DNS records with "1.2.3.4" as value for "5.6.7.8" and "2.4.6.8" for "1.3.5.7" .EXAMPLE Replace-DNSServerRecords.ps1 -CSVFile H:\OldAndNewIps.txt Replaces the DNS A records on the localhost DNS server according to the CSV-File H:\OldAndNewIps.txt .EXAMPLE Replace-DNSServerRecords.ps1 -CSVFile H:\OldAndNewIps.txt -DNSServer mydns.domain.local -Verbose Replaces the DNS A records on the DNS server "mydns.domain.local" according to the CSV-File H:\OldAndNewIps.txt and writes verbose output #> Param( [Parameter(Mandatory=$True)] [ValidateScript({Test-Path $_ -PathType 'Leaf'})] [string]$CSVFile, [string]$DNSServer = "localhost" ) Write-Warning "This script will possibly change a lot of DNS records. If you wish to cancel, press [CTRL]+[C], otherwise press [Enter]!" Read-Host # just in case of old PowerShell Import-Module DNSServer $CSVData = Import-CSV $CSVFile $OldDNSRecordData = $CSVData.OldIP $NewDNSRecordData = $CSVData.NewIP $AllDNSZones = (Get-DnsServerZone -ComputerName $DNSServer | Where-Object IsReverseLookupZone -eq $False).ZoneName $TotalChanges = 0 ForEach($CurrentDNSZone in $AllDNSZones) { Write-Verbose "Processing current zone $CurrentDNSZone..." $AllDNSARecordsInZone = Get-DnsServerResourceRecord -ZoneName $CurrentDNSZone -RRType A -ComputerName $DNSServer Write-Verbose "Found $(($AllDNSARecordsInZone | Measure-Object).Count) DNS Records in current Zone" ForEach ($CurrentRecord in $AllDNSARecordsInZone) { for($i=0; $i -lt $OldDNSRecordData.Length; $i++){ If($CurrentRecord.RecordData.IPv4Address -eq $OldDNSRecordData[$i]) { Write-Verbose "Found an old DNS Record:" Write-Verbose "$($CurrentRecord.HostName) with $($CurrentRecord.RecordData.IPv4Address) in Zone $CurrentDNSZone" $NewRecord = $CurrentRecord.Clone() $NewRecord.RecordData.IPv4Address = $NewDNSRecordData[$i] Set-DnsServerResourceRecord -OldInputObject $CurrentRecord ` -NewInputObject $NewRecord ` -ZoneName $CurrentDNSZone ` -ComputerName $DNSServer $TotalChanges++ } } } } Write-Host "Changed Records: $TotalChanges" |
Das Skript durchläuft alle Forward-DNS-Zonen und prüft dabei nacheinander alle vorhandene A-Records gegen die Liste der zu ändernden Einträge. Wenn ein entsprechender Eintrag gefunden wird, wird für diesen die IP-Adresse gegen die neue ausgetauscht. Am Ende gibt das Skript aus, wieviele Einträge insgesamt geändert wurden. Aus Sicherheitsgründen ist nach dem Start noch einmal zu bestätigen, dass das Skript seine Arbeit verrichten soll.
Das fertige Skript kann hier heruntergeladen werden:
Die Benutzung geschieht auf eigene Gefahr!