使用 PowerShell 批量删除 Windows DNS 正向解析

前述

最近,木子公司将 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.comrl.com。因此,在排除不需要删除的区域时,应该使用通配符 *rl.com。此外,dnsmgmt.exe 控制台中看不到的系统默认区域如 in-addr.arpaTrustAnchorsRootHintsip6.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
Avatar photo

关于 木子

Founder of the Rocky Linux Chinese community, MVP、VMware vExpert、TVP, advocate for cloud native technologies, with over ten years of experience in site reliability engineering (SRE) and the DevOps field. Passionate about Cloud Computing、Microservices、CI&CD、DevOps、Kubernetes, currently dedicated to promoting and implementing Rocky Linux in Chinese-speaking regions.
用一杯咖啡支持我们,我们的每一篇[文档]都经过实际操作和精心打磨,而不是简单地从网上复制粘贴。期间投入了大量心血,只为能够真正帮助到您。
暂无评论

发送评论 编辑评论


|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇