Fix it now
The credential is not the problem: one of the Restrict NTLM settings was configured to deny, and it denied. Your two honest options are to exempt the specific server deliberately, or to give the service a Kerberos identity so the exemption is not needed.
gpresult /h C:\ntlm-report.html
setspn -L CONTOSO\svc_app
setspn -S HTTP/app.contoso.com CONTOSO\svc_app
gpupdate /force
- Open the NTLM operational log on the machine that refused: Applications and Services Logs, Microsoft, Windows, NTLM. That is where the Restrict NTLM policies write.
- Open the report from gpresult and read every setting under Security Options that begins “Network security: Restrict NTLM”. One of them is set to deny, and which one tells you whether the block is on the client, the server or the domain controller.
- To restore service now, add the target server to the matching exception list rather than turning the policy off. One server name per line.
- For the durable fix, register the missing service principal name on the account the service runs as, so clients negotiate Kerberos instead.
Before changing anything in production, set the auditing versions of these policies. They record what would be blocked without blocking it, which is how you size the problem before you create it.
If the application works again you can stop here. The next section covers what the policies do, and which events are actually published for them.
Why it happens
The Restrict NTLM family of security options exists to remove NTLM from a domain in stages. There are settings for outgoing traffic from a client, incoming traffic to a server, and NTLM authentication in the domain as a whole, each with an auditing counterpart that logs without blocking. When one of them denies, the authentication fails with the credential completely valid: it is the protocol carrying it that was refused.
The events land in an operational log rather than the Security log. Microsoft’s documentation for these policies states that the events are recorded in Applications and Services Log, Microsoft, Windows, NTLM – and, notably, that there are no security audit event policies to configure for viewing that output. That is the log to open, and it is worth knowing that Microsoft does not publish an event ID table for it.
What Microsoft does publish, on the domain controller side, is Event ID 8004 for NTLM authentication auditing, which is the event that records NTLM authentication activity once the three Restrict NTLM audit settings are enabled. If you are building a picture of who still uses NTLM before you turn blocking on, 8004 on the domain controllers is the documented source.
An application that has no Kerberos identity
You have this one if One application fails while everything else works, and it is reached by an alias, an IP address or a name that is not the server’s own.
- Check what names the service account holds:
setspn -L <account>. - Register the name clients actually use:
setspn -S <service>/<fqdn> <account>, which verifies there is no duplicate before adding. - Clear tickets and retry. Kerberos needs a name to ask for, and clients fall back to NTLM when there is not one.
A service reached by an alias needs the alias registered, not just the host name. This is the single most common reason an internal application is still on NTLM.
The block is on the domain controller, not the endpoints
You have this one if Authentication fails for a whole class of servers at once, and nothing changed on any of them.
- Read the policies applied to the domain controllers, not only to the failing machine.
- Where a domain-wide restriction is in force, the exception list is the domain controller one – add the servers you have not converted yet.
- Set the audit versions first if you are not sure of the blast radius.
The account is refused by an authentication policy, not by NTLM restrictions
You have this one if Status 0xC0000413, STATUS_AUTHENTICATION_FIREWALL_FAILED, appears in the failure, or the target sits behind selective authentication.
- Check whether the target is in a trust with selective authentication enabled: the account then needs the Allowed to authenticate permission on the target.
- Check for an authentication policy or silo applied to the account. Its failures are recorded in the Authentication Policy Failures log, where Event ID 101 is an NTLM sign-in failure because a policy is configured.
- Grant the permission deliberately or exclude the account from the policy; the NTLM exception lists will not help here.
NTLM pass-through across a trust is being blocked
You have this one if The failure only affects users from a trusted domain or forest, and Netlogon events 5832 to 5835 appear on the domain controllers.
- Read those events: 5833 and 5835 record blocked requests, 5832 and 5834 record requests allowed only because of an administrative exemption.
- By default the summary events are throttled to once a day. To get the per-request detail, set
ThrottleNTLMPassThroughAuthEventsto 0 underHKLM\SYSTEM\CurrentControlSet\Services\Netlogon\Parameters. - Fix the trust configuration the events point at rather than exempting the whole trust.
Full reference
The settings, and where each one applies
| Policy | Applies to | Effect |
|---|---|---|
| Network security: Restrict NTLM: Outgoing NTLM traffic to remote servers | Clients and member servers | Blocks or audits NTLM leaving this machine |
| Network security: Restrict NTLM: Incoming NTLM traffic | Servers | Blocks or audits NTLM arriving at this machine |
| Network security: Restrict NTLM: NTLM authentication in this domain | Domain controllers | Blocks or audits NTLM authentication handled by the domain |
| Network security: Restrict NTLM: Audit Incoming NTLM Traffic | Servers | Logs what would be blocked, without blocking it |
| Network security: Restrict NTLM: Audit NTLM authentication in this domain | Domain controllers | The domain-wide audit counterpart |
What is published, and what is not
Microsoft documents the operational log path for these policies but does not publish an event ID table for it, so treat any event number you are given for “NTLM blocked” – including 4001 – as unverified until you see it in your own log. What is documented is Event ID 8004 on domain controllers for NTLM authentication auditing, and Event ID 101 in the Authentication Policy Failures log for an NTLM sign-in refused because an authentication policy is configured. Build reporting on those two, and use the operational log for the detail of a single failure in front of you.
Sizing the problem before you cause one
- Set the three audit policies on the domain controllers: outgoing NTLM traffic to Audit all, NTLM authentication in this domain to Enable all, and incoming NTLM traffic to Enable auditing for all accounts.
- Collect Event 8004 for a fortnight, so weekly and monthly jobs are included.
- Group by server name and by account. Each server name is a candidate for an SPN rather than an exception.
- Register the missing service principal names, then re-collect and see what is left.
- Only then move the enforcement settings from audit to block, and expect the remaining list to be the exception list.
Statuses you will see alongside this
| Value | What it means |
|---|---|
0xC0000413 |
STATUS_AUTHENTICATION_FIREWALL_FAILED. Returned with KDC_ERR_POLICY when the account is not allowed to authenticate to the target – selective authentication, or an authentication policy |
| Event 40960 | LSASrv recording an authentication failure with the extended error that caused it. Read the extended code, not the event |
| Event 8004 | NTLM authentication recorded on a domain controller once NTLM auditing is enabled |
| Event 101 | An NTLM sign-in failure because an authentication policy is configured, in the Authentication Policy Failures log |
Why the exception list is not a resting place
An exception is a named server that is allowed to keep using NTLM. It is a reasonable step while an application is being fixed, and a poor one as an end state: nothing expires it, nothing reviews it, and the servers on it are the ones an attacker would relay credentials to first. Give every entry an owner and a date at the point you add it, in the same change record, because there is no built-in list to review later.
When a licence is the actual fix
Nearly all of this is configuration and costs nothing: an SPN, an exception, an audit pass. The exception is an application host too old to negotiate Kerberos properly, or running a Windows build that has left support and will never receive the updates that make signed, Kerberos-based authentication work. A permanent NTLM exception for that host is a weakness you carry indefinitely, and it is the first thing a security review will find. If that is where you have ended up, moving the workload to a supported server is the honest fix, and Arco supplies Windows Server 2025 Standard on the server-plus-CAL model. This is a soft recommendation rather than a rule: if the host is in support and simply lacks a service principal name, register the SPN and buy nothing.
Every code this article covers
| Code | What it points at | Source |
|---|---|---|
Event ID 4001 |
No Microsoft page publishes an NTLM or authentication event with this ID. If you have one, read the account and server names in it and treat the documented events – 8004 on domain controllers, and 101 in the Authentication Policy Failures log – as the reportable ones | not published by the vendor |
0xC0000413 |
STATUS_AUTHENTICATION_FIREWALL_FAILED: returned with KDC_ERR_POLICY when the account is not permitted to authenticate to the target, as with selective authentication or an authentication policy | Microsoft Learn |
Event ID 40960 |
LSASrv recording an authentication failure, carrying the extended error code that explains it | Microsoft Learn |
Confirm the fix worked
- The application authenticates without a credential prompt, from a machine that was failing.
setspn -L <account>lists the name clients actually use, andsetspn -X -Freports no duplicate for it.- A network capture or the client’s ticket cache shows Kerberos rather than NTLM for that server.
- Event 8004 on the domain controllers no longer records NTLM for that server name.
- Every entry in an exception list has an owner and a date recorded with the change.
Questions people ask about this
Which event ID means NTLM was blocked?
Microsoft documents the log – Applications and Services Log, Microsoft, Windows, NTLM – but does not publish an event ID table for it. Read the entries in your own log, and use Event 8004 on domain controllers for reporting, which is documented.
Is turning the policy off a reasonable fix?
Only as an emergency. The exception lists exist so you can allow one named server rather than reopening NTLM everywhere, and the audit settings exist so you can see what would break before it does.
Why does the application still use NTLM after I registered an SPN?
Check that the name you registered is the name clients actually use, including any alias, and that it is registered on the account the service runs as. Then clear cached tickets and try again.
What is 0xC0000413 doing in my NTLM failure?
That status is the authentication firewall: the account is not allowed to authenticate to that machine. It comes from selective authentication on a trust, or from an authentication policy, and the NTLM exception lists do not affect it.
Do I need to buy anything?
No, unless the application host is out of support and can never be fixed. An SPN and an exception list cost nothing.
