背景:公司内网AD域DNS服务器要批量增加、删除一些域名,手动添加太慢,太繁琐。
以下主要讲如何通过 PowerShell 简化这个操作,也可以做成ps脚本来处理。
一、使用 PoweShell 命令管理 DNS 记录
1.新增资源记录
# 新增A记录,将主机名为“shop”,IP地址为“192.168.1.100”,添加到“baiyang.org”区域
Add-DnsServerResourceRecordA -Name "shop" -ZoneName "baiyang.org" -AllowUpdateAny -IPv4Address "192.168.1.100" -TimeToLive 01:00:00
# 新增CNAME记录,将主机名为“shop”,主机别名为“shop.lab.baiyang.org”,添加到“baiyang.org”区域
Add-DnsServerResourceRecordCName -Name "shop" -HostNameAlias "shop.lab.baiyang.org" -ZoneName "baiyang.org"
- 如果是远程管理DNS服务器可以使用参数:
-ComputerName "DNS_Server"
- 本文只介绍使用比较多的A记录和CNAME记录,如需增删其他记录类型,请参阅微软文档
2.查询资源记录
# 1.获取区域“baiyang.org”中主机名为“shop”的所有A记录
Get-DnsServerResourceRecord -ZoneName "baiyang.org" -Name "shop" -RRType "A"
# 2.获取区域“baiyang.org”中主机名为“shop”的所有资源记录
Get-DnsServerResourceRecord -ZoneName "baiyang.org" -Name "shop"
# 3.获取区域“baiyang.org”中所有资源记录
Get-DnsServerResourceRecord -ZoneName "baiyang.org"
3.修改记录
# 1.将“sfy.ink”区域中主机名为“shop”的资源记录的生存时间TTL值更改为2小时
$ZoneName = "baiyang.org"
$OldObj = Get-DnsServerResourceRecord -Name "shop" -ZoneName $ZoneName -RRType "A"
$NewObj = [ciminstance]::new($OldObj)
$NewObj.TimeToLive = [System.TimeSpan]::FromHours(2)
Set-DnsServerResourceRecord -NewInputObject $NewObj -OldInputObject $OldObj -ZoneName $ZoneName -PassThru
# 2.将“sfy.ink”区域中主机名为“shop”的资源记录的IP地址值更改为“192.168.1.200”
$ARecd = Get-DnsServerResourceRecord -ZoneName "baiyang.org" | Where-Object {$_.HostName -eq "shop"} | sort RecordData
$NewRecord = $ARecd.Clone()
$NewRecord.RecordData.IPv4Address ="192.168.1.200"
Set-DnsServerResourceRecord -NewInputObject $NewRecord -OldInputObject $As -ZoneName $ZoneName
4.删除记录
# 1.删除“baiyang.org”区域中主机名为“shop”所有A记录
Remove-DnsServerResourceRecord -ZoneName "baiyang.org" -RRType "A" -Name "shop"
# 2.从“baiyang.org”区域中删除主机名为“shop”且IP地址为“192.168.1.100”的A记录
Remove-DnsServerResourceRecord -ZoneName "baiyang.org" -RRType "A" -Name "shop" -RecordData "192.168.1.100"
5.批量添加A记录
# 读取CSV文件, 批量添加A记录
Import-Csv -Path .\Update_A_Records.csv | ForEach-Object {Add-DnsServerResourceRecordA -ZoneName $_.zone -AllowUpdateAny -Name $_.name -IPv4Address $_.ip;Write-Host "成功添加A记录: $($_.name + '.' + $_.zone) -> $($_.ip)"}
Update_A_Records.csv
文件内容如下:
name,zone,ip
biz,baiyang.org,192.168.1.101
home,baiyang.org,192.168.1.102
diy,baiyang.org,192.168.1.103
wss,baiyang.org,192.168.1.104
open,baiyang.org,192.168.1.105
api,baiyang.org,192.168.1.106
执行完成截图:
6.批量添加CNAME记录
# 读取CSV文件, 批量添加CNAME记录
Import-Csv -Path .\Update_CNAME_Records.csv | ForEach-Object {Add-DnsServerResourceRecordCName -ZoneName $_.zone -AllowUpdateAny -Name $_.name -HostNameAlias $_.cname;Write-Host "成功添加CNAME记录: $($_.name + '.' + $_.zone) -> $($_.cname)"}
Update_CNAME_Records.csv
文件内容如下:
name,zone,cname
biz-uat,baiyang.org,biz-uat.baiyang.1021a423.cdntest.com
home-uat,baiyang.org,home-uat.baiyang.1021a423.cdntest.com
diy-uat,baiyang.org,diy-uat.baiyang.1021a423.cdntest.com
执行完成截图:
当然,以上批量添加脚本适用于批量新增记录的情况,如果要做成脚本自动化处理,还需要做点思考,如先判断有无记录,有记录先删除,再添加,或者使用上面介绍的第三点修改记录的方法,然后根据csv文件判断更新A记录还是CNAME记录,在实际运维中也可以不用zone字段而直接使用完整域名,通过对字符串变量处理或者正则表达式来区分出主域名和子域名,这点可以根据自己实际需要调整。
二、Dnscmd:用于管理 DNS 服务器的命令行界面
此命令可以在cmd命令行环境运行,微软建议过渡到 Windows PowerShell,就是未来可能会删除 dnscmd.exe。
语法说明:
DnsCmd <ServerName> /RecordAdd <Zone> <NodeName> <RRType> <RRData>
DnsCmd <服务器名称> /RecordAdd <区域> <节点名称> <资源记录类型> <资源记录数据>
<!--
服务器名称:就是需要添加记录的目标DNS服务器的名称或者IP地址,可以用.或者localhost代表本机
区域:就是正向查找区域里的某个区域节点名称,这里我们假定是“demo.local”
节点名称:就是指的要添加的节点的名称,这里我们假定是某个服务器叫“pc_hr_001”
资源记录类型:就是指的这个DNS记录的类型,比如A记录、CNAME别名、MX记录等,不一一列举
资源记录数据:IP地址或者完整域名FQDN(如果是A记录就是IP地址),如果是CNAME或者MX就是FQDN。
-->
1.新增DNS记录
# 在本机DNS服务器上,添加一条区域baiyang.org中指向IP地址为192.168.1.110的主机名shop的A记录
DnsCmd /RecordAdd baiyang.org shop2 A 192.168.1.110
# 在远程DNS服务器(BAIYANG)上,添加一条区域sfy.ink中指向IP地址为192.168.1.100的主机名shop的A记录
DnsCmd BAIYANG /RecordAdd baiyang.org shop2 A 192.168.1.110
- RecordAdd不会判断同一名称的记录,重复记录会提示命令失败。
2.删除指定主机名的所有记录
DnsCmd /NodeDelete baiyang.org shop2 /F
- 删除了 baiyang.org 主机名为“shop2”的所有记录。