Freigeben über


Ereignis-IDs 4016 und 4004, wenn DNS-Updates timeout

Notiz

In diesem Artikel wird ein Problem beschrieben, das in den folgenden Hotfixes für Windows Server 2019 und neuere Versionen behoben wurde:

Dieser Artikel hilft bei der Behebung eines Problems, bei dem Ereignis-IDs 4016 und 4004 im Domain Name System (DNS) protokolliert werden, wenn DNS-Updates vom Lightweight Directory Access Protocol (LDAP) auf active Directory (AD) timeout ausgeführt werden.

In AD-integrierten DNS-Zonen, die auf Domänencontrollern (Windows Server 2012 R2 oder höher) gehostet werden, kann DNS die Zonen nicht aufzählen oder zeitweise keine Datensätze erstellen oder schreiben. Darüber hinaus werden Ereignis-IDs 4016 und 4004 im DNS-Ereignisprotokoll protokolliert:

  • Ereignis-ID 4016

      LogName:       DNS Server
      Source:        Microsoft-Windows-DNS-Server-Service
      Date:          <DateTime>
      Event ID:      4016
      Task Category:
      Level:         Error
      User:          S-1-5-18
      Computer:      Contoso.com
      Description:
      The DNS server timed out attempting an Active Directory service operation on DC=xx.x,DC=xxx.xx.in-addr.arpa,cn=MicrosoftDNS,DC=ForestDnsZones,DC=xxx,DC=com. Check Active Directory to see that it is functioning properly. The event data contains the error.
    
  • Ereignis-ID 4004

      LogName:       DNS Server
      Source:        Microsoft-Windows-DNS-Server-Service
      Date:          <DateTime>
      Event ID:      4004
      Task Category:
      Level:         Error
      User:          S-1-5-18
      Computer:      Contoso.com
      Description:
      The DNS server was unable to complete directory service enumeration of zone xx.xxx.xx.in-addr.arpa.  This DNS server is configured to use information obtained from Active Directory for this zone and is unable to load the zone without it. Check that the Active Directory is functioning properly and repeat enumeration of the zone. The extended error debug information (which may be empty) is "". The event data contains the error.
    

Wenn Ereignis-IDs 4016 und 4004 protokolliert werden, werden die DNS-Einträge auf anderen Domänencontrollern aktualisiert und in ADSI Edit (adsiedit.msc) angezeigt. Die Einträge können jedoch nicht geschrieben werden, und die DNS-Updates werden erst beendet, wenn der DNS-Serverdienst neu gestartet wird. Während dieses Zeitraums können Datensätze gleichzeitig mithilfe von ADSI Edit auf den problematischen Domänencontrollern erstellt werden. Diese Einträge werden dann auf alle Domänencontroller repliziert, was bedeutet, dass ad ordnungsgemäß funktioniert. Die Speicherauslastung des dns.exe Prozesses ist gering. Unterdessen ist die CPU- und Speicherauslastung auf Domänencontrollern ebenfalls niedrig, sie reagieren jedoch nicht mehr.

Durch Überprüfen der DNS-Überwachungsprotokolle, Ereignisprotokolle und Paketerfassungen beenden DNS-Updates auf dem Server, obwohl DNS-Abfragen schnell beantwortet werden. Darüber hinaus wird fehler 0x55 protokolliert.

Starten Sie den DNS-Serverdienst neu, und löschen Sie den Kerberos-Ticketcache.

Um dieses Problem zu umgehen, starten Sie den DNS-Serverdienst neu, nachdem Sie den Kerberos-Ticketcache mithilfe eines Windows PowerShell-Skripts gelöscht haben. Ein Beispiel finden Sie im folgenden Skript:

Notiz

Da die Standardwerte $EventIntervalMinutes und $NumberOfEvents Werte möglicherweise nicht optimal sind, passen Sie die Werte entsprechend an.

    #NOTE: 
# The following two parameters should be adjusted according to your environment.
# The current values are only defaults and may not be optimal for you.

# How long to wait to ensure the 4016 event occurs consistently (that is, not one-offs)
[int]$EventIntervalMinutes=3

# Number of events within $EventIntervalMinutes to indicate we're in an error state
[int]$NumberOfEvents=10

# Monitor forever
while ($True)
{
	# Detect $NumberOfEvents for 4016 or 4011 occurred in the past $EventIntervalMinutes.
	$EntryType = @("Error","Warning")
	$Events = Get-EventLog -LogName 'DNS Server' -After ((get-date).AddMinutes(-$($EventIntervalMinutes))) -EntryType $EntryType

	[int]$NumEvents=0
	[int]$ErrorStateFound=0
	foreach($Event in $Events)
	{
		 if(($Event.InstanceId -eq "4016") -or ($Event.InstanceId -eq "4011"))
		 {
		   $NumEvents += 1;
		 }
	}

	if($NumEvents -ge $NumberOfEvents)
	{
		$ErrorStateFound=1
		"Detected DNS Event ID 4016 and/or 4011 within the past '$($EventIntervalMinutes)' minutes.  Take mitigation actions."  *>> C:\temp\dnsResetLog.txt

		# Stop DNS
		"`n`nStop DNS at $(Get-Date)" *>> C:\temp\dnsResetLog.txt
		Stop-Service DNS -Force *>> C:\temp\dnsResetLog.txt

		do { Start-Sleep 1 } until ((Get-Service DNS).Status -ne "Running")

		# Purge tickets 
		"`nPurge system tickets at $(Get-Date)" *>> C:\temp\dnsResetLog.txt
		klist purge -li 0x3e7 *>> C:\temp\dnsResetLog.txt

		# Start DNS
		"`nStart DNS at $(Get-Date)" *>> C:\temp\dnsResetLog.txt
		Start-Service DNS *>> C:\temp\dnsResetLog.txt

		# Record DNS Server process details to a file
		Get-Process dns | Select-Object Name, Id, StartTime | Format-List | Out-String *>> C:\temp\dnsResetLog.txt

		"`nEnd at $(Get-Date)" *>> C:\temp\dnsResetLog.txt
	}

	if ($ErrorStateFound)
	{
		# Don't loop again until waiting long enough to ensure no new events after restarting the service
		# Otherwise, we'll keep restarting!
		"`n`Sleeping for ($EventIntervalMinutes+1) minutes" *>> C:\temp\dnsResetLog.txt
		Start-Sleep -seconds (60*($EventIntervalMinutes+1))
		"`n`n Starting new monitoring cycle at $(Get-Date)" *>> C:\temp\dnsResetLog.txt
	}
	else{
		# Give a 1-minute pause before checking again
		Start-Sleep -seconds 60
	}
}