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

使用PowerShell为现有A记录创建Windows DNS PTR记录的方法

为现有A记录批量生成缺失的PTR记录方案

针对你提到的两类场景,以下是高效的解决方案,无需手动逐个创建PTR或删除重建A记录:

场景1:修复正向区域中未同步PTR的A记录

Windows DNS确实没有原生的-UpdatePTR类参数,但可以通过PowerShell批量遍历A记录,自动生成缺失的PTR记录,步骤如下:

  1. 遍历目标正向区域的所有A记录,过滤掉已存在对应PTR的记录
  2. 解析A记录的IP地址,自动匹配对应的反向查找区域
  3. 为每条符合条件的A记录创建PTR记录

示例脚本:

# 替换为你的正向区域名称
$forwardZoneName = "your-domain.com"
# 获取正向区域所有A记录
$aRecords = Get-DnsServerResourceRecord -ZoneName $forwardZoneName -RRType A

foreach ($record in $aRecords) {
    $ipAddress = $record.RecordData.IPv4Address.IPAddressToString
    $hostname = $record.HostName

    # 检查反向区域是否存在,不存在则跳过(或按需创建)
    $reverseZone = Get-DnsServerZone | Where-Object {
        $_.ZoneName -match "^(?:\d{1,3}\.){3}\d{1,3}\.in-addr\.arpa$" -and
        [System.Net.IPAddress]::Parse($_.ZoneName -replace "\.in-addr\.arpa$", "").GetAddressBytes() -join "." -eq ($ipAddress -split "\." | Reverse) -join "."
    }

    if ($reverseZone) {
        # 检查该IP是否已存在PTR记录
        $existingPtr = Get-DnsServerResourceRecord -ZoneName $reverseZone.ZoneName -RRType PTR | Where-Object {
            $_.RecordData.PtrDomainName -eq "$hostname.$forwardZoneName."
        }

        if (-not $existingPtr) {
            # 生成PTR记录的主机名(IP段反转)
            $ptrHostname = ($ipAddress -split "\." | Reverse)[0..2] -join "."
            # 创建PTR记录
            Add-DnsServerResourceRecordPTR -ZoneName $reverseZone.ZoneName -Name $ptrHostname -PtrDomainName "$hostname.$forwardZoneName." -CreatePtr $false
            Write-Host "Created PTR for $hostname -> $ipAddress in zone $($reverseZone.ZoneName)"
        }
    }
}

场景2:合并子网反向区域到父反向区域

当需要将子网级反向区域(如1.192.10.in-addr.arpa)合并到父区域(如192.10.in-addr.arpa)时,可通过批量迁移PTR记录并同步正向A记录的关联:

  1. 导出子网反向区域的所有PTR记录
  2. 在父反向区域中创建对应的PTR记录(调整主机名格式,去掉子网段的最后一位)
  3. 可选:更新正向A记录的PTR关联,确保指向父区域

示例脚本:

# 替换为子网反向区域和父反向区域名称
$childReverseZone = "1.192.10.in-addr.arpa"
$parentReverseZone = "192.10.in-addr.arpa"

# 获取子网区域的所有PTR记录
$childPtrRecords = Get-DnsServerResourceRecord -ZoneName $childReverseZone -RRType PTR

foreach ($record in $childPtrRecords) {
    # 提取IP的前三位(因为子网区域是第4段,父区域是前三位)
    $ptrNameParts = $record.HostName -split "\."
    $parentPtrName = $ptrNameParts[1..2] -join "."
    $ptrDomainName = $record.RecordData.PtrDomainName

    # 检查父区域是否已存在该PTR记录
    $existingParentPtr = Get-DnsServerResourceRecord -ZoneName $parentReverseZone -RRType PTR | Where-Object {
        $_.HostName -eq $parentPtrName -and $_.RecordData.PtrDomainName -eq $ptrDomainName
    }

    if (-not $existingParentPtr) {
        Add-DnsServerResourceRecordPTR -ZoneName $parentReverseZone -Name $parentPtrName -PtrDomainName $ptrDomainName -CreatePtr $false
        Write-Host "Moved PTR $($record.HostName) -> $ptrDomainName to parent zone $parentReverseZone as $parentPtrName"
    }
}

# 可选:删除原子网反向区域(确认迁移完成后执行)
# Remove-DnsServerZone -Name $childReverseZone -Force

关键说明

  • 无需删除重建A记录:上述脚本直接基于现有A记录生成PTR,避免了记录重建的风险
  • 自动匹配反向区域:脚本会自动识别IP对应的反向区域,无需手动指定,适合多区域场景
  • 可批量扩展:将脚本中的区域名称参数改为数组,即可一次性处理数百个区域

内容的提问来源于stack exchange,提问作者Matthew McDonald

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 23:40:38