Condividi tramite


ID evento 4016 e 4004 quando si verifica il timeout degli aggiornamenti DNS

Questo articolo consente di risolvere un problema in cui gli ID evento 4016 e 4004 vengono registrati nel dns (Domain Name System) quando si verifica il timeout degli aggiornamenti DNS da Lightweight Directory Access Protocol (LDAP) ad Active Directory (AD).

Nelle zone DNS integrate di Active Directory ospitate nei controller di dominio (Windows Server 2012 R2 o versioni successive), DNS non può enumerare le zone o non creare o scrivere record in modo intermittente. Inoltre, gli ID evento 4016 e 4004 vengono registrati nel registro eventi DNS:

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

Se gli ID evento 4016 e 4004 vengono registrati, i record DNS vengono aggiornati in altri controller di dominio e visibili in ADSI Edit (adsiedit.msc). Tuttavia, i record non possono essere scritti e gli aggiornamenti DNS vengono arrestati fino al riavvio del servizio server DNS. Durante questo periodo, i record possono essere creati contemporaneamente usando ADSI Edit nei controller di dominio problematici. Questi record vengono quindi replicati in tutti i controller di dominio, il che significa che Ad funziona correttamente. L'utilizzo della memoria del processo di dns.exe è basso. Nel frattempo, anche l'utilizzo della CPU e della memoria nei controller di dominio è basso, ma rimangono non rispondenti.

Controllando i log di controllo DNS, i registri eventi e le acquisizioni di pacchetti, gli aggiornamenti DNS si arrestano sul server anche se le query DNS vengono risposte rapidamente. Viene inoltre registrato l'errore 0x55.

Riavviare il servizio server DNS ed eliminare la cache dei ticket Kerberos

Per risolvere questo problema, riavviare il servizio server DNS dopo aver eliminato la cache dei ticket Kerberos usando uno script di Windows PowerShell. Per un esempio, vedere lo script seguente:

Note

Poiché i valori predefiniti $EventIntervalMinutes e $NumberOfEvents potrebbero non essere ottimali, modificare i valori di conseguenza.

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