Notes
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Note
Cet article décrit un problème résolu dans les correctifs logiciels suivants pour Windows Server 2019 et versions ultérieures :
Cet article vous aide à résoudre un problème dans lequel les ID d’événement 4016 et 4004 sont connectés au système DNS (Domain Name System) lorsque les mises à jour DNS du protocole LDAP (Lightweight Directory Access Protocol) vers Active Directory (AD) expirent.
Dans les zones DNS intégrées à AD hébergées sur des contrôleurs de domaine (Windows Server 2012 R2 ou versions ultérieures), DNS ne peut pas énumérer les zones ou échouer par intermittence à créer ou écrire des enregistrements. En outre, les ID d’événement 4016 et 4004 sont enregistrés dans le journal des événements DNS :
ID d’événement 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 d’événement 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 les ID d’événement 4016 et 4004 sont enregistrés, les enregistrements DNS sont mis à jour sur d’autres contrôleurs de domaine et visibles dans ADSI Edit (adsiedit.msc). Toutefois, les enregistrements ne peuvent pas être écrits et les mises à jour DNS s’arrêtent tant que le service serveur DNS n’est pas redémarré. Pendant cette période, les enregistrements peuvent être créés en même temps à l’aide d’ADSI Edit sur les contrôleurs de domaine problématiques. Ces enregistrements sont ensuite répliqués sur tous les contrôleurs de domaine, ce qui signifie que l’AD fonctionne correctement. L’utilisation de la mémoire du processus de dns.exe est faible. Pendant ce temps, l’utilisation du processeur et de la mémoire sur les contrôleurs de domaine est également faible, mais elles restent sans réponse.
En vérifiant les journaux d’audit DNS, les journaux d’événements et les captures de paquets, les mises à jour DNS s’arrêtent sur le serveur même si les requêtes DNS sont rapidement résolues. En outre, les 0x55 d’erreur sont journalisées.
Redémarrer le service serveur DNS et supprimer le cache de tickets Kerberos
Pour contourner ce problème, redémarrez le service serveur DNS après la suppression du cache de tickets Kerberos à l’aide d’un script Windows PowerShell. Consultez le script suivant pour obtenir un exemple :
Note
Étant donné que la valeur par défaut $EventIntervalMinutes
et $NumberOfEvents
les valeurs peuvent ne pas être optimales, ajustez les valeurs en conséquence.
#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
}
}