This script uses the DNS powershell cmdlets available since Windows 2012. It exports the DNS zones hosted on a Microsoft DNS servers. First, a csv file is created (csv file called _-_domain_info.csv) with the following zone details:
- NotifyServers
- SecondaryServers
- AllowedDcForNsRecordsAutoCreation
- DistinguishedName
- IsAutoCreated
- IsDsIntegrated
- IsPaused
- IsReadOnly
- IsReverseLookupZone
- IsShutdown
- ZoneName
- ZoneType
- DirectoryPartitionName
- DynamicUpdate
- IsPluginEnabled
- IsSigned
- IsWinsEnabled
- Notify
- ReplicationScope
- SecureSecondaries
- ZoneFile
- PSComputerName
After that each zone is exported to a csv file with the following properties :
- DistinguishedName
- HostName
- RecordClass
- RecordData
- RecordType
- Timestamp
- TimeToLive
- PSComputerName
The cmdlet Set-DnsServerResourceRecord can be used to restore records by parsing the csv files
$domains = "domain.local" , "sub.domain.local" $BkfFolderRootDom = "\\backup_server\share\backups\DNSbkp-" $retention = 7 $date = Get-Date -format "yyyy-MM-dd" $domain_info_output = "_-_domain_info.csv" $domains | % { $ADdomain = $_ $BkfFolderRoot = $BkfFolderRootDom + $ADdomain $BkfFolder = $BkfFolderRoot + "\" + $date if (-not(test-path $BkfFolderRoot)) { new-item $BkfFolderRoot -Type Directory | Out-Null } if (-not(test-path $BkfFolder)) { new-item $BkfFolder -Type Directory | Out-Null } Filter Select-FileAge { param($days) If ($_.creationtime -lt (Get-Date).AddDays($days * -1)) {$_} } get-Childitem $BkfFolder -Directory | Select-FileAge $retention |Remove-Item -Force -Recurse $zones = Get-DnsServerZone -ComputerName $ADdomain $zones | export-Csv "$BkfFolder\$CSVZoneExport" -Delimiter ";" -NoClobber -NoTypeInformation $zones | % { $DNSZone = $_.ZoneName $CSVZoneExport = $DNSZone+".csv" Get-DnsServerResourceRecord -ZoneName $dnszone -ComputerName $ADdomain | export-Csv "$BkfFolder\$domain_info_output" -Delimiter ";" -NoClobber -NoTypeInformation } }
Microsoft DNS zones backup