Udostępnij za pośrednictwem


Identyfikatory zdarzeń 4016 i 4004, gdy upłynął limit czasu aktualizacji DNS

Ten artykuł pomaga rozwiązać problem, w którym identyfikatory zdarzeń 4016 i 4004 są rejestrowane w systemie nazw domen (DNS), gdy aktualizacje DNS z protokołu LDAP (Lightweight Directory Access Protocol) do usługi Active Directory (AD) upłynął.

W strefach DNS zintegrowanych z usługami AD, które są hostowane na kontrolerach domeny (Windows Server 2012 R2 lub nowszych wersjach), system DNS nie może wyliczać stref lub sporadycznie nie można tworzyć ani zapisywać rekordów. Ponadto identyfikatory zdarzeń 4016 i 4004 są rejestrowane w dzienniku zdarzeń DNS:

  • Identyfikator zdarzenia 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.
    
  • Identyfikator zdarzenia 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.
    

Jeśli są rejestrowane identyfikatory zdarzeń 4016 i 4004, rekordy DNS są aktualizowane na innych kontrolerach domeny i widoczne w funkcji ADSI Edit (adsiedit.msc). Rekordy nie mogą być jednak zapisywane, a aktualizacje DNS zostaną zatrzymane do momentu ponownego uruchomienia usługi serwera DNS. W tym okresie rekordy można tworzyć jednocześnie przy użyciu funkcji ADSI Edit na problematycznych kontrolerach domeny. Te rekordy są następnie replikowane do wszystkich kontrolerów domeny, co oznacza, że usługa AD działa prawidłowo. Użycie pamięci procesu dns.exe jest niskie. Tymczasem użycie procesora CPU i pamięci na kontrolerach domeny jest również niskie, ale pozostają one nieodpowiadalne.

Sprawdzając dzienniki inspekcji DNS, dzienniki zdarzeń i przechwytywanie pakietów, aktualizacje DNS są zatrzymywane na serwerze, mimo że zapytania DNS są szybko reagować. Ponadto rejestrowany jest błąd 0x55.

Uruchom ponownie usługę serwera DNS i usuń pamięć podręczną biletów Protokołu Kerberos

Aby obejść ten problem, uruchom ponownie usługę serwera DNS po usunięciu pamięci podręcznej biletów Protokołu Kerberos przy użyciu skryptu programu Windows PowerShell. Zobacz następujący skrypt, aby zapoznać się z przykładem:

Uwaga 16.

Ponieważ wartości domyślne $EventIntervalMinutes i $NumberOfEvents mogą nie być optymalne, odpowiednio dostosuj wartości.

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