前述
最近,木子公司将 Windows DNS 上的正向查找区域和域名转发器迁移到 CoreDNS。正向查找区域通过 CoreDNS 的 Hosts 插件实现,而域名转发器继续使用 Forward 插件。由于在 Windows DNS 上逐条手动删除原有的正向查找区域非常繁琐,为了简化这个过程并实现批量删除不需要的正向查找区域,木子特别编写了一个 PowerShell 脚本来自动执行此任务。
功能实现
要求:删除指定后缀的正向查找区域,这里以删除 *.rockylinux.cn
正向查找区域为例。
# 要操作的 DNS 服务器
$dnsServer = "192.168.11.1" # 更换为您的DNS服务器的名称或IP地址
# 获取所有正向查找区域
$zones = Get-DnsServerZone -ComputerName $dnsServer
# 筛选符合条件的区域(以 rockylinux.cn 结尾)
$zonesToDelete = $zones | Where-Object { $_.ZoneName -like "*.rockylinux.cn" }
# 打印筛选出的区域信息
Write-Host "以下是将被删除的区域:"
foreach ($zone in $zonesToDelete) {
Write-Host $zone.ZoneName
}
# 确认是否要继续删除
$confirmation = Read-Host "您确定要删除这些区域吗?输入 'Yes' 继续,否则输入 'No'"
if ($confirmation -eq 'Yes') {
foreach ($zone in $zonesToDelete) {
try {
# 删除区域
Remove-DnsServerZone -Name $zone.ZoneName -ComputerName $dnsServer -Force
Write-Host "成功删除区域: $($zone.ZoneName)"
} catch {
Write-Error "无法删除区域: $($zone.ZoneName)。错误信息: $_"
}
}
} else {
Write-Host "操作已取消"
}
PowerShell 运行输出确认格式如下:
以下是将被删除的区域:
a.rockylinux.cn
b.rockylinux.cn
c.rockylinux.cn
您确定要删除这些区域吗?输入 'Yes' 继续,否则输入 'No': Yes
成功删除区域: a.rockylinux.cn
成功删除区域: b.rockylinux.cn
成功删除区域: c.rockylinux.cn
注:此脚本能够列出待删除的正向查找区域域名列表。为避免误删除,脚本在执行删除操作前会提示用户输入 Yes
以确认删除。
上述的脚本对于批量删除指定的正向查找区域非常有效,但如果有大量的正向查找区域,逐个删除仍然显得繁琐。有没有一种方法可以只保留 DNS 服务器自带的相关正向查找区域,并删除其他所有正向查找区域呢?
您可以使用下面的脚本来实现这个功能。需要特别说明的是,比如说 DNS 服务器的域名为 rl.com
,这时在 DNS 正向查找区域会有两条记录:_msdcs.rl.com
和 rl.com
。因此,在排除不需要删除的区域时,应该使用通配符 *rl.com
。此外,dnsmgmt.exe
控制台中看不到的系统默认区域如 in-addr.arpa
、TrustAnchors
、RootHints
和 ip6.arpa
也需要全部排除。
请在执行全局批量删除时谨慎操作。在输出要删除的区域列表时,最好逐一确认后,再执行 Yes
进行删除操作。
# 要操作的 DNS 服务器
$dnsServer = "192.168.11.1" # 替换为您的DNS服务器的名称或IP地址
# 获取所有正向查找区域
$zones = Get-DnsServerZone -ComputerName $dnsServer
# 筛选需要删除的区域(除了以 *rl.com 结尾的区域)
$zonesToDelete = $zones | Where-Object { $_.ZoneName -notlike "*rl.com" -and $_.ZoneName -notlike "*.in-addr.arpa" -and $_.ZoneName -ne "TrustAnchors" -and $_.ZoneName -ne "RootHints" -and $_.ZoneName -ne "in-addr.arpa" -and $_.ZoneName -ne "ip6.arpa"}
# 打印筛选出的待删除区域信息
Write-Host "以下是将被删除的区域:"
foreach ($zone in $zonesToDelete) {
Write-Host $zone.ZoneName
}
# 确认是否要继续删除
$confirmation = Read-Host "您确定要删除这些区域吗?输入 'Yes' 继续,否则输入 'No'"
if ($confirmation -eq 'Yes') {
foreach ($zone in $zonesToDelete) {
try {
# 删除区域
Remove-DnsServerZone -Name $zone.ZoneName -ComputerName $dnsServer -Force
Write-Host "成功删除区域: $($zone.ZoneName)"
} catch {
Write-Error "无法删除区域: $($zone.ZoneName)。错误信息: $_"
}
}
} else {
Write-Host "操作已取消"
}
PowerShell 运行输出确认格式如下:
以下是将被删除的区域:
163.com
1688.com
ads.google.com
alicdn.com
aliexpress.com
您确定要删除这些区域吗?输入 'Yes' 继续,否则输入 'No': Yes
成功删除区域: 163.com
成功删除区域: 1688.com
成功删除区域: ads.google.com
成功删除区域: alicdn.com
成功删除区域: aliexpress.com
版权声明:「自由转载-保持署名-非商业性使用-禁止演绎 3.0 国际」(CC BY-NC-ND 3.0)
用一杯咖啡支持我们,我们的每一篇[文档]都经过实际操作和精心打磨,而不是简单地从网上复制粘贴。期间投入了大量心血,只为能够真正帮助到您。
暂无评论