Powershell 调整多个DNS PTR区域

Powershell 调整多个DNS PTR区域,powershell,pointers,dns,Powershell,Pointers,Dns,目标:我们需要更改1055个区域的PTR记录。我们需要更改每个记录的主机名。超过10000条参赛作品 我们目前被迫与DNSCMD合作,因为我们仍然是2008 R2域 为了使讨论保持简单,我将只使用一个包含1台服务器的区域 以这个服务器为例:Thor.domain.com,IP为10.128.10.5。如果使用此命令导出此区域: dnscmd/enumzones>AllZones.txt 对于(AllZones.txt)中的/f%a,请执行dnscmd/ZoneExport%a导出\%a.txt`

目标:我们需要更改1055个区域的PTR记录。我们需要更改每个记录的主机名。超过10000条参赛作品

我们目前被迫与DNSCMD合作,因为我们仍然是2008 R2域

为了使讨论保持简单,我将只使用一个包含1台服务器的区域

以这个服务器为例:Thor.domain.com,IP为10.128.10.5。如果使用此命令导出此区域:

dnscmd/enumzones>AllZones.txt
对于(AllZones.txt)中的/f%a,请执行dnscmd/ZoneExport%a导出\%a.txt`
它会生成一个包含以下内容的文本文件:

; Database file (null) for 10.128.10.in-addr.arpa zone. ; Zone version: 21 @ IN SOA DomainControler.testdomain.com. hostmaster.testdomain.com. ( 21 ; serial number 900 ; refresh 600 ; retry 86400 ; expire 3600 ) ; default TTL ; Zone NS records @ NS DomainControler.testdomain.com. ; Zone records 5 PTR Thor.domain.com. 5 Thor.domain.com. 10.128.10.in-addr.arpa 5 Thor.domain.com 它的作用是:

  • 删除对PTR的任何引用
  • 删除所有空格
  • 删除前24行文本
  • 结果生成一个如下所示的文件:

    ; Database file (null) for 10.128.10.in-addr.arpa zone. ; Zone version: 21 @ IN SOA DomainControler.testdomain.com. hostmaster.testdomain.com. ( 21 ; serial number 900 ; refresh 600 ; retry 86400 ; expire 3600 ) ; default TTL ; Zone NS records @ NS DomainControler.testdomain.com. ; Zone records 5 PTR Thor.domain.com. 5 Thor.domain.com. 10.128.10.in-addr.arpa 5 Thor.domain.com 据我所知,我们将不得不删除所有PTR区域并重新添加它们。这可以在GUI中完成,但工作量惊人

    一旦我将这些文件格式化为上述格式,我就应该能够使用这样的命令来导入它们

    for/f“tokens=1-4 delims=;”(PTRs2Add.txt)中的%%a(
    dnscmd domaincontroller/RecordAdd%%a%%b%%c%%d>>addPTR.log
    )
    
    这个特殊的命令需要我将所有结果文件合并成一个大文件。我相信我可以找到更好的方法来解析我处理过的每个区域文件


    当然,如果我遇到了一个严重错误的兔子洞,我愿意听取关于如何更改1055个不同区域中10000条PTR记录的主机名条目的其他建议。

    混合批处理和PowerShell以及导出/导入文件对于AFAICS来说应该是不必要的。将
    dnscmd
    输出写入输出流(vulgo STDOUT),并使用正则表达式提取相关信息:

    & dnscmd /EnumZones | Where-Object {
      $_ -match '^ (\S+\.in-addr\.arpa)'
    } | ForEach-Object {
      $zone = $matches[1]
    
      & dnscmd /ZonePrint $zone | Where-Object {
        $_ -match '(\S+)\s+(?:\d+)\s+(?:PTR)\s+(\S+)'
      } | ForEach-Object {
        $data    = $matches[1]
        $name    = $matches[2]
        $newname = $name.Replace('.example.org.', '.example.com.')
    
        & dnscmd /RecordDelete $zone $name PTR $data /f
        & dnscmd /RecordAdd $zone $newname PTR $data /f
      }
    }
    
    正如您已经怀疑的,它包括删除和重新创建

    如果您需要更多地控制应处理哪些区域,您可能需要根据区域信息构建对象,并在该区域和枚举区域记录之间放置另一个
    Where Object
    过滤器:

    & dnscmd /EnumZones | Where-Object {
      $_ -match '^ (\S+\.in-addr\.arpa)\s+(\S+)\s+(\S+)\s+(\S*)'
    } | ForEach-Object {
      New-Object -Type PSObject -Property ([ordered]@{
        Name       = $matches[1]
        Type       = $matches[2]
        Storage    = $matches[3]
        Properties = $matches[4]
      })
    } | Where-Object {
      # filter zones (optional), e.g.:
      $_.Type -eq 'primary'
    } | ForEach-Object {
      $zone = $_.Name
    
      & dnscmd /ZonePrint $zone | Where-Object {
        $_ -match '(\S+)\s+(?:\d+)\s+(?:PTR)\s+(\S+)'
      } | ForEach-Object {
        $data    = $matches[1]
        $name    = $matches[2]
        $newname = $name.Replace('.example.org.', '.example.com.')
    
        & dnscmd /RecordDelete $zone $name PTR $data /f
        & dnscmd /RecordAdd $zone $newname PTR $data /f
      }
    }
    

    所以你想和PTR通话。。。删除PTR和空格,并在导出中的每个文件的该行前面加上文件名?该PTR行始终是最后一行吗?当然,如果我犯了一个可怕的错误,我愿意就如何更改1055个不同区域中10000条PTR记录的主机名条目提出其他建议:)-构建2012 R2虚拟机,导出/导入,使用powershell,导出/导入回您的域?:-|我不清楚你到底想要实现什么,因为你似乎没有改变任何记录。是否要将PTR区域移动到其他服务器/域?改变地址?主机名?域?@Matt,正确,我想将文件名预先挂起到每行的文件中,以完成脚本在导入时使用的数据。