You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell问题:每条SRV记录对应显示两条A记录(预期应为一条)

解决Active Directory SRV记录对应A记录重复显示的问题

我来帮你分析这个问题,同时给出具体的修复方案:

为什么会出现A记录重复?

大概率是以下两个原因之一:

  1. DNS中存在重复的A记录:你的域控制器(也就是SRV记录指向的NameTarget)可能在DNS服务器上注册了多条A记录——比如域控制器有多个网卡,每个网卡的IP都自动同步到了DNS,或者手动添加了重复的IP条目。这种情况下Resolve-DnsName会返回所有匹配的A记录,导致你看到每条SRV对应两条A记录。
  2. 原脚本输出格式的误导:原脚本直接用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 12:52:44