答案是使用Resolve-DnsName cmdlet批量比对内网主机解析IP与预期值是否一致。脚本导入CSV列表,对每个主机名发起A记录DNS查询,仅取首个IPv4地址与预期IP比对,输出含匹配状态的表格,并支持多DNS服务器一致性验证及定时巡检。
用 powershell 批量检查内网主机 dns 解析是否正确,核心是:对每个目标主机名发起标准 dns 查询,比对返回的 ip 是否符合预期,并统一记录结果。不依赖第三方工具,全程使用 windows 内置的 resolve-dnsname cmdlet 即可完成。
准备待检主机列表与预期IP
先明确你要验证什么——不是“能不能解析”,而是“是否解析到正确的地址”。比如:
- 内网服务域名:
dc01.corp.local应始终返回10.1.1.10 - 文件服务器:
fs01.corp.local应返回10.1.1.20或属于10.1.1.0/24网段 - 跳过 IPv6 或仅关注 A 记录,避免干扰判断
把它们整理成 CSV 或数组格式,例如保存为 hosts-to-check.csv:
Hostname,ExpectedIP dc01.corp.local,10.1.1.10 fs01.corp.local,10.1.1.20 webapp.corp.local,10.1.1.50
执行批量解析并比对结果
以管理员身份运行 PowerShell,粘贴以下脚本(可直接执行,无需额外模块):
$list = Import-Csv "C:\path\to\hosts-to-check.csv"
$results = foreach ($item in $list) {
$name = $item.Hostname
$expect = $item.ExpectedIP
$res = Resolve-DnsName $name -Type A -QuickTimeout -DnsOnly -ErrorAction SilentlyContinue
if (-not $res) {
[PSCustomObject]@{ Hostname = $name; Status = "解析失败"; IP = ""; Match = "否" }
continue
}
$actual = $res.IPAddress | Select-Object -First 1
$match = if ($actual -eq $expect) { "是" } else { "否" }
[PSCustomObject]@{ Hostname = $name; Status = "成功"; IP = $actual; Match = $match }
}
$results | Format-Table -AutoSize
说明:
-
-DnsOnly跳过本地 hosts 文件,确保测的是真实 DNS 行为 -
-QuickTimeout防止卡住,默认超时约 1 秒,适合内网快速响应场景 - 只取首个 A 记录(
Select-Object -First 1),避免多 IP 情况下比对复杂化 - 输出表格含“Match=否”的条目,就是需要人工介入排查的对象
扩展:自动检测内网 DNS 服务器是否一致
如果想确认所有主机是否被同一套内网 DNS 统一解析(防 DNS 劫持或配置漂移),可指定多个 DNS 服务器并发查询:
$servers = "10.1.1.5", "10.1.1.6", "192.168.10.1"
foreach ($host in $list.Hostname) {
$ips = @()
foreach ($srv in $servers) {
$r = Resolve-DnsName $host -Server $srv -Type A -QuickTimeout -ErrorAction SilentlyContinue
if ($r) { $ips += $r.IPAddress }
}
$uniqueIPs = $ips | Sort-Object -Unique
Write-Host "$host → $($uniqueIPs.Count) 个不同IP: $($uniqueIPs -join ', ')"
}
若某主机在不同 DNS 服务器上返回不同 IP,说明存在解析不一致问题,常见于区域未同步、缓存未刷新或策略路由干扰。
日常巡检建议
把上述脚本保存为 Check-IntranetDNS.ps1,再用 Windows 定时任务每 15 分钟自动运行一次:
- 结果导出为 CSV:
$results | Export-Csv "C:\logs\dns-check-$(Get-Date -f yyyyMMdd-HHmm).csv" -NoTypeInformation - 异常时发邮件或写入事件日志(用
Write-EventLog) - 首次运行前,手动执行
Clear-DnsClientCache清掉本地缓存,确保结果反映当前 DNS 状态


















