Powershell 调整多个DNS PTR区域
目标:我们需要更改1055个区域的PTR记录。我们需要更改每个记录的主机名。超过10000条参赛作品 我们目前被迫与DNSCMD合作,因为我们仍然是2008 R2域 为了使讨论保持简单,我将只使用一个包含1台服务器的区域 以这个服务器为例:Thor.domain.com,IP为10.128.10.5。如果使用此命令导出此区域:Powershell 调整多个DNS PTR区域,powershell,pointers,dns,Powershell,Pointers,Dns,目标:我们需要更改1055个区域的PTR记录。我们需要更改每个记录的主机名。超过10000条参赛作品 我们目前被迫与DNSCMD合作,因为我们仍然是2008 R2域 为了使讨论保持简单,我将只使用一个包含1台服务器的区域 以这个服务器为例:Thor.domain.com,IP为10.128.10.5。如果使用此命令导出此区域: dnscmd/enumzones>AllZones.txt 对于(AllZones.txt)中的/f%a,请执行dnscmd/ZoneExport%a导出\%a.txt`
dnscmd/enumzones>AllZones.txt
对于(AllZones.txt)中的/f%a,请执行dnscmd/ZoneExport%a导出\%a.txt`
它会生成一个包含以下内容的文本文件:
; Database file (null) for 10.128.10.in-addr.arpa zone.
; Zone version: 21
@ IN SOA DomainControler.testdomain.com. hostmaster.testdomain.com. (
21 ; serial number
900 ; refresh
600 ; retry
86400 ; expire
3600 ) ; default TTL
; Zone NS records
@ NS DomainControler.testdomain.com.
; Zone records
5 PTR Thor.domain.com.
5 Thor.domain.com.
10.128.10.in-addr.arpa 5 Thor.domain.com
它的作用是:
for/f“tokens=1-4 delims=;”(PTRs2Add.txt)中的%%a(
dnscmd domaincontroller/RecordAdd%%a%%b%%c%%d>>addPTR.log
)
这个特殊的命令需要我将所有结果文件合并成一个大文件。我相信我可以找到更好的方法来解析我处理过的每个区域文件
当然,如果我遇到了一个严重错误的兔子洞,我愿意听取关于如何更改1055个不同区域中10000条PTR记录的主机名条目的其他建议。混合批处理和PowerShell以及导出/导入文件对于AFAICS来说应该是不必要的。将
dnscmd
输出写入输出流(vulgo STDOUT),并使用正则表达式提取相关信息:
& dnscmd /EnumZones | Where-Object {
$_ -match '^ (\S+\.in-addr\.arpa)'
} | ForEach-Object {
$zone = $matches[1]
& dnscmd /ZonePrint $zone | Where-Object {
$_ -match '(\S+)\s+(?:\d+)\s+(?:PTR)\s+(\S+)'
} | ForEach-Object {
$data = $matches[1]
$name = $matches[2]
$newname = $name.Replace('.example.org.', '.example.com.')
& dnscmd /RecordDelete $zone $name PTR $data /f
& dnscmd /RecordAdd $zone $newname PTR $data /f
}
}
正如您已经怀疑的,它包括删除和重新创建
如果您需要更多地控制应处理哪些区域,您可能需要根据区域信息构建对象,并在该区域和枚举区域记录之间放置另一个Where Object
过滤器:
& dnscmd /EnumZones | Where-Object {
$_ -match '^ (\S+\.in-addr\.arpa)\s+(\S+)\s+(\S+)\s+(\S*)'
} | ForEach-Object {
New-Object -Type PSObject -Property ([ordered]@{
Name = $matches[1]
Type = $matches[2]
Storage = $matches[3]
Properties = $matches[4]
})
} | Where-Object {
# filter zones (optional), e.g.:
$_.Type -eq 'primary'
} | ForEach-Object {
$zone = $_.Name
& dnscmd /ZonePrint $zone | Where-Object {
$_ -match '(\S+)\s+(?:\d+)\s+(?:PTR)\s+(\S+)'
} | ForEach-Object {
$data = $matches[1]
$name = $matches[2]
$newname = $name.Replace('.example.org.', '.example.com.')
& dnscmd /RecordDelete $zone $name PTR $data /f
& dnscmd /RecordAdd $zone $newname PTR $data /f
}
}
所以你想和PTR通话。。。删除PTR和空格,并在导出中的每个文件的该行前面加上文件名?该PTR行始终是最后一行吗?当然,如果我犯了一个可怕的错误,我愿意就如何更改1055个不同区域中10000条PTR记录的主机名条目提出其他建议:)-构建2012 R2虚拟机,导出/导入,使用powershell,导出/导入回您的域?:-|我不清楚你到底想要实现什么,因为你似乎没有改变任何记录。是否要将PTR区域移动到其他服务器/域?改变地址?主机名?域?@Matt,正确,我想将文件名预先挂起到每行的文件中,以完成脚本在导入时使用的数据。