,“`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