dnscmd 是一个强大的命令行工具,用于管理 Windows Server 上的 DNS 服务器,它允许管理员通过脚本或命令行执行几乎所有可以在 DNS 管理控制台中完成的操作,非常适合自动化任务和批量管理。

基本概述
- 全称: DNS Command
- 用途: 管理 DNS 服务器和区域。
- 系统要求: 必须安装在 Windows Server 的 DNS 服务器角色上,或者安装了“远程服务器管理工具 (RSAT)”的客户端计算机。
- 权限: 需要管理员权限才能运行。
语法结构
dnscmd 命令的基本结构如下:
dnscmd [<ServerName>] <Command> [<CommandParameters>]
<ServerName>: (可选)要管理的 DNS 服务器的名称或 IP 地址,如果省略,则默认为本地计算机。<Command>: (必需)要执行的操作命令,/ZoneAdd、/RecordAdd等。<CommandParameters>: (可选)为特定命令提供的参数,例如区域名称、记录类型、IP 地址等。
常用命令分类及示例
下面我将 dnscmd 的常用命令按功能分类,并提供具体示例。
1 服务器级操作
这些命令用于管理 DNS 服务器本身。
-
查看服务器信息
(图片来源网络,侵删)dnscmd /Info: 显示 DNS 服务器的所有配置信息。dnscmd /Info <ParameterName>: 显示特定参数的值,查看是否启用转发器:dnscmd /Info Forwarders
-
配置服务器选项
- 启用/禁用递归: 递归是 DNS 服务器向其他 DNS 服务器查询以解析未知名称的能力。
dnscmd /ResetForwarders # 清除所有转发器,并启用递归 dnscmd /SetForwarders 8.8.8.8 8.8.4.4 # 设置 Google 的 DNS 为转发器,并自动禁用递归
- 启用/禁用递归: 递归是 DNS 服务器向其他 DNS 服务器查询以解析未知名称的能力。
-
刷新服务器
dnscmd /ClearCache: 清空 DNS 服务器的解析缓存。dnscmd /WriteBackNames: 将动态更新的记录写回 zone 文件。
2 区域级操作
这些命令用于管理 DNS 区域(正向查找、反向查找)。
-
创建区域
(图片来源网络,侵删)-
创建正向查找区域:
dnscmd /ZoneAdd example.com /Primary
/Primary: 创建一个主要区域。/Secondary: 创建一个辅助区域。/Stub: 创建一个存根区域。
-
创建反向查找区域:
dnscmd /ZoneAdd 1.168.192.in-addr.arpa /Primary
-
-
删除区域
dnscmd /ZoneDelete example.com /f(/f表示强制,无需确认)
-
枚举/列出区域
dnscmd /EnumZones: 列出服务器上所有的区域。
-
配置区域属性
- 允许/禁用动态更新:
dnscmd /ZoneResetSecureUpdates example.com # 启用安全动态更新(推荐) dnscmd /ZoneResetUpdates example.com /NonSecureAndSecure # 允许非安全更新(不安全)
- 允许/禁用动态更新:
-
区域传输
- 添加辅助服务器的 IP 地址:
dnscmd /ZoneAddSecondary example.com 192.168.1.100
- 允许区域传输到所有服务器:
dnscmd /ZoneResetSecondaries example.com /NonSecureNotify 192.168.1.100
- 添加辅助服务器的 IP 地址:
3 记录级操作
这是最常用的部分,用于添加、修改和删除 DNS 记录。
-
添加记录
- 添加 A 记录 (主机名到 IP 地址):
dnscmd /RecordAdd example.com www 192.168.1.10
- 添加 AAAA 记录 (主机名到 IPv6 地址):
dnscmd /RecordAdd example.com server1 2001:db8::1
- 添加 CNAME 记录 (别名):
dnscmd /RecordAdd example.com webmail CNAME mail.example.com
- 添加 MX 记录 (邮件交换器):
dnscmd /RecordAdd example.com MX 10 mail.example.com
10是优先级值。
- 添加 PTR 记录 (反向记录):
dnscmd /RecordAdd 1.168.192.in-addr.arpa 10 PTR server1.example.com
- 添加 A 记录 (主机名到 IP 地址):
-
删除记录
dnscmd /RecordDelete example.com www A /f
-
枚举/列出记录
dnscmd /EnumRecords example.com @: 列出区域根( 代表区域本身)的所有记录。dnscmd /EnumRecords example.com www: 列出www主机的所有记录。
4 高级和调试操作
-
调试日志
- 启用日志记录,并将日志写入
C:\dns.log:dnscmd /Config /LogLevel 7 dnscmd /Config /LogFilePath C:\dns.log dnscmd /Config /LogFilePath C:\dns.log
- 禁用日志记录:
dnscmd /Config /LogLevel 0
- 启用日志记录,并将日志写入
-
验证区域
dnscmd /ZoneValidate example.com: 验证区域的配置和完整性。
实际应用场景
批量添加 A 记录
假设你需要为 example.com 区域内的 100 台服务器添加 A 记录,可以使用 for 循环脚本:
@echo off
set zone=example.com
set prefix=server
for /l %%i in (1,1,100) do (
set ip=192.168.1.%%i
echo Adding %prefix%%%i.%zone% with IP %ip%
dnscmd /RecordAdd %zone% %prefix%%%i %ip%
)
echo All records added.
检查并清理过期的记录
这个脚本会检查一个主机是否存在,如果不存在则删除其 A 记录(这是一个简化的例子,实际生产中需要更复杂的逻辑)。
@echo off
set zone=example.com
set host=old-server
REM 检查主机是否存在(简单方法:尝试枚举记录,如果出错则可能不存在)
dnscmd /EnumRecords %zone% %host% > nul 2>&1
if %errorlevel% neq 0 (
echo Host %host% not found, deleting record...
dnscmd /RecordDelete %zone% %host% A /f
) else (
echo Host %host% exists. No action needed.
)
重要注意事项
- 脚本化:
dnscmd的最大价值在于脚本化,你可以将其与 Windows 任务计划程序结合,实现自动化的 DNS 管理。 - 错误处理: 在脚本中使用
if %errorlevel% neq 0来检查命令是否执行成功,这对于健壮的脚本至关重要。 - 安全性: 对于生产环境,始终推荐使用 安全动态更新 (
/ZoneResetSecureUpdates),这样可以防止恶意客户端随意添加或修改 DNS 记录。 - 备份: 在对 DNS 服务器进行重大更改(如修改区域属性、删除大量记录)前,务必备份 DNS 数据,可以使用
dnscmd /Export命令。dnscmd /Export example.com C:\backup\example.com.dns
- 替代工具: 对于 Windows Server 2025 及更高版本,微软推荐使用 PowerShell 的
DnsServer模块(Get-Command -Module DnsServer),它提供了更现代、更强大的功能,并且与 PowerShell 的其他功能(如管道、对象处理)集成得更好。dnscmd仍然可用,但 PowerShell 已成为首选。
希望这份详细的指南能帮助你全面了解和使用 dnscmd 命令!
