如何用PowerShell批量配置并每周校验多台服务器的DNSServerForwarders
用PowerShell批量配置并校验DNS服务器转发器
完全可以通过PowerShell脚本实现批量配置、定期校验DNS服务器转发器的需求,以下是具体实现方案:
1. 定义服务器与转发器的映射关系
先把每台服务器对应的目标DNS转发器IP整理成可维护的配置结构,比如用自定义对象数组:
# 服务器与对应DNS转发器的配置映射 $dnsForwarderConfig = @( [PSCustomObject]@{ ServerName = "server1" Forwarders = @("xxx.xxx.xxx.xxx", "yyy.yyy.yyy.yyy") }, [PSCustomObject]@{ ServerName = "server2" Forwarders = @("aaa.aaa.aaa.aaa", "xxx.xxx.xxx.xxx") }, [PSCustomObject]@{ ServerName = "server3" Forwarders = @("yyy.yyy.yyy.yyy", "xxx.xxx.xxx.xxx", "aaa.aaa.aaa.aaa") } )
2. 编写配置校验与更新脚本
遍历每台服务器,对比当前转发器配置与目标配置,不一致则自动更新,同时输出操作日志:
# 遍历配置,执行校验与更新 foreach ($config in $dnsForwarderConfig) { try { # 远程获取当前DNS转发器IP $currentForwarders = Get-DnsServerForwarder -ComputerName $config.ServerName -ErrorAction Stop | Select-Object -ExpandProperty IPAddress $currentForwarderStrings = $currentForwarders | ForEach-Object { $_.ToString() } $targetForwarders = $config.Forwarders # 对比配置是否一致 $diff = Compare-Object -ReferenceObject $targetForwarders -DifferenceObject $currentForwarderStrings -IncludeEqual $hasMismatch = $diff.Where({$_.SideIndicator -ne "=="}, 'First') if ($hasMismatch) { # 配置不一致,执行更新 Set-DnsServerForwarder -ComputerName $config.ServerName -IPAddress $targetForwarders -ErrorAction Stop Write-Host "[$(Get-Date)] 已更新服务器 $($config.ServerName) 的DNS转发器: $($targetForwarders -join ', ')" } else { Write-Host "[$(Get-Date)] 服务器 $($config.ServerName) 的DNS转发器配置符合要求,无需更新" } } catch { Write-Host "[$(Get-Date)] 处理服务器 $($config.ServerName) 失败: $_" -ForegroundColor Red } }
3. 定期执行脚本
将上述脚本保存为.ps1文件,通过Windows任务计划程序创建每周定时任务:
- 任务触发条件设置为每周指定时间
- 操作选择启动程序,程序路径填
powershell.exe,参数填-ExecutionPolicy Bypass -File "脚本完整路径" - 确保执行任务的账号拥有所有目标DNS服务器的管理员权限
注意事项
- 目标服务器需启用WinRM服务(
Get-DnsServerForwarder/Set-DnsServerForwarder依赖WinRM远程管理) - 可根据需求添加日志写入文件的逻辑,方便后续排查问题
内容的提问来源于stack exchange,提问作者Jerry Yeo
相关产品推荐
相关产品推荐

