A failed Kerberos request in Active Directory leaves a hex code behind: a Result Code in event 4768, a Failure Code in 4769 or 4771, or a KDC_ERR or KRB_AP_ERR name in a System log event. This quick reference decodes the codes Microsoft documents for those events, adds the KDC events behind the recent RC4 and certificate-mapping hardening, and gives the usual cause and the first check for each.
Codes in this quick reference
0x6 KDC_ERR_C_PRINCIPAL_UNKNOWN: client not found in Kerberos database (user name doesn't exist)Security log (4768 / 4771), domain controller0x12 KDC_ERR_CLIENT_REVOKED: account disabled, expired or locked outSecurity log (4768 / 4771), domain controller0x17 KDC_ERR_KEY_EXPIRED: password has expiredSecurity log (4771), domain controller0x18 KDC_ERR_PREAUTH_FAILED: pre-authentication information was invalid (wrong password)Security log (4771), domain controller0x19 KDC_ERR_PREAUTH_REQUIRED: additional pre-authentication required (usually expected)Security log / Kerberos event logging0xC KDC_ERR_POLICY: KDC policy rejects request (logon restrictions)Security log (4768 / 4769), domain controller0x9 KDC_ERR_NULL_KEY: the client or server has a null keySecurity log (4768 / 4769), domain controller0x10 KDC_ERR_PADATA_TYPE_NOSUPP: smart card logon, DC certificate or CA problemSecurity log (4771), domain controller
+ 37 more codes in the tables below.
Status (October 2026): Microsoft's RC4 hardening for CVE-2026-20833 (KB5073381) has reached its final phase: updates from January 13, 2026 added KDCSVC audit events 201 to 209, updates from April 14, 2026 made AES-SHA1 only (0x18) the KDC default for accounts without msDS-SupportedEncryptionTypes, and updates released in or after July 2026 remove the RC4DefaultDisablementPhase rollback value. Separately, since the September 9, 2025 updates, domain controllers can no longer be moved back to Compatibility mode for certificate mapping (KB5014754). Both articles are updated over time, so re-check them.
How to read these codes#
| Event | Logged | Code field and notes |
|---|---|---|
| 4768 A Kerberos authentication ticket (TGT) was requested | Domain controllers, Security log; Audit Kerberos Authentication Service | Result Code; anything but 0x0 is a failure. Codes 0x10 and 0x18 never appear here: they produce 4771 instead |
| 4769 A Kerberos service ticket was requested | Domain controllers, Security log; Audit Kerberos Service Ticket Operations | Failure Code. Many 0x20 failures are routine expired tickets. Some failures are only logged when the KDC's KdcExtraLogLevel value includes 0x01 (unknown SPN) or 0x10 (encryption type and bad options) |
| 4771 Kerberos pre-authentication failed | Domain controllers, Security log; Audit Kerberos Authentication Service | Failure Code; not logged for accounts set to "Do not require Kerberos preauthentication" |
| Security-Kerberos events 3 and 4 | System log on the client or server | Event 3 carries the error code once Kerberos logging is on; event 4 reports KRB_AP_ERR_MODIFIED |
| Kdcsvc events 39 and 201 to 209 | System log on domain controllers | Certificate mapping (39) and RC4 hardening (201 to 209) |
On Windows Server 2016 and later with the January 14, 2025 or later cumulative update, 4768 and 4769 also show the account's, service's and DC's msDS-SupportedEncryptionTypes, their available keys, the client's advertised encryption types and the session key type, which makes encryption failures easy to read. The Client Address field tells you which machine sent the request. To pull recent failures from a DC:
Get-WinEvent -FilterHashtable @{LogName='Security'; Id=4768,4769,4771} -MaxEvents 2000 |
ForEach-Object {
$d = @{}
([xml]$_.ToXml()).Event.EventData.Data | ForEach-Object { $d[$_.Name] = $_.'#text' }
[pscustomobject]@{ Time = $_.TimeCreated; Event = $_.Id; Account = $d.TargetUserName
Service = $d.ServiceName; Client = $d.IpAddress; Code = $d.Status }
} | Where-Object Code -ne '0x0' | Format-Table -AutoSizeOn a client or member server, set LogLevel (REG_DWORD) to 1 under HKLM\SYSTEM\CurrentControlSet\Control\Lsa\Kerberos\Parameters; errors then appear in the System log. Remove the value afterwards: it also logs expected errors such as KDC_ERR_PREAUTH_REQUIRED (see Enable Kerberos event logging).
Account, password and pre-authentication#
| Code | Meaning | Usual cause | First check |
|---|---|---|---|
0x6 KDC_ERR_C_PRINCIPAL_UNKNOWN | Client not found in Kerberos database | The user name doesn't exist: typo, deleted account, wrong domain. Bursts can mean account enumeration | The name and Client Address in the event |
0x12 KDC_ERR_CLIENT_REVOKED | Client's credentials have been revoked | Account disabled, expired or locked out | Get-ADUser alex -Properties Enabled, LockedOut, AccountExpirationDate |
0x17 KDC_ERR_KEY_EXPIRED | Password has expired | The user's password expired (logged in 4771) | Change it; for a service account, update every place it's stored |
0x18 KDC_ERR_PREAUTH_FAILED | Pre-authentication information was invalid | Wrong password (4771 only); counts toward lockout, and bursts suggest password guessing | Client Address shows the sender; see tracing lockouts |
0x19 KDC_ERR_PREAUTH_REQUIRED | Additional pre-authentication required | Normal: Windows clients send the first request without pre-authentication. Also MIT Kerberos clients | Ignore unless a non-Windows client doesn't retry |
0xC KDC_ERR_POLICY | KDC policy rejects request | Logon restrictions: allowed workstations, smart card required, logon hours | The account's Log On To, logon hours and smart card settings |
0x9 KDC_ERR_NULL_KEY | The client or server has a null key | No key found for the account | Reset the account's password |
0x10 KDC_ERR_PADATA_TYPE_NOSUPP | No support for the pre-authentication data type | Smart card logon (4771): the DC has no Domain Controller or Domain Controller Authentication certificate, or the CA can't be reached | The DC's certificate and CA availability |
Services and SPNs#
| Code | Meaning | Usual cause | First check |
|---|---|---|---|
0x7 KDC_ERR_S_PRINCIPAL_UNKNOWN | Server not found in Kerberos database | No account holds the requested SPN; the client falls back to NTLM where allowed. Connecting to a share by IP address (cifs/<IP>) causes it routinely | setspn -Q HTTP/app.contoso.com; register the SPN on the account that runs the service |
0x8 KDC_ERR_PRINCIPAL_NOT_UNIQUE | Multiple principal entries in KDC database | Duplicate SPN on two accounts | setspn -X -F, then setspn -D on the wrong account |
0x1B KDC_ERR_MUST_USE_USER2USER | Server principal valid for user2user only | Microsoft notes the service is missing an SPN | Register the SPN |
0xD KDC_ERR_BADOPTION | KDC cannot accommodate requested option | TGT about to expire, or the SPN isn't in the front-end account's allowed-to-delegate-to list. Clients also retry with other options | The front-end account's msDS-AllowedToDelegateTo |
0x29 KRB_AP_ERR_MODIFIED | Message stream modified | Ticket encrypted with the wrong key: SPN on the wrong account, password mismatch, or DNS sending the client to the wrong server | setspn -Q for the SPN, then check the name resolves to the server running under that account |
0x2C KRB_AP_ERR_BADKEYVER / 0x2D KRB_AP_ERR_NOKEY | Key version / service key not available | The server no longer has the key version the ticket used, or has no key for that realm | Recent password changes on the service account; re-export keytabs on non-Windows services |
0x24 KRB_AP_ERR_BADMATCH | Ticket and authenticator don't match | Request sent to the wrong KDC, or an account mismatch during protocol transition | Delegation (protocol transition) settings |
0x23 KRB_AP_ERR_NOT_US | The ticket isn't for us | The server got a ticket meant for another realm | Realm and SPN mapping across trusts |
0x44 KDC_ERR_WRONG_REALM | Incorrect domain or principal | A cross-realm TGT presented to the wrong realm, typically from DNS misconfiguration | DNS and trust routing between the domains |
The client-side twin of 0x29 is System log event 4: The Kerberos client received a KRB_AP_ERR_MODIFIED error from the server. The Exchange alternate service account guide shows the classic load-balancer case.
Encryption types and RC4#
| Code or event | Meaning | Usual cause | First check |
|---|---|---|---|
0xE KDC_ERR_ETYPE_NOTSUPP | KDC has no support for encryption type | No encryption type in common, for example RC4 or DES removed on one side, or an account without AES keys | Advertised types, msDS-SupportedEncryptionTypes and available keys in the updated 4768/4769 |
0xF KDC_ERR_SUMTYPE_NOSUPP | KDC has no support for checksum type | A party lacks a key of the needed encryption type | As for 0xE |
Kdcsvc 201 / 203 | ... client only supports insecure encryption types (201 warns; 203 blocked) | The client advertises only RC4 and the service has no msDS-SupportedEncryptionTypes | Update or replace the client, or explicitly allow RC4 on that service account |
Kdcsvc 202 / 204 | ... the service account only has insecure keys (202 warns; 204 blocked) | The service account has no AES keys | Reset its password so AES keys are generated |
Kdcsvc 205 | The Key Distribution Center detected explicit cipher enablement in the Default Domain Supported Encryption Types policy configuration. | The DC's DefaultDomainSupportedEncTypes includes more than AES-SHA1; logged at KDC start, never becomes an error | Remove insecure ciphers from that value once nothing depends on them |
Kdcsvc 206 / 208 | Service set to AES-SHA1 only, but the client doesn't advertise AES-SHA1 (208: denied) | An RC4-only client against an AES-only service or DC default | Update the client |
Kdcsvc 207 / 209 | Service set to AES-SHA1 only, but the account has no AES-SHA1 keys (209: denied) | AES-only configuration on an account whose password predates AES keys | Reset the account's password |
The warning events (201, 202, 206, 207) were logged during audit mode; under enforcement you see their blocking counterparts (203, 204, 208, 209). AES keys are created when a password is set, so an old service account password is the most common reason for "insecure keys":
Get-ADUser svc-app -Properties msDS-SupportedEncryptionTypes, PasswordLastSet
# AES only (reset the password first if it predates AES keys):
Set-ADUser svc-app -Replace @{'msDS-SupportedEncryptionTypes' = 0x18}
# A device that can't do AES and can't be fixed by its vendor: RC4 with AES session keys, this account only
Set-ADUser svc-app -Replace @{'msDS-SupportedEncryptionTypes' = 0x24}Use Set-ADComputer or Set-ADServiceAccount for computer accounts and gMSAs. Microsoft's Detect and remediate RC4 usage in Kerberos covers the wider clean-up.
Time, replay and transport#
| Code | Meaning | Usual cause | First check |
|---|---|---|---|
0x25 KRB_AP_ERR_SKEW | The clock skew is too great | Clocks differ by more than "Maximum tolerance for computer clock synchronization" (5 minutes by default) | w32tm /query /source, w32tm /stripchart /computer:DC01 /samples:3 /dataonly |
0x21 KRB_AP_ERR_TKT_NYV | The ticket is not yet valid | KDC and client clocks out of sync; across realms, check both KDCs | Same time checks |
0xA KDC_ERR_CANNOT_POSTDATE / 0xB KDC_ERR_NEVER_VALID | Not eligible for postdating / start time later than end time | Time difference with the KDC; Microsoft systems don't request postdated tickets | Time sync; investigate a client that repeats it |
0x20 KRB_AP_ERR_TKT_EXPIRED | The ticket has expired | Routine; tickets renew automatically | Nothing, unless one client loops on it |
0x22 KRB_AP_ERR_REPEAT | The request is a replay | The same authenticator arrived twice | Treat repeats as suspicious |
0x1F KRB_AP_ERR_BAD_INTEGRITY | Integrity check on decrypted field failed | Tampering or network corruption | The network path; repeated hits need a security review |
0x26 KRB_AP_ERR_BADADDR | Network address doesn't match the ticket | IP address change, proxy or NAT | Address translation between client and service |
0x34 KRB_ERR_RESPONSE_TOO_BIG | Response too big for UDP | Informational: Windows retries over TCP | TCP 88 open to the DCs |
0x3C KRB_ERR_GENERIC | Generic error | Group memberships overloading the PAC, recent password changes not yet replicated, an SPN too long or with too many parts | The user's group count and recent password changes |
Smart cards and certificate mapping#
| Code or event | Meaning | Usual cause | First check |
|---|---|---|---|
0x3E KDC_ERR_CLIENT_NOT_TRUSTED | The client trust failed | Smart card certificate revoked, or its root CA isn't trusted by the DC | Revocation status and the chain as seen from the DC |
0x3F KDC_ERR_KDC_NOT_TRUSTED | The KDC server trust failed | The client doesn't trust the CA behind the DC's certificate | The DC certificate chain from the client |
0x40 KDC_ERR_INVALID_SIG / 0x41 KDC_ERR_KEY_TOO_WEAK | Invalid signature / higher encryption level needed | The PKINIT request signature fails, or its Diffie-Hellman parameters are below KDC policy | The certificate and smart card middleware |
Kdcsvc 39 | The Key Distribution Center (KDC) encountered a user certificate that was valid but could not be mapped to a user in a strong way | No strong mapping and no SID extension in the certificate; in Enforcement mode authentication is denied | Reissue from an updated CA (online templates add the SID extension) or add a strong explicit mapping. KB5014754 |
How to verify a fix#
- On the client, clear cached tickets and request the service again:
klist purgefor the user, orklist -li 0x3e7 purgefor the computer account.klist get HTTP/app.contoso.comrequests a ticket directly. klistlists a ticket for the SPN, and itsKerbTicket Encryption Typeis AES.- On the DC, the matching 4769 shows Failure Code
0x0and Ticket Encryption Type0x12or0x11(AES), the expected values on current systems. - No new Kdcsvc 201 to 209 or 39 events name that account, and 4771
0x18bursts from that Client Address have stopped. - Turn Kerberos
LogLeveloff again on any machine where you enabled it.
Replication errors that wrap Kerberos failures (5, 1396, -2146893022) are in Active Directory replication errors; Kerberos problems with Microsoft Entra Seamless SSO are covered in Seamless SSO not working.

