Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Nota:
En este artículo se describe un problema que se ha corregido en las siguientes revisiones para Windows Server 2019 y versiones posteriores:
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
}
}