PowerShell问题:每条SRV记录对应显示两条A记录(预期应为一条)
解决Active Directory SRV记录对应A记录重复显示的问题
我来帮你分析这个问题,同时给出具体的修复方案:
为什么会出现A记录重复?
大概率是以下两个原因之一:
- DNS中存在重复的A记录:你的域控制器(也就是SRV记录指向的
NameTarget)可能在DNS服务器上注册了多条A记录——比如域控制器有多个网卡,每个网卡的IP都自动同步到了DNS,或者手动添加了重复的IP条目。这种情况下Resolve-DnsName会返回所有匹配的A记录,导致你看到每条SRV对应两条A记录。 - 原脚本输出格式的误导:原脚本直接用
Format-Table | Out-String输出,有时候Format-Table会因为终端宽度限制把一条记录拆成多行显示,看起来像是重复,但实际是同一条记录的换行。不过你说多次运行都出现这个情况,这个可能性相对小一些。
另外,小概率情况是Resolve-DnsName默认同时查询IPv4和IPv6记录,你误把AAAA(IPv6)记录当成了A记录,但你明确说是A记录,所以这个可以排除。
如何修复:只显示一次A记录?
我修改了你的脚本,解决了重复问题,同时让输出更清晰易读:
# 按站点显示Active Directory SRV记录 $logpath = "$ENV:UserProfile\Desktop\" #################################################### # 获取日期并转换为字符串 $date=((Get-Date).ToString('yyyy-MM-dd-HH-mm-ss')) # 定义本脚本日志文件的路径 $Logfile = $logpath+$date+".log" # 获取AD域名 $domain = ((Get-WmiObject Win32_ComputerSystem).Domain) # 获取所有站点 $sites = (([System.DirectoryServices.ActiveDirectory.Forest]::GetCurrentForest().Sites).Name) Function Write-Log { Param ([string]$logstring) Add-content $Logfile -value $logstring } Write-Log "Domainname: $domain" Write-Log "-------------" foreach ($site in $sites){ Write-Log "Sitename: $site" Write-Log "-------------" # 获取SRV记录对象,不直接格式化,保留原始数据方便后续处理 $srvRecords = Resolve-DnsName -Type SRV "_ldap._tcp.$site._sites.$domain" -ErrorAction SilentlyContinue if ($srvRecords) { foreach ($srv in $srvRecords) { # 输出SRV记录的核心信息 Write-Log "SRV Record: Name=$($srv.Name), Type=$($srv.Type), Target=$($srv.NameTarget), Port=$($srv.Port)" # 精准查询对应A记录,只取IPv4条目,同时自动去重 $aRecords = Resolve-DnsName -Type A $srv.NameTarget -ErrorAction SilentlyContinue | Select-Object -Unique IPAddress foreach ($a in $aRecords) { Write-Log " Corresponding A Record: $($a.IPAddress)" } Write-Log "-------------" } } else { Write-Log "No SRV records found for site $site" Write-Log "-------------" } }
关键改动说明:
- 保留对象数据:原脚本用
ft | Out-String会丢失记录的结构化信息,现在先保存SRV记录对象,后续可以单独处理每个记录的细节。 - 精准过滤A记录:指定
-Type A确保只返回IPv4的A记录,不会混入IPv6的AAAA记录。 - 自动去重:用
Select-Object -Unique去除重复的IP地址条目,保证每个A记录只显示一次。 - 增加容错处理:添加
-ErrorAction SilentlyContinue,避免某个站点没有SRV记录时脚本抛出错误中断运行。
额外排查建议
如果你想确认是不是DNS本身的问题,可以手动运行以下命令,查看某个域控制器主机名的A记录:
Resolve-DnsName -Type A <你的域控制器主机名>
如果返回多条IP,那就是DNS里存在重复记录,你可以登录DNS服务器清理掉多余的A记录;如果只返回一条,那就是原脚本的格式输出问题,用修改后的脚本就可以解决。
内容的提问来源于stack exchange,提问作者T-Heron
相关产品推荐
相关产品推荐

