Diese Anleitung beschreibt das sichere Entfernen eines Domänencontrollers, der dauerhaft ausgefallen ist, nicht mehr gestartet werden kann oder physisch beziehungsweise virtuell nicht mehr existiert. Der Vorgang wird als erzwungene Entfernung mit Metadatenbereinigung bezeichnet.
Wichtig: Führen Sie diese Schritte nur aus, wenn der ausgefallene Domänencontroller definitiv nicht mehr normal gestartet und herabgestuft werden kann. Nach der Bereinigung darf die alte Installation des Domänencontrollers nicht wieder mit dem Netzwerk verbunden werden.
Für die Arbeiten benötigen Sie normalerweise:
Führen Sie die Metadatenbereinigung nur aus, wenn mindestens ein anderer Domänencontroller der Domäne ordnungsgemäß funktioniert.
Falls der ausgefallene Server der einzige Domänencontroller der Domäne war, darf er nicht einfach aus Active Directory entfernt werden. In diesem Fall benötigen Sie eine Wiederherstellung des Domänencontrollers beziehungsweise der Gesamtstruktur aus einer geeigneten Systemstatussicherung.
Auf einem funktionierenden Domänencontroller oder einem Verwaltungsrechner mit installiertem Active-Directory-Modul:
Get-ADDomainController -Filter * |
Select-Object HostName, Site, IPv4Address, IsGlobalCatalog, OperationMasterRoles
Prüfen Sie zusätzlich, ob der noch vorhandene Domänencontroller die Domäne lesen und schreiben kann:
Get-ADDomain
Get-ADForest
Öffnen Sie eine Eingabeaufforderung oder PowerShell als Administrator:
repadmin /replsummary
Anschließend:
repadmin /showrepl *
Der ausgefallene Domänencontroller wird wahrscheinlich mit Replikationsfehlern angezeigt. Entscheidend ist, dass die verbleibenden Domänencontroller untereinander erfolgreich replizieren.
Eine ausführlichere Übersicht kann mit folgendem Befehl erzeugt werden:
repadmin /showrepl * /csv
Prüfen Sie außerdem die Erreichbarkeit der Domänendienste:
dcdiag /e /c /v
Für eine gezielte Prüfung des DNS-Dienstes:
dcdiag /test:dns /e /v
Es ist nicht notwendig, dass alle Tests bezüglich des bereits ausgefallenen Domänencontrollers erfolgreich sind. Fehler zwischen den verbleibenden Domänencontrollern müssen jedoch vor oder unmittelbar nach der Bereinigung untersucht werden.
Ermitteln Sie, welche Domänencontroller aktuell die FSMO-Rollen besitzen:
netdom query fsmo
Alternativ mit PowerShell:
Get-ADDomain | Select-Object PDCEmulator, RIDMaster, InfrastructureMaster
Get-ADForest | Select-Object SchemaMaster, DomainNamingMaster
Die fünf FSMO-Rollen sind:
Wenn der alte Domänencontroller definitiv nicht zurückkehren wird, müssen die betroffenen Rollen auf einen funktionierenden Domänencontroller erzwungen übertragen, also übernommen, werden.
Ersetzen Sie DC02 durch den Namen des funktionierenden Ziel-Domänencontrollers.
Beispiel für die Übernahme aller Rollen:
Move-ADDirectoryServerOperationMasterRole `
-Identity "DC02" `
-OperationMasterRole SchemaMaster,DomainNamingMaster,PDCEmulator,RIDMaster,InfrastructureMaster `
-Force
Übernehmen Sie möglichst nur die Rollen, die tatsächlich auf dem ausgefallenen Server lagen. Beispiel für PDC-Emulator und RID-Master:
Move-ADDirectoryServerOperationMasterRole `
-Identity "DC02" `
-OperationMasterRole PDCEmulator,RIDMaster `
-Force
Danach erneut prüfen:
netdom query fsmo
Eine mit
-Forceübernommene FSMO-Rolle darf nicht wieder gleichzeitig vom alten Domänencontroller angeboten werden. Der alte Domänencontroller muss dauerhaft offline bleiben oder vor einer erneuten Verwendung vollständig neu installiert werden.
Vor der Entfernung sollten Sie feststellen, ob der Server neben Active Directory weitere wichtige Aufgaben erfüllte:
Get-ADDomainController -Filter * |
Select-Object HostName, IsGlobalCatalog, Site
In jedem Standort sollte nach Möglichkeit ein erreichbarer globaler Katalog vorhanden sein. Dieser muss sich jedoch nicht zwingend in derselben Site befinden. Ein Domänencontroller gehört immer genau zu der Site, in der sich sein Serverobjekt befindet, und sollte nicht zur Abdeckung einer anderen Site verschoben oder mehrfach zugewiesen werden.
Falls erforderlich, kann ein verbleibender Domänencontroller als globaler Katalog konfiguriert werden:
dssite.msc.Besitzt eine Site keinen eigenen Domänencontroller beziehungsweise globalen Katalog, verwenden die Clients automatisch einen erreichbaren Server aus einer anderen Site. Prüfen in diesem Fall:
Die Auswahl kann auf einem Client der betroffenen Site geprüft werden:
nltest /dsgetsite
nltest /dsgetdc:deinedomaene.local /force
nltest /dsgetdc:deinedomaene.local /GC /force
Folgender Befehl ist für die Forest Root Domain Prüfung, die eventuell unterschiedlich ist.
nltest /dsgetdc:deinerootdomaene.local /GC /force
Kurz gesagt: Den Domänencontroller nicht verschieben oder doppelt zuweisen, sondern Subnetze, Site Links und deren Kosten korrekt konfigurieren.
Dies ist bei aktuellen Windows-Server-Versionen der bevorzugte Weg.
dsa.msc
Aktivieren Sie unter Ansicht die Option Erweiterte Features.
Öffnen Sie die Organisationseinheit Domain Controllers.
Suchen Sie das Computerkonto des ausgefallenen Domänencontrollers.
Klicken Sie mit der rechten Maustaste darauf und wählen Sie Löschen.
Bestätigen Sie die Warnung.
Wenn angezeigt, aktivieren Sie die Option sinngemäß:
Dieser Domänencontroller ist dauerhaft offline und kann nicht mehr mit dem Active Directory-Installationsassistenten herabgestuft werden.
Bestätigen Sie die Entfernung.
Bei unterstützten Verwaltungstools entfernt dieser Vorgang normalerweise gleichzeitig die zugehörigen Domänencontroller-Metadaten einschließlich des NTDS-Settings-Objekts.
Öffnen Sie:
dssite.msc
Navigieren Sie zu:
Standorte
<Name des Standorts>
Servers
<Name des ausgefallenen Domänencontrollers>
Prüfen Sie, ob der alte Server noch vorhanden ist.
Löschen Sie nicht unüberlegt manuell einzelne Replikationsverbindungen. Entfernen Sie zuerst das NTDS-Settings-Objekt und danach das Serverobjekt des ausgefallenen Domänencontrollers.
ntdsutilVerwenden Sie diese Methode, wenn die grafische Bereinigung nicht möglich ist oder verwaiste Metadaten verbleiben.
Öffnen Sie eine Eingabeaufforderung als Administrator:
ntdsutil
Wechseln Sie zur Metadatenbereinigung:
metadata cleanup
Stellen Sie eine Verbindung zu einem funktionierenden Domänencontroller her:
connections
connect to server DC02
quit
Ersetzen Sie DC02 durch den Namen eines funktionierenden Domänencontrollers.
Wählen Sie anschließend das zu entfernende Serverobjekt aus:
select operation target
list domains
select domain <Nummer>
list sites
select site <Nummer>
list servers in site
select server <Nummer>
quit
Kontrollieren Sie sehr sorgfältig, dass der ausgewählte Server tatsächlich der ausgefallene Domänencontroller ist. Entfernen Sie ihn anschließend:
remove selected server
Bestätigen Sie die Rückfragen und beenden Sie das Programm:
quit
quit
Verwenden Sie
remove selected serverniemals, bevor Sie anhand der angezeigten Auswahl geprüft haben, dass wirklich der richtige Domänencontroller ausgewählt ist.
Ein ausgefallener Domänencontroller hinterlässt häufig veraltete DNS-Einträge. War der Domänencontroller gleichzeitig DNS-Server, können zusätzlich in Forward- und Reverse-Lookupzonen noch Nameserver-, SOA-, Delegierungs- oder Weiterleitungsverweise vorhanden sein.
Diese Einträge werden nach einer erzwungenen Entfernung des Domänencontrollers nicht immer vollständig automatisch gelöscht. Kontrollieren Sie deshalb:
_msdcsWichtig: Entfernen Sie ausschließlich Einträge, die eindeutig auf den ausgefallenen Domänencontroller beziehungsweise DNS-Server verweisen. Stellen Sie vor dem Entfernen von NS-Einträgen sicher, dass für jede betroffene DNS-Zone mindestens ein funktionierender autoritativer DNS-Server verbleibt.
Führen Sie die folgenden Arbeiten auf einem verbleibenden und funktionierenden DNS-Server beziehungsweise Domänencontroller aus.
Öffnen Sie eine administrative PowerShell-Sitzung und laden Sie das DNS-Server-Modul:
Import-Module DnsServer
Legen Sie anschließend den abzufragenden DNS-Server sowie die Daten des ausgefallenen Domänencontrollers fest:
$DnsServer = $env:COMPUTERNAME
$OldServerName = "DC-ALT"
$OldServerFqdn = "DC-ALT.contoso.local"
$OldServerIPv4 = "192.168.10.10"
Ersetzen Sie die Beispielwerte durch die tatsächlichen Daten:
$DnsServer bezeichnet den funktionierenden DNS-Server, auf dem die Bereinigung ausgeführt wird.$OldServerName bezeichnet den kurzen Namen des ausgefallenen Domänencontrollers.$OldServerFqdn bezeichnet dessen vollständigen DNS-Namen.$OldServerIPv4 bezeichnet dessen bisherige IPv4-Adresse.Soll die Bereinigung remote auf einem anderen DNS-Server erfolgen, tragen Sie dessen Namen explizit ein:
$DnsServer = "DC01.contoso.local"
Bereiten Sie den vollständigen Namen für zuverlässige Vergleiche vor:
$OldServerFqdnNormalized = $OldServerFqdn.TrimEnd(".").ToLowerInvariant()
Zeigen Sie zunächst die auf dem ausgewählten DNS-Server vorhandenen Zonen an:
Get-DnsServerZone -ComputerName $DnsServer |
Select-Object ZoneName, ZoneType, IsDsIntegrated, IsReverseLookupZone |
Sort-Object IsReverseLookupZone, ZoneName |
Format-Table -AutoSize
Prüfen Sie insbesondere:
_msdcs.<Gesamtstruktur-Stammdomäne>Erfassen Sie anschließend alle für die Suche geeigneten Zonen:
$Zones = Get-DnsServerZone -ComputerName $DnsServer |
Where-Object {
-not $_.IsAutoCreated -and
$_.ZoneName -notin @(
"TrustAnchors",
"..TrustAnchors"
)
}
Bei AD-integrierten Zonen genügt die Änderung normalerweise auf einem beschreibbaren DNS-Domänencontroller, auf dem die betreffende Zone verfügbar ist. Die Änderung wird anschließend über Active Directory repliziert.
Nicht AD-integrierte primäre Zonen müssen auf dem jeweils zuständigen primären DNS-Server bearbeitet werden. Sekundäre Zonen beziehen ihre Daten normalerweise über Zonentransfers und sollten nicht unabhängig manuell bereinigt werden.
War der ausgefallene Domänencontroller gleichzeitig DNS-Server, kann er in mehreren Zonen weiterhin als autoritativer Nameserver eingetragen sein. Im DNS-Manager werden diese Einträge in den Eigenschaften einer Zone auf der Registerkarte Nameserver angezeigt.
Durchsuchen Sie alle geeigneten Zonen nach NS-Einträgen, die auf den ausgefallenen Server verweisen:
$OldNsRecords = foreach ($Zone in $Zones) {
try {
$Records = Get-DnsServerResourceRecord `
-ComputerName $DnsServer `
-ZoneName $Zone.ZoneName `
-RRType NS `
-ErrorAction Stop
foreach ($Record in $Records) {
$NameServer = $Record.RecordData.NameServer.ToString().
TrimEnd(".").
ToLowerInvariant()
if ($NameServer -eq $OldServerFqdnNormalized) {
[PSCustomObject]@{
ZoneName = $Zone.ZoneName
ZoneType = $Zone.ZoneType
IsDsIntegrated = $Zone.IsDsIntegrated
IsReverseLookupZone = $Zone.IsReverseLookupZone
HostName = $Record.HostName
NameServer = $Record.RecordData.NameServer
RecordObject = $Record
}
}
}
}
catch {
Write-Warning (
"Zone '{0}' konnte nicht gelesen werden: {1}" -f
$Zone.ZoneName,
$_.Exception.Message
)
}
}
Zeigen Sie die gefundenen Einträge an:
$OldNsRecords |
Select-Object ZoneName,
ZoneType,
IsDsIntegrated,
IsReverseLookupZone,
HostName,
NameServer |
Sort-Object ZoneName, HostName |
Format-Table -AutoSize
Die Suche berücksichtigt:
Erstellen Sie vor der Entfernung ein Protokoll der gefundenen Einträge:
$LogDirectory = "C:\Temp"
$LogFile = Join-Path `
-Path $LogDirectory `
-ChildPath "DNS-NS-Bereinigung-$OldServerName.csv"
New-Item `
-Path $LogDirectory `
-ItemType Directory `
-Force |
Out-Null
$OldNsRecords |
Select-Object ZoneName,
ZoneType,
IsDsIntegrated,
IsReverseLookupZone,
HostName,
NameServer |
Export-Csv `
-Path $LogFile `
-NoTypeInformation `
-Encoding UTF8
Write-Host "Protokoll erstellt: $LogFile"
Prüfen Sie die CSV-Datei und die Bildschirmausgabe sorgfältig. Entfernt werden dürfen nur Einträge, deren NameServer eindeutig dem ausgefallenen Domänencontroller entspricht.
Ein leerer Export beziehungsweise eine leere Anzeige bedeutet, dass unter dem angegebenen vollständigen DNS-Namen keine passenden NS-Einträge gefunden wurden.
NS-Einträge können sich entweder am Stamm einer Zone oder an einem untergeordneten Knoten befinden. Ein Eintrag an einem untergeordneten Knoten kann Bestandteil einer DNS-Delegierung sein.
Beispiel:
Zone: contoso.local
Knoten: niederlassung
Nameserver: DC-ALT.contoso.local
Dieser Eintrag kann die folgende delegierte Zone betreffen:
niederlassung.contoso.local
Prüfen Sie Einträge, deren HostName nicht dem Zonenstamm entspricht, besonders sorgfältig.
Bei einer Delegierung können zwei Bestandteile vorhanden sein:
Ein Glue-Eintrag darf erst entfernt werden, wenn sichergestellt ist, dass er nicht mehr für eine weiterhin benötigte Delegierung verwendet wird.
Folgendes Script prüft welche Einträge bei Punkt 8.7 gelöscht werden.
# Erforderliche Variablen:
# $DnsServer
# $OldServerFqdn
# $OldServerFqdnNormalized
# $OldNsRecords
if (-not $OldServerFqdnNormalized) {
$OldServerFqdnNormalized = $OldServerFqdn.
TrimEnd(".").
ToLowerInvariant()
}
if (-not $OldNsRecords) {
Write-Warning "In `$OldNsRecords befinden sich keine NS-Eintraege."
return
}
$ValidOldNsRecords = @()
foreach ($Entry in $OldNsRecords) {
$CurrentNameServer = $Entry.RecordObject.RecordData.NameServer.
ToString().
TrimEnd(".").
ToLowerInvariant()
if ($CurrentNameServer -ne $OldServerFqdnNormalized) {
$WarningText = (
"Eintrag uebersprungen: NS-Ziel '{0}' entspricht nicht " +
"dem alten Server '{1}'."
) -f $Entry.NameServer, $OldServerFqdn
Write-Warning $WarningText
continue
}
$ValidOldNsRecords += $Entry
$PreviewText = (
"Vorschau: NS-Eintrag mit Ziel '{0}' am Knoten '{1}' " +
"in der Zone '{2}' auf DNS-Server '{3}' entfernen."
) -f (
$Entry.NameServer,
$Entry.HostName,
$Entry.ZoneName,
$DnsServer
)
Write-Host $PreviewText -ForegroundColor Yellow
}
Write-Host ""
if ($ValidOldNsRecords.Count -eq 0) {
$WarningText = (
"Es wurden keine NS-Eintraege gefunden, die eindeutig auf " +
"'{0}' verweisen."
) -f $OldServerFqdn
Write-Warning $WarningText
}
if ($ValidOldNsRecords.Count -gt 0) {
$ResultText = (
"{0} NS-Eintrag beziehungsweise NS-Eintraege wurden geprueft " +
"und fuer die Entfernung vorgemerkt."
) -f $ValidOldNsRecords.Count
Write-Host $ResultText -ForegroundColor Cyan
}
Kontrollieren Sie die Ausgabe vollständig. Durch die Verwendung von -InputObject wird genau das zuvor gefundene und geprüfte Datensatzobjekt angesprochen.
Ich habe zwei unterschiedliche Scripte hier niedergeschrieben, man kann Version B nutzen wenn man richtig mutig ist.
# Erforderliche Variablen:
# $DnsServer
# $OldServerFqdn
# $OldServerFqdnNormalized
# $OldNsRecords
if (-not $OldServerFqdnNormalized) {
$OldServerFqdnNormalized = $OldServerFqdn.
TrimEnd(".").
ToLowerInvariant()
}
if (-not $OldNsRecords) {
Write-Warning "In `$OldNsRecords befinden sich keine NS-Einträge."
return
}
$RemoveAllRemaining = $false
$RemovedCount = 0
$SkippedCount = 0
$ErrorCount = 0
foreach ($Entry in $OldNsRecords) {
$CurrentNameServer = $Entry.RecordObject.RecordData.NameServer.
ToString().
TrimEnd(".").
ToLowerInvariant()
# Sicherheitspruefung direkt vor der Entfernung
if ($CurrentNameServer -ne $OldServerFqdnNormalized) {
$WarningText = (
"Eintrag uebersprungen: NS-Ziel '{0}' entspricht nicht " +
"dem alten Server '{1}'."
) -f $Entry.NameServer, $OldServerFqdn
Write-Warning $WarningText
$SkippedCount++
continue
}
Write-Host ""
Write-Host "Zu entfernender DNS-Eintrag:" -ForegroundColor Yellow
Write-Host (" DNS-Server : {0}" -f $DnsServer)
Write-Host (" Zone : {0}" -f $Entry.ZoneName)
Write-Host (" Knoten : {0}" -f $Entry.HostName)
Write-Host " Record-Typ : NS"
Write-Host (" NS-Ziel : {0}" -f $Entry.NameServer)
Write-Host ""
$QuestionText = (
"NS-Eintrag mit Ziel '{0}' am Knoten '{1}' " +
"in der Zone '{2}' auf DNS-Server '{3}' entfernen?"
) -f (
$Entry.NameServer,
$Entry.HostName,
$Entry.ZoneName,
$DnsServer
)
Write-Host $QuestionText -ForegroundColor Cyan
if ($RemoveAllRemaining) {
$Answer = "A"
}
else {
do {
$Answer = Read-Host "[J] Ja, [N] Nein, [A] Alle, [Q] Abbrechen"
if ($null -ne $Answer) {
$Answer = $Answer.Trim().ToUpperInvariant()
}
}
until ($Answer -in @("J", "Y", "N", "A", "Q"))
}
if ($Answer -eq "Q") {
Write-Warning "Die DNS-Bereinigung wurde durch den Benutzer abgebrochen."
break
}
if ($Answer -eq "N") {
$SkippedText = (
"Uebersprungen: NS-Eintrag mit Ziel '{0}' am Knoten '{1}' " +
"in der Zone '{2}'."
) -f (
$Entry.NameServer,
$Entry.HostName,
$Entry.ZoneName
)
Write-Host $SkippedText -ForegroundColor DarkYellow
$SkippedCount++
continue
}
if ($Answer -eq "A") {
$RemoveAllRemaining = $true
}
try {
Remove-DnsServerResourceRecord `
-ComputerName $DnsServer `
-ZoneName $Entry.ZoneName `
-InputObject $Entry.RecordObject `
-Force `
-ErrorAction Stop
$SuccessText = (
"Entfernt: NS-Eintrag mit Ziel '{0}' am Knoten '{1}' " +
"in der Zone '{2}' auf DNS-Server '{3}'."
) -f (
$Entry.NameServer,
$Entry.HostName,
$Entry.ZoneName,
$DnsServer
)
Write-Host $SuccessText -ForegroundColor Green
$RemovedCount++
}
catch {
$ErrorText = (
"NS-Eintrag konnte nicht entfernt werden: " +
"Zone='{0}', Knoten='{1}', NS-Ziel='{2}', Fehler='{3}'"
) -f (
$Entry.ZoneName,
$Entry.HostName,
$Entry.NameServer,
$_.Exception.Message
)
Write-Warning $ErrorText
$ErrorCount++
}
}
Write-Host ""
Write-Host "Ergebnis der NS-Bereinigung:" -ForegroundColor Cyan
Write-Host (" Entfernt : {0}" -f $RemovedCount)
Write-Host (" Uebersprungen: {0}" -f $SkippedCount)
Write-Host (" Fehler : {0}" -f $ErrorCount)
# Erforderliche Variablen:
# $DnsServer
# $OldServerFqdn
# $OldServerFqdnNormalized
# $OldNsRecords
if (-not $OldServerFqdnNormalized) {
$OldServerFqdnNormalized = $OldServerFqdn.
TrimEnd(".").
ToLowerInvariant()
}
if (-not $OldNsRecords) {
Write-Warning "In `$OldNsRecords befinden sich keine NS-Einträge."
return
}
$RemovedCount = 0
$SkippedCount = 0
$ErrorCount = 0
foreach ($Entry in $OldNsRecords) {
$CurrentNameServer = $Entry.RecordObject.RecordData.NameServer.
ToString().
TrimEnd(".").
ToLowerInvariant()
# Sicherheitspruefung direkt vor der Entfernung
if ($CurrentNameServer -ne $OldServerFqdnNormalized) {
$WarningText = (
"Eintrag uebersprungen: NS-Ziel '{0}' entspricht nicht " +
"dem alten Server '{1}'."
) -f $Entry.NameServer, $OldServerFqdn
Write-Warning $WarningText
$SkippedCount++
continue
}
$ActionText = (
"Entferne NS-Eintrag mit Ziel '{0}' am Knoten '{1}' " +
"in der Zone '{2}' auf DNS-Server '{3}'."
) -f (
$Entry.NameServer,
$Entry.HostName,
$Entry.ZoneName,
$DnsServer
)
Write-Host $ActionText -ForegroundColor Yellow
try {
Remove-DnsServerResourceRecord `
-ComputerName $DnsServer `
-ZoneName $Entry.ZoneName `
-InputObject $Entry.RecordObject `
-Force `
-ErrorAction Stop
$SuccessText = (
"Erfolgreich entfernt: NS-Eintrag mit Ziel '{0}' " +
"aus Zone '{1}', Knoten '{2}'."
) -f (
$Entry.NameServer,
$Entry.ZoneName,
$Entry.HostName
)
Write-Host $SuccessText -ForegroundColor Green
$RemovedCount++
}
catch {
$ErrorText = (
"NS-Eintrag konnte nicht entfernt werden: " +
"Zone='{0}', Knoten='{1}', NS-Ziel='{2}', Fehler='{3}'"
) -f (
$Entry.ZoneName,
$Entry.HostName,
$Entry.NameServer,
$_.Exception.Message
)
Write-Warning $ErrorText
$ErrorCount++
}
}
Write-Host ""
Write-Host "Ergebnis der automatischen NS-Bereinigung:" -ForegroundColor Cyan
Write-Host (" Entfernt : {0}" -f $RemovedCount)
Write-Host (" Uebersprungen: {0}" -f $SkippedCount)
Write-Host (" Fehler : {0}" -f $ErrorCount)
Hinweis: Schlägt die Entfernung in einzelnen Zonen fehl, prüfen Sie, ob es sich um eine sekundäre, schreibgeschützte oder nicht lokal verwaltete Zone handelt. Führen Sie die Änderung in diesem Fall auf dem zuständigen primären beziehungsweise beschreibbaren DNS-Server aus.
Führen Sie nach der Entfernung die Suche erneut aus:
$RemainingOldNsRecords = foreach ($Zone in $Zones) {
try {
Get-DnsServerResourceRecord `
-ComputerName $DnsServer `
-ZoneName $Zone.ZoneName `
-RRType NS `
-ErrorAction Stop |
Where-Object {
$_.RecordData.NameServer.ToString().
TrimEnd(".").
ToLowerInvariant() -eq $OldServerFqdnNormalized
} |
Select-Object @{
Name = "ZoneName"
Expression = { $Zone.ZoneName }
}, HostName, @{
Name = "NameServer"
Expression = { $_.RecordData.NameServer }
}
}
catch {
Write-Warning (
"Zone '{0}' konnte nicht kontrolliert werden." -f
$Zone.ZoneName
)
}
}
$RemainingOldNsRecords |
Format-Table -AutoSize
Wenn keine Einträge mehr ausgegeben werden, wurden auf dem untersuchten DNS-Server keine NS-Einträge mehr gefunden, die auf den alten Server verweisen.
Zusätzlich zu den NS-Einträgen kann der ausgefallene DNS-Server noch im SOA-Eintrag einer Zone als primärer Server eingetragen sein.
Kontrollieren Sie die SOA-Einträge aller Zonen:
$SoaRecords = foreach ($Zone in $Zones) {
try {
Get-DnsServerResourceRecord `
-ComputerName $DnsServer `
-ZoneName $Zone.ZoneName `
-RRType SOA `
-ErrorAction Stop |
Select-Object @{
Name = "ZoneName"
Expression = { $Zone.ZoneName }
}, @{
Name = "ZoneType"
Expression = { $Zone.ZoneType }
}, @{
Name = "PrimaryServer"
Expression = { $_.RecordData.PrimaryServer }
}, @{
Name = "ResponsiblePerson"
Expression = { $_.RecordData.ResponsiblePerson }
}
}
catch {
Write-Warning (
"SOA-Eintrag der Zone '{0}' konnte nicht gelesen werden." -f
$Zone.ZoneName
)
}
}
$SoaRecords |
Sort-Object ZoneName |
Format-Table -AutoSize
Filtern Sie die Ausgabe bei Bedarf nach dem alten Server:
$SoaRecords |
Where-Object {
$_.PrimaryServer.ToString().
TrimEnd(".").
ToLowerInvariant() -eq $OldServerFqdnNormalized
} |
Format-Table -AutoSize
Wichtig: Löschen Sie keinen SOA-Eintrag. Jede DNS-Zone benötigt einen SOA-Eintrag. Ist dort noch der ausgefallene Server eingetragen, muss der Eintrag auf einen funktionierenden autoritativen DNS-Server geändert werden.
Bei AD-integrierten Zonen kann die SOA-Anzeige durch die Multi-Master-Replikation und die aktuell abgefragte DNS-Serverinstanz beeinflusst werden. Kontrollieren Sie einen verbliebenen Eintrag deshalb nach Möglichkeit auf mehreren DNS-Servern, bevor Sie ihn manuell ändern.
Öffnen Sie zur manuellen Kontrolle den DNS-Manager:
dnsmgmt.msc
Prüfen Sie sowohl die Forward-Lookupzonen als auch die Reverse-Lookupzonen.
Entfernen Sie veraltete Einträge des ausgefallenen Servers:
Suchen Sie sowohl nach dem kurzen Servernamen als auch nach dem vollständigen DNS-Namen:
DC-ALT
DC-ALT.contoso.local
Wenn dieselbe IP-Adresse inzwischen einem anderen System zugewiesen wurde, darf nicht allein anhand der IP-Adresse gelöscht werden. Prüfen Sie zusätzlich den Namen und den Verwendungszweck des Eintrags.
Prüfen Sie alle relevanten Reverse-Lookupzonen auf PTR-Einträge des ausgefallenen Domänencontrollers. Entfernen Sie nur Einträge, die eindeutig auf dessen vollständigen DNS-Namen verweisen:
DC-ALT.contoso.local
Berücksichtigen Sie:
in-addr.arpaip6.arpaDie NS-Bereinigung entfernt ausschließlich Nameserver-Einträge. PTR-Einträge müssen separat kontrolliert und entfernt werden.
Domänencontroller registrieren zahlreiche SRV-Einträge für LDAP, Kerberos, Kennwortänderungen, Global Catalog und standortbezogene Dienste.
Kontrollieren Sie insbesondere die Ordner:
_ldap
_kerberos
_kpasswd
_gc
_tcp
_udp
_sites
Diese befinden sich üblicherweise innerhalb der DNS-Zonen:
<Ihre-Domäne>
_msdcs.<Ihre-Gesamtstruktur>
Je nach Aufbau der DNS-Zonen können sich die Einträge unter anderem in folgenden Pfaden befinden:
_tcp.<Ihre-Domäne>
_udp.<Ihre-Domäne>
_sites.<Ihre-Domäne>
_tcp.dc._msdcs.<Ihre-Domäne>
_sites.dc._msdcs.<Ihre-Domäne>
_tcp.gc._msdcs.<Ihre-Gesamtstruktur>
_sites.gc._msdcs.<Ihre-Gesamtstruktur>
Entfernen Sie nur SRV-Einträge, deren Ziel eindeutig auf den ausgefallenen Domänencontroller verweist:
DC-ALT.contoso.local
Löschen Sie nicht pauschal vollständige Ordner wie _ldap, _kerberos, _tcp, _udp, _gc oder _sites. Diese enthalten normalerweise auch weiterhin benötigte Einträge der funktionierenden Domänencontroller.
_msdcs entfernenIn der folgenden Zone kann ein CNAME-Eintrag mit der DSA-GUID des alten Domänencontrollers vorhanden sein:
_msdcs.<Gesamtstruktur-Stammdomäne>
Der Eintrag hat ungefähr folgende Form:
<DSA-GUID>._msdcs.contoso.local
Er verweist auf:
DC-ALT.contoso.local
Wenn der CNAME-Eintrag eindeutig zum dauerhaft entfernten Domänencontroller gehört, sollte er entfernt werden.
Löschen Sie die GUID nicht allein anhand ihres Aussehens. Kontrollieren Sie immer das Ziel des CNAME-Eintrags und vergleichen Sie es mit dem vollständigen DNS-Namen des ausgefallenen Domänencontrollers.
Prüfen Sie in den übergeordneten DNS-Zonen vorhandene Delegierungen. Eine Delegierung kann weiterhin folgende Einträge enthalten:
Entfernen Sie veraltete Glue-Einträge erst, nachdem der dazugehörige NS-Eintrag entfernt oder auf einen funktionierenden DNS-Server geändert wurde.
Besondere Vorsicht ist erforderlich, wenn derselbe Hosteintrag noch von einer anderen funktionierenden Delegierung verwendet wird.
Öffnen Sie die Eigenschaften jeder besonders relevanten DNS-Zone und prüfen Sie die Registerkarte Nameserver.
Diese manuelle Kontrolle dient nach der automatisierten Bereinigung hauptsächlich der Verifikation. Prüfen Sie insbesondere:
_msdcs.<Gesamtstruktur-Stammdomäne>Der ausgefallene DNS-Server darf dort nicht mehr als autoritativer Nameserver angezeigt werden.
War der ausgefallene Domänencontroller auch DNS-Server, prüfen Sie zusätzlich:
Entfernen oder ersetzen Sie Verweise auf den ausgefallenen DNS-Server.
Achten Sie bei bedingten Weiterleitungen darauf, ob diese in Active Directory gespeichert und auf weitere DNS-Server repliziert werden. In diesem Fall sollte die Änderung auf einem beschreibbaren DNS-Domänencontroller vorgenommen und anschließend die Replikation kontrolliert werden.
Prüfen Sie, ob der ausgefallene DNS-Server noch per DHCP verteilt oder statisch verwendet wird.
Kontrollieren Sie insbesondere:
Aktuelle IPv4-DNS-Konfiguration anzeigen:
Get-DnsClientServerAddress -AddressFamily IPv4
Aktuelle IPv6-DNS-Konfiguration anzeigen:
Get-DnsClientServerAddress -AddressFamily IPv6
Kompakte Anzeige aller Schnittstellen mit konfigurierten DNS-Servern:
Get-DnsClientServerAddress |
Where-Object {
$_.ServerAddresses.Count -gt 0
} |
Select-Object InterfaceAlias, AddressFamily, ServerAddresses |
Format-Table -AutoSize
Kontrollieren Sie besonders die DNS-Clientkonfiguration der verbleibenden Domänencontroller. Dort darf die IP-Adresse des ausgefallenen DNS-Servers nicht mehr als bevorzugter oder alternativer DNS-Server eingetragen sein.
Wird die DNS-Serveradresse über DHCP verteilt, prüfen Sie mindestens die DHCP-Option 006 auf folgenden Ebenen:
Nach einer Änderung müssen Clients ihren DHCP-Lease gegebenenfalls erneuern:
ipconfig /release
ipconfig /renew
Vorsicht:
ipconfig /releasekann eine bestehende Remoteverbindung unterbrechen. Auf Servern mit statischer Netzwerkkonfiguration dürfen diese Befehle nicht verwendet werden.
Nach den Änderungen kann auf Windows-Systemen der lokale DNS-Cache geleert werden:
ipconfig /flushdns
Testen Sie anschließend, ob noch eine veraltete Namensauflösung vorhanden ist:
nslookup DC-ALT.contoso.local
Für einen vollständig entfernten Server sollte keine veraltete Namensauflösung mehr zurückgegeben werden, sofern der Name nicht bewusst anderweitig weiterverwendet wird.
Ein funktionierender Domänencontroller kann seine Hosteinträge erneut registrieren:
ipconfig /registerdns
Zusätzlich kann der Netlogon-Dienst neu gestartet werden, um die domänenspezifischen DNS-Einträge erneut zu registrieren:
Restart-Service Netlogon
Der Neustart des Netlogon-Dienstes sollte mit Bedacht und möglichst außerhalb kritischer Anmelde- oder Wartungsprozesse erfolgen.
Kontrollieren Sie nach der erneuten Registrierung die DNS-Einträge der verbleibenden Domänencontroller.
LDAP-Diensteinträge der Domäne abfragen:
nslookup -type=SRV _ldap._tcp.dc._msdcs.contoso.local
Globale Kataloge über die Gesamtstruktur-Stammdomäne abfragen:
nslookup -type=SRV _ldap._tcp.gc._msdcs.contoso.local
Kerberos-Diensteinträge kontrollieren:
nslookup -type=SRV _kerberos._tcp.contoso.local
Ersetzen Sie contoso.local durch den tatsächlichen DNS-Namen der Domäne beziehungsweise der Gesamtstruktur-Stammdomäne.
Die zurückgegebenen Einträge dürfen nicht mehr auf den ausgefallenen Domänencontroller verweisen.
Sind die DNS-Zonen Active-Directory-integriert, werden die Änderungen über Active Directory repliziert. Stoßen Sie die Replikation bei Bedarf auf einem verbleibenden Domänencontroller an:
repadmin /syncall /AdeP
Prüfen Sie anschließend die Replikationsübersicht:
repadmin /replsummary
Zeigen Sie bei Fehlern die detaillierten Replikationsverbindungen an:
repadmin /showrepl *
Führen Sie die NS-, SRV- und Hosteintragskontrolle anschließend stichprobenartig auf einem weiteren DNS-Domänencontroller aus.
Vermeiden Sie es, dieselben AD-integrierten DNS-Einträge unmittelbar und parallel auf allen DNS-Servern zu löschen. Nehmen Sie die Bereinigung zunächst auf einem beschreibbaren DNS-Domänencontroller vor und prüfen Sie anschließend die ordnungsgemäße Replikation.
Führen Sie auf einem verbleibenden Domänencontroller eine DNS-Diagnose aus:
dcdiag /test:dns /v
Für einen Gesamtüberblick über alle Domänencontroller der Gesamtstruktur:
dcdiag /test:dns /e /v
Die ausführliche Ausgabe kann in eine Datei geschrieben werden:
dcdiag /test:dns /e /v > C:\Temp\dcdiag-dns.txt
Prüfen Sie die Ausgabe insbesondere auf:
Suchen Sie abschließend auf den verbleibenden DNS-Servern nach:
Kontrollieren Sie mindestens folgende Bereiche:
Forward-Lookupzonen
Reverse-Lookupzonen
_msdcs.<Gesamtstruktur-Stammdomäne>
Delegierungen
Bedingte Weiterleitungen
Sekundäre Zonen
Stubzonen
Zonentransferkonfigurationen
DHCP-Optionen
Statische DNS-Clientkonfigurationen
Die DNS-Bereinigung ist abgeschlossen, wenn:
_msdcs entfernt wurde,dcdiag /test:dns keine durch den entfernten Server verursachten Fehler mehr meldet.Prüfen Sie in Active Directory-Benutzer und -Computer, ob das Computerkonto des alten Domänencontrollers vollständig entfernt wurde.
Mit PowerShell:
Get-ADComputer -Identity "DC01"
Wenn der Befehl meldet, dass das Objekt nicht gefunden wurde, ist das Computerkonto bereits entfernt.
Prüfen Sie zusätzlich, ob noch ein Domänencontrollerobjekt zurückgegeben wird:
Get-ADDomainController -Identity "DC01"
Ersetzen Sie DC01 durch den Namen des ausgefallenen Servers.
Stoßen Sie die Replikation auf den verbleibenden Domänencontrollern an:
repadmin /syncall /AdeP
Bedeutung der verwendeten Optionen:
/A: Alle Namenskontexte/d: Servernamen in den Meldungen anzeigen/e: Standortübergreifende Replikation einbeziehen/P: Änderungen nach außen übertragenPrüfen Sie danach erneut:
repadmin /replsummary
Und:
repadmin /showrepl *
Wenn nur noch ein Domänencontroller vorhanden ist, gibt es keinen Replikationspartner. In diesem Fall darf repadmin keine erfolgreiche Replikation zu einem zweiten Server erwarten lassen. Es sollten aber keine aktiven Verweise auf den entfernten Server bestehen bleiben.
Führen Sie nach der Bereinigung eine Gesamtprüfung aus:
dcdiag /e /c /v
DNS-Prüfung:
dcdiag /test:dns /e /v
Prüfung der SYSVOL- und Netlogon-Freigaben:
net share
Auf jedem verbleibenden Domänencontroller sollten mindestens die folgenden Freigaben vorhanden sein:
NETLOGON
SYSVOL
Prüfen Sie außerdem den SYSVOL-Replikationsstatus:
dcdiag /test:sysvolcheck /test:advertising
Öffnen Sie die Ereignisanzeige:
eventvwr.msc
Prüfen Sie insbesondere:
Achten Sie auf wiederkehrende Meldungen, die weiterhin den entfernten Domänencontroller, dessen GUID, dessen DNS-Namen oder seine IP-Adresse nennen.
Einzelne ältere Ereignisse sind nach der Bereinigung nicht automatisch problematisch. Entscheidend ist, ob neue Fehler weiterhin auftreten.
Wenn der ausgefallene Domänencontroller der PDC-Emulator oder die externe Zeitquelle war, muss die Zeitkonfiguration geprüft werden.
Aktuellen Status anzeigen:
w32tm /query /status
Konfiguration anzeigen:
w32tm /query /configuration
Quelle anzeigen:
w32tm /query /source
Der PDC-Emulator der Gesamtstruktur-Stammdomäne sollte gegen eine zuverlässige externe Zeitquelle synchronisieren. Andere Domänenmitglieder folgen normalerweise der Active-Directory-Zeithierarchie.
Falls der ausgefallene Server DHCP ausführte:
Autorisierte DHCP-Server können mit installiertem DHCP-PowerShell-Modul angezeigt werden:
Get-DhcpServerInDC
Einen nicht mehr existierenden DHCP-Server nur dann aus der Autorisierung entfernen, wenn Name und IP-Adresse eindeutig stimmen:
Remove-DhcpServerInDC -DnsName "DC01.contoso.local" -IPAddress 192.0.2.10
Ersetzen Sie Beispielname und Beispieladresse durch die tatsächlichen Werte.
Suchen Sie nach festen Verweisen auf den alten Server, zum Beispiel:
\\DC01\Freigabe
LDAP://DC01
DC01.contoso.local
192.0.2.10
Prüfen Sie insbesondere:
Verwenden Sie für Dienste möglichst den Domänennamen oder geeignete hochverfügbare Dienstnamen anstelle eines fest eingetragenen einzelnen Domänencontrollers.
War auf dem ausgefallenen Domänencontroller eine Active-Directory-Zertifizierungsstelle installiert, reicht die Domänencontroller-Metadatenbereinigung nicht aus.
In diesem Fall müssen zusätzlich berücksichtigt werden:
Löschen Sie CA-Objekte nicht pauschal, wenn noch ausgestellte Zertifikate verwendet oder geprüft werden müssen.
Nach einer erzwungenen Entfernung und Metadatenbereinigung gilt:
Wenn die Hardware oder virtuelle Maschine wiederverwendet werden soll:
Wenn die Metadatenbereinigung bereits durchgeführt oder FSMO-Rollen erzwungen übernommen wurden, darf der alte Domänencontroller nicht normal wieder in Betrieb genommen werden.
Die sichere Vorgehensweise ist:
Die Bereinigung ist erfolgreich, wenn alle folgenden Punkte erfüllt sind:
Get-ADDomainController -Filter * zeigt ihn nicht mehr an.netdom query fsmo zeigt nur erreichbare FSMO-Rolleninhaber.dcdiag meldet keine aktuellen kritischen Fehler bezüglich des entfernten Servers.# Vorhandene Domänencontroller
Get-ADDomainController -Filter * |
Select-Object HostName, Site, IPv4Address, IsGlobalCatalog, OperationMasterRoles
# FSMO-Rollen
Get-ADDomain | Select-Object PDCEmulator, RIDMaster, InfrastructureMaster
Get-ADForest | Select-Object SchemaMaster, DomainNamingMaster
# Beispiel: Erzwungene Übernahme aller FSMO-Rollen
Move-ADDirectoryServerOperationMasterRole `
-Identity "DC02" `
-OperationMasterRole SchemaMaster,DomainNamingMaster,PDCEmulator,RIDMaster,InfrastructureMaster `
-Force
# Kontrolle auf ein altes Computerobjekt
Get-ADComputer -Identity "DC01"
# Kontrolle auf ein altes Domänencontrollerobjekt
Get-ADDomainController -Identity "DC01"
# DNS-Konfiguration
Get-DnsClientServerAddress -AddressFamily IPv4
netdom query fsmo
repadmin /replsummary
repadmin /showrepl *
repadmin /syncall /AdeP
dcdiag /e /c /v
dcdiag /test:dns /e /v
dcdiag /test:sysvolcheck /test:advertising
ipconfig /flushdns
ipconfig /registerdns
w32tm /query /status
w32tm /query /source
ntdsutil zur Metadatenbereinigung verwenden.repadmin, dcdiag, DNS und Ereignisprotokolle kontrollieren.