Delen via


Gebeurtenis-id's 4016 en 4004 wanneer er een time-out optreedt voor DNS-updates

Notitie

In dit artikel wordt een probleem beschreven dat is opgelost in de volgende hotfixes voor Windows Server 2019 en latere versies:

Dit artikel helpt bij het oplossen van een probleem waarbij gebeurtenis-id's 4016 en 4004 worden geregistreerd in het DNS (Domain Name System) wanneer er een time-out optreedt voor DNS-updates van ldap (Lightweight Directory Access Protocol) naar Active Directory (AD).

In ad-geïntegreerde DNS-zones die worden gehost op domeincontrollers (Windows Server 2012 R2 of latere versies), kan DNS de zones niet inventariseren of af en toe geen records maken of schrijven. Daarnaast worden gebeurtenis-id's 4016 en 4004 vastgelegd in het DNS-gebeurtenislogboek:

  • Gebeurtenis-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.
    
  • Gebeurtenis-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.
    

Als gebeurtenis-id's 4016 en 4004 worden geregistreerd, worden de DNS-records bijgewerkt op andere domeincontrollers en zichtbaar in ADSI Edit (adsiedit.msc). De records kunnen echter niet worden geschreven en de DNS-updates stoppen totdat de DNS Server-service opnieuw wordt opgestart. Gedurende deze periode kunnen records tegelijkertijd worden gemaakt met ADSI Edit op de problematische domeincontrollers. Deze records worden vervolgens gerepliceerd naar alle domeincontrollers, wat betekent dat de AD correct werkt. Het geheugengebruik van het dns.exe proces is laag. Ondertussen is het CPU- en geheugengebruik op domeincontrollers ook laag, maar blijven ze niet reageren.

Door de DNS-auditlogboeken, gebeurtenislogboeken en pakketopnamen te controleren, stoppen DNS-updates op de server, ook al worden DNS-query's snel beantwoord. Bovendien wordt fout 0x55 geregistreerd.

Start de DNS Server-service opnieuw op en verwijder de Kerberos-ticketcache

U kunt dit probleem omzeilen door de DNS-serverservice opnieuw te starten nadat u de Kerberos-ticketcache hebt gewist met behulp van een Windows PowerShell-script. Zie het volgende script voor een voorbeeld:

Notitie

Omdat de standaardwaarden $EventIntervalMinutes en $NumberOfEvents waarden mogelijk niet optimaal zijn, past u de waarden dienovereenkomstig aan.

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