2017-05-05 4 views
0

Ziel: Wir müssen die PTR-Datensätze in 1.055 Zonen ändern. Wir müssen den Host-Namen jedes Datensatzes ändern. Weit über 10.000 Einträge ...Anpassen mehrerer DNS-PTR-Zonen

Wir sind derzeit gezwungen, mit DNSCMD zu arbeiten, da wir noch eine 2008 R2 Domain sind.

Um diese Diskussion einfach zu halten, werde ich nur eine Zone mit 1 Server darin verwenden.

dieses Beispiel Server Nehmen: Thor.domain.com mit einem IP von 10.128.10.5. Wenn Sie diese Zone exportieren diesem Befehl:

dnscmd /enumzones > AllZones.txt 

for /f %a in (AllZones.txt) do dnscmd /ZoneExport %a export\%a.txt` 

Es ergibt sich eine Textdatei, die Inhalte wie diese hat:

 
; 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. 

Schritt 1 abgeschlossen. Natürlich hat dieses Skript 1.055 verschiedene Textdateien erstellt, eine pro PTR-Zone. Wir werden an nur einem für diese Diskussion arbeiten.

Ich habe herausgefunden, wie man diese Datei aufräumt, um es fast zu dem Stadium zu bringen, wo ich es verwenden könnte, um es zurück in DNS zu importieren. Um diese Datei für den erneuten Import vorzubereiten, habe ich den Text massiert.

Hier ist mein Skript so weit.

$ZoneName = Get-ChildItem -File C:\PS\DNS\PTR\export\ | % {$_.BaseName} 
$FileNames = Get-ChildItem -File C:\PS\DNS\PTR\export\ | % {$_.Name} 

foreach ($filename in $filenames) { 
    (Get-Content c:\PS\DNS\PTR\export\$filename) -replace "PTR","" -replace " ","" | 
    Select-Object -Skip 24 | 
    Out-File C:\PS\DNS\PTR\Output\$fileName 
} 

Was das bedeutet:

  1. jede Bezugnahme löschen PTR
  2. Entfernt alle Spaces
  3. Entfernt die ersten 24 Zeilen Text

Ergebnisse in einer Datei, die schaut so:

 
5 Thor.domain.com. 

Auch diese Datei ist nach der Zone benannt: 10.128.10.in-addr.arpa.txt.

Die Datei muss jetzt die Zoneninformationen zu jeder Textzeile hinzufügen. Hier stecke ich fest.

Der letzte Schritt, mit dem ich eine harte Zeit habe, ist, den Dateinamen (Zoneninformation) zu nehmen und diesen Text am Anfang jeder Zeile in der Datei einschließlich eines Tabs voranzustellen.

Ich habe eine Variable $ZoneName angegeben, die die Dateinamen aller Zonendateien übernimmt, aber nur den baseName (keine Erweiterung) bekommt.

In der Theorie, ich möchte diese Variable verwenden, um eine Datei zu erstellen, die wie folgt aussehen:

 
10.128.10.in-addr.arpa 5 Thor.domain.com 

Soweit ich weiß, dass wir sie alle unsere PTR Zonen und erneut hinzufügen löschen müssen . Dies könnte in der GUI getan werden, aber das ist eine entsetzliche Menge an Arbeit.

Sobald ich diese Dateien wie oben formatiert habe, sollte ich dann in der Lage sein, einen Befehl wie diesen zu verwenden, um sie zu importieren.

for /f "tokens=1-4 delims=;" %%a in (PTRs2Add.txt) do (
    dnscmd domaincontroller /RecordAdd %%a %%b %%c %%d >>addPTR.log 
) 

Diese besondere Befehl würde mich erfordern alle Ergebnis-Dateien in eine große Datei zu kombinieren. Ich bin mir sicher, dass ich eine bessere Möglichkeit finden würde, jede Zonendatei, die ich massiert habe, zu analysieren.

Natürlich, wenn ich eine schrecklich falsche Kaninchenloch gegangen bin, bin ich offen für andere Vorschläge, wie Sie den Hostnamen-Eintrag auf 10.000 PTR-Datensätze in 1.055 verschiedenen Zonen ändern.

+0

Sie wollen also die Zeile mit PTR ... entferne PTR und Whitespace und setze den Namen der Datei vor dieser Zeile für jede Datei, die du exportiert hast, vor? – Matt

+0

Ist diese PTR-Linie immer die letzte Linie? – Matt

+0

* Natürlich, wenn ich ein schrecklich falsches Kaninchenloch hinuntergegangen bin, bin ich offen für andere Vorschläge, wie man den Hostnamen Eintrag auf 10.000 PTR Records in 1.055 verschiedenen Zonen ändert:) * - eine 2012 R2 VM erstellen, exportieren/importieren , Powershell verwenden, exportieren/importieren zurück in Ihre Domain? : - | – TessellatingHeckler

Antwort

0

Mischen Batch und PowerShell und Exportieren/Importieren von Dateien sollte nicht erforderlich sein AFAICS. Schreiben Sie den dnscmd an den Ausgangsstrom (vulgo STDOUT) und reguläre Ausdrücke verwenden, um die relevanten Informationen zu extrahieren:

& 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 
    } 
} 

Wie Sie vielleicht schon vermutet, modifying a record besteht aus zu löschen und neu zu erstellen, es.

Wenn Sie ein wenig mehr Kontrolle darüber, welche Zonen verarbeitet werden, sollten Sie Objekte aus der Zoneninformationen aufbauen möchten und setzen einen weiteren Where-Object Filter zwischen diesem und Aufzählen der Zone Datensätze:

& 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 
    } 
}