Nach dem ein Domain Controller entfernt worden ist, bleibt dieser für alle DNS-Zonen, für die der Server als Nameserver konfiguriert war, eintragen. Dies zu bereinigen, kann aufwendig werden, wenn viele Zonen bereitgestellt werden. Das kann insbesondere in einem Active Directory mit vielen Standorten wegen der Reverse-Lookup-Zonen oder in einer Multi-Forest oder Multi-Domain Umgebung der Fall sein.

Nameserver aus DNS-Zonen können für Windows DNS-Server mit der Powershell entfernt werden. Die folgenden Skripts benötigen einen Windows 2012 R2 DNS-Server.

  • Skript test-NameServer.ps1

Mit diesem Skript kann ermittelt werden, ob für die Nameserver Einträge einer Zone DNS-Server existieren:

#
# erstellt eine Auflistung der eingetragenen Name Server und kennzeichnet diese:
# hasZone = $true : Zone ist auf dem Nameserver
# hasZone = $false : Zone ist nicht auf dem Nameserver
#
# Rückgabe:
# ServerName = hostname des Nameserver
# fqdn = Full qualified name des NameServer
# ZoneName = Name der Zone wie als Parameter angegeben
# hasZone = True, falls Zone auf dem Server False, falls nicht
# isDNSServer = Server ist DNSServer (DNSServerdienst ist vorhanden)
# dnsServer = Name des abgefragten Servers
#
#
param ( [Parameter(Mandatory=$true)]
  [String]$ZoneName,
  [String]$ComputerName = $env:Computername
)

$DnsZone = Get-DNSServerZone -ZoneName $ZoneName -computerName $Computername
if ($DnsZone -eq $NULL) { return }

$NameServers = (Get-DnsServerResourceRecord -ZoneName $ZoneName -Name "@" -RRType NS -computerName $Computername | select -expandproperty RecordData).nameServer

foreach ($NameServer in $NameServers) {
  $ServerName = $NameServer.split(".")[0]
  $fqdn = $NameServer.Substring(0,$NameServer.lastIndexof("."))
  $obj = new-Object -typeName psObject -property @{
    NameServer = $fqdn
    ServerName = $ServerName
    ZoneName = $ZoneName
    isDNSServer = $False
    hasZone = $false
    dnsserver = $Computername
  }
  Try {
    $wmiobj = get-wmiobject -query "Select * from win32_service where Name = 'DNS'" -computerName $obj.ServerName -ErrorAction SilentlyContinue
    if ($wmiobj -ne $NULL) {
      $obj.isDNSServer = $true
      $Zone = Get-DNSServerZone -computerName $obj.Servername -ZoneName $ZoneName -errorAction Stop
      $obj.HasZone = $true
    }
  } catch {
    $obj.HasZone = $False
  }
  write-output $obj
}

Beispiel:

.\test-NameServer.ps1 -ZoneName ad.xyz.local

Entfernen kann man Nameserver Einträge, hinter denen kein DNS-Server mehr steht, mit folgendem Skript:

  • Skript: Remove-NameServer.ps1
param (

[Parameter(Mandatory=$true)]
[String]$ServerName,
[Switch]$showonly

)

$DNSZones = Get-DnsServerZone

foreach ($Zone in $DnsZones) {
  $R = new-Object -typeName psObject -property @{
    zone = $Zone.ZoneName
    NameServertoRemove = $ServerName
    Found = $False
    Removed = $NULL
  }
  $X = Get-DnsServerResourceRecord -ZoneName $Zone.ZoneName -Name "@" -RRType NS | where {$_.recordData.NameServer -match "^$serverName" }
  if ($X -ne $NULL) {
     $R.Found = $true
     if (!($PSBoundParameters.ContainsKey("showonly"))) {
        try {
            
           Remove-DnsServerResourceRecord -ZoneName $Zone.ZoneName -Name "@" -RRType NS -RecordData $X.RecordData.NameServer -confirm:$false -force -ErrorAction Stop
           $r.Removed = "True"
        } catch {
           $r.Removed = "False"
        }
     } else { $R.Removed = $NULL }
   } else {
       if (!($PSBoundParameters.ContainsKey("showonly"))) {
         $R.Removed = "FALSE"
       }
   }
   write-output $R
}
</p>
.\Test-NameServer -Servername xzy-iis001.foo.local

Das Skript ermittelt auf den lokalen Server alle DNS-Zonen. Diese Zonen werden daraufhin überprüft, ob der angegebenen Server (FQDN angeben) als Nameserver eingetragen ist. Dieser Eintrag wird dann gegebenenfalls entfernt. Mit Showonly wird nur angezeigt, ob es Nameserver Einträge gibt, für kein DNS-Server ermittelt werden kann.

Hinweis: Die Verwendung der Skript geschieht auf eigene Verantwortung!

 

Feedback

Haben Sie Fragen, Anregungen oder Kritik zu diesem Beitrag?
Nutzen Sie unser Feedback-Tool. Wir freuen uns auf Ihre Nachricht.

Ihre E-Mail-Adresse (Pflichtfeld)

Ihre Nachricht (Pflichtfeld)

Ich stimme zu, dass die Verarbeitung meiner Daten gemäß Punkt 3 der Datenschutzerklärung erfolgt .

Trevedi

Trevedi IT-Consulting GmbH
Gottfried-Hagen-Str. 30
51105 Köln

T +49 (0)221 – 3 55 88 88 – 0
E info(@)trevedi.de

Trevedi Partnerlogos

Top