,“`powershell,$dns = “8.8.8.8”;$domain = “example.com”;GetWmiObject Class Win32_NetworkAdapterConfiguration Filter IPEnabled=TRUE | % { $_.SetDNSServerSearchOrder($dns) ; $_.SetDomain($
批量修改DNS与域脚本开发指南
背景与需求分析
在企业网络管理中,批量修改DNS服务器和域配置是常见运维场景。
- 迁移AD域控制器时需要更新客户端DNS指向
- 更换ISP服务商后需统一修改DNS地址
- 大规模部署新域名策略
- 修复错误配置的DNS设置
传统手动逐台修改效率低下且易出错,自动化脚本可实现:

✓ 分钟级完成千台设备配置
✓ 标准化配置减少人为错误
✓ 可重复执行的修改流程
✓ 详细日志便于审计追踪
环境准备与工具选择
1 操作系统支持
| 操作系统类型 | 推荐工具 | 备注 |
|---|---|---|
| Windows | PowerShell | 原生支持,无需额外安装 |
| Linux | Bash/Python | 需root权限 |
| 混合环境 | Python+Paramiko | SSH协议跨平台管理 |
2 必备工具清单
-
PowerShell(Windows环境)
- 版本要求:Windows 7+ / 2008+
- 核心命令:
SetDnsClientServerAddress
-
Python(跨平台方案)

- 版本要求:Python 3.6+
- 依赖库:
subprocess,csv,paramiko
-
网络连通性验证工具
ping/nslookup:验证DNS可达性dnspython库:高级DNS查询(可选)
脚本设计与实现
1 Windows环境PowerShell方案
# 读取目标主机列表
$computers = GetContent Path "C:IThosts.txt"
# 定义新的DNS配置
$dns1 = "192.168.1.10"
$dns2 = "8.8.8.8"
$domain = "newdomain.local"
# 遍历修改每台主机
foreach ($computer in $computers) {
WriteHost "Processing $computer..."
try {
# 远程执行命令
InstallModule Name PSRemoting Force
InvokeCommand ComputerName $computer ScriptBlock {
SetDnsClientServerAddress InterfaceIndex (GetNetAdapter).InterfaceIndex
ServerAddresses (@("$using:dns1","$using:dns2"))
SetItemProperty Path "HKLM:SOFTWAREMicrosoftWindows NTCurrentVersionWinlogon" Name "AltDomain" Value "$using:domain"
} Credential (GetCredential)
} catch {
WriteHost "Error on $computer : $_" ForegroundColor Red
}
}
2 Linux环境Bash方案
#!/bin/bash
# 配置文件路径
HOST_LIST="hosts.txt"
DNS_CONF="/etc/resolv.conf"
# 循环处理所有主机
for HOST in $(cat $HOST_LIST); do
echo "Processing $HOST..."
ssh admin@$HOST bash <<EOF
# 备份原始配置
cp $DNS_CONF ${DNS_CONF}.bak
# 生成新配置
echo "nameserver 192.168.1.10" > $DNS_CONF
echo "nameserver 8.8.8.8" >> $DNS_CONF
# 修改/etc/default/grub域设置
sed i "s/DOMAIN=olddomain/DOMAIN=newdomain/" /etc/default/grub
grub2mkconfig o /boot/grub2/grub.cfg
EOF
done
3 跨平台Python方案
import paramiko
import csv
# 读取CSV配置文件
with open('config.csv', newline='') as csvfile:
reader = csv.DictReader(csvfile)
for row in reader:
host = row['Hostname']
os_type = row['OS']
# 建立SSH连接
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(host, username='admin', password='secret')
# 根据系统类型执行对应命令
if os_type == 'Windows':
cmds = [
f"SetDnsClientServerAddress ServerAddresses ('192.168.1.10','8.8.8.8')",
"SetItemProperty Path 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon' Name AltDomain Value newdomain"
]
elif os_type == 'Linux':
cmds = [
"echo 'nameserver 192.168.1.10' > /etc/resolv.conf",
"echo 'nameserver 8.8.8.8' >> /etc/resolv.conf",
"sed i 's/OLDDOMAIN/newdomain/' /etc/default/grub"
]
# 执行命令组
for cmd in cmds:
stdin, stdout, stderr = ssh.exec_command(cmd)
print(stdout.read().decode())
ssh.close()
安全与验证机制
1 前置检查清单
- 权限验证:确保目标设备启用远程执行权限
- 网络测试:
ping目标主机,确认网络连通性 - 配置备份:自动备份原始DNS配置文件(如
/etc/resolv.conf.bak) - 测试环境:先在少量设备验证脚本效果
2 验证方法
| 验证类型 | 命令/方法 | 预期结果 |
|---|---|---|
| DNS验证 | nslookup www.google.com |
返回正确IP地址 |
| 域验证 | hostname |
显示新域名 |
| 服务验证 | 访问域内关键服务(如文件服务器) | 能正常访问 |
| 日志检查 | 查看系统事件日志 | 无错误相关DNS记录 |
常见问题与解决方案
1 执行失败排查
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 连接超时 | 网络不通/防火墙阻挡 | 检查路由表,开放3389/22端口 |
| 权限不足 | 未使用管理员权限运行 | 添加Credential参数 |
| 命令执行错误 | 系统版本差异 | 增加版本判断逻辑 |
| 配置未生效 | 缓存未刷新 | 执行ipconfig /flushdns |
2 特殊场景处理
- 混合架构环境:通过CSV文件标注系统类型,脚本自动分支处理
- 敏感系统保护:设置白名单,跳过核心服务器修改
- 增量式更新:对比当前配置与目标配置,仅修改差异项
相关问题与解答
Q1:如何确保脚本在不同Windows版本上兼容?
A:可通过GetComputerInfo获取系统版本,添加条件判断:

$osVersion = (GetComputerInfo).WindowsVersion
if ($osVersion like "10.*") {
# Windows 10+专用命令
} elseif ($osVersion like "6.3*") {
# Windows 8.1处理逻辑
}
Q2:修改DNS后如何验证配置有效性?
A:建议在脚本中集成验证模块:
- 执行
ResolveDnsName www.microsoft.com - 检查返回的IP地址是否符合预期
- 将验证结果写入日志文件,格式示例:
[20231001 10:00] Host1: DNS验证成功,IP=20.37.156.195 [20231001 10:05] Host2: DNS解析
来源互联网整合,作者:小编,如若转载,请注明出处:https://www.aiboce.com/ask/196982.html