Compartir a través de


Identificadores de evento 4016 y 4004 cuando se agota el tiempo de espera de las actualizaciones de DNS

Este artículo ayuda a resolver un problema en el que los identificadores de evento 4016 y 4004 se registran en el sistema de nombres de dominio (DNS) cuando se agota el tiempo de espera de DNS del Protocolo ligero de acceso a directorios (LDAP) a Active Directory (AD).

En las zonas DNS integradas en AD hospedadas en controladores de dominio (Windows Server 2012 R2 o versiones posteriores), DNS no puede enumerar las zonas o no puede crear o escribir registros de forma intermitente. Además, los identificadores de evento 4016 y 4004 se registran en el registro de eventos DNS:

  • Id. de evento 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.
    
  • Id. de evento 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.
    

Si se registran los identificadores de evento 4016 y 4004, los registros DNS se actualizan en otros controladores de dominio y se ven en ADSI Edit (adsiedit.msc). Sin embargo, los registros no se pueden escribir y las actualizaciones dns se detienen hasta que se reinicia el servicio servidor DNS. Durante este período, los registros se pueden crear al mismo tiempo mediante ADSI Edit en los controladores de dominio problemáticos. Estos registros se replican en todos los controladores de dominio, lo que significa que AD funciona correctamente. El uso de memoria del proceso de dns.exe es bajo. Mientras tanto, el uso de CPU y memoria en los controladores de dominio también es bajo, pero siguen sin responder.

Al comprobar los registros de auditoría de DNS, los registros de eventos y las capturas de paquetes, las actualizaciones de DNS se detienen en el servidor aunque las consultas DNS se respondan rápidamente. Además, se registra la 0x55 de error.

Reinicio del servicio servidor DNS y eliminación de la caché de vales kerberos

Para solucionar este problema, reinicie el servicio servidor DNS después de eliminar la caché de vales kerberos mediante un script de Windows PowerShell. Consulte el siguiente script para obtener un ejemplo:

Nota:

Dado que es posible que los valores predeterminados $EventIntervalMinutes y $NumberOfEvents no sean óptimos, ajuste los valores en consecuencia.

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