PowerShell批量修改DNS前需先启用WinRM并开放5985/5986端口,用Test-WSMan验证连通性;通过Set-DnsClientServerAddress按InterfaceIndex设置主备DNS,配合-ResetServerAddresses清空旧配置;批量执行应使用Invoke-Command -AsJob、try/catch异常处理及CSV日志;修改前导出原始DNS,修改后测试解析并支持回滚。
确认目标主机的远程管理能力
powershell批量修改dns前,必须确保所有目标主机已启用winrm(windows remote management),并开放防火墙端口(默认5985/http 或 5986/https)。可先用test-wsman验证连通性:
-
本地测试单台:
Test-WSMan -ComputerName "192.168.1.10" - 批量探测:从IP列表读取,过滤出响应成功的主机(避免脚本中断)
- 域环境下建议使用Invoke-Command -ComputerName配合-Credential参数,非域环境需提前在每台主机上运行
winrm quickconfig并配置信任主机
统一设置DNS服务器地址
通过Set-DnsClientServerAddress命令可直接指定IPv4或IPv6 DNS服务器。关键点在于准确识别网卡接口(InterfaceIndex)和适配器名称:
- 推荐按InterfaceDescription匹配(如"Intel(R) Ethernet Connection"),比Name更稳定
- 脚本中应先获取活动网卡:
Get-NetAdapter | Where-Object {$_.Status -eq 'Up'} - 设置主备DNS示例:
Set-DnsClientServerAddress -InterfaceIndex 12 -ServerAddresses "8.8.8.8","114.114.114.114" -ResetServerAddresses - -ResetServerAddresses参数确保清空原有DNS,避免追加导致冲突
批量执行与错误处理机制
不建议用简单循环硬扛失败,应加入超时、重试和日志记录:
免费 DNS 与邮件安全分析(IntoDNS.ai):包括 DNSSEC、SPF、DKIM、DMARC、MTA-STS、BIMI、SMTP STARTTLS、FCrDNS、黑名单、发件人要求及报告。
- 用Invoke-Command的-AsJob异步提交任务,再用Wait-Job统一收尾
- 每个远程操作包裹try/catch,捕获System.Management.Automation.Remoting.PSRemotingTransportException等典型异常
- 输出结构化结果到CSV:
[PSCustomObject]@{Computer=$c; Status=$status; Error=$err} | Export-Csv log.csv -Append - 对连续失败的主机自动跳过,避免阻塞整个批次
回滚与验证方案
生产环境修改DNS后必须验证有效性,并保留快速恢复路径:
- 执行前用Get-DnsClientServerAddress导出原始DNS配置存档
- 修改后立即调用Resolve-DnsName google.com -Server 8.8.8.8测试解析能力
- 若失败,触发回滚逻辑:
Set-DnsClientServerAddress -InterfaceIndex $idx -ServerAddresses $originalDns - 建议将完整流程封装为函数,支持-WhatIf模拟运行,避免误操作










