Tools / Guides / Event ID 4625

Event ID 4625: failed logons explained

What Windows Security Event 4625 means, how to read the logon type and status codes, how to tell brute force from password spraying, and what to do next.

Updated 2026-11-03 · 7 min read

Event ID 4625 is written to the Windows Security log every time an account fails to log on. A handful is normal: people mistype passwords. Dozens in a few minutes, or one source failing against many accounts, is an attack. This guide shows how to read the event and decide quickly.

The fields that matter

FieldWhat it tells you
Account For Which Logon Failed > Account NameThe account being tried. Ignore the Subject section, which is usually the local system.
Logon TypeHow the logon was attempted. See the table below.
Status / Sub StatusWhy it failed. The Sub Status is the precise reason.
Source Network AddressThe IP the attempt came from. - or 127.0.0.1 means local.
Workstation NameThe name the client claimed. Attack tools often send random or blank names.
Authentication PackageNTLM or Kerberos. NTLM from unexpected hosts deserves a second look.

Logon types you will see in 4625

TypeMeaningTypical cause of failures
2Interactive (keyboard at the machine)User typo, someone at the console
3Network (SMB, file shares, many RDP attempts with NLA)Brute force over SMB or RDP, stale mapped drives
4Batch (scheduled task)A task still running with an old password
5ServiceA service account whose password changed
7UnlockUser mistyping at the lock screen
8Network cleartext (IIS basic auth)Password spraying against web apps
10Remote interactive (RDP without NLA)RDP brute force from the internet
11Cached interactiveLaptop off the network with an old cached password

Status and Sub Status codes

CodeMeaningRead it as
0xC000006ACorrect username, wrong passwordSomeone knows a valid account name
0xC0000064Username does not existGuessing names: spraying or enumeration
0xC0000234Account is locked outAttempts continuing after lockout
0xC0000072Account is disabledSomeone trying a leaver's account
0xC0000071Password expiredUsually a real user
0xC0000193Account expiredContractor or leaver account
0xC000006F / 0xC0000070Outside allowed hours / not allowed from this workstationPolicy working as designed
0xC000015BLogon type not grantedAccount blocked from RDP or local logon by policy
0xC0000133Clock out of sync with the domain controllerTime sync problem, not an attack

0xC000006D in the Status field is a generic "bad username or password"; always read the Sub Status for the real reason.

Brute force or password spraying?

The one pattern to never ignore: a run of 4625 failures for an account followed by a 4624 success for the same account from the same source. Treat it as a compromised password until proven otherwise.

Pull the events quickly

PowerShell on the server

Get-WinEvent -FilterHashtable @{LogName='Security'; Id=4625; StartTime=(Get-Date).AddHours(-24)} |
  ForEach-Object {
    $x = [xml]$_.ToXml()
    $d = @{}; $x.Event.EventData.Data | ForEach-Object { $d[$_.Name] = $_.'#text' }
    [pscustomobject]@{ Time=$_.TimeCreated; User=$d.TargetUserName; IP=$d.IpAddress; Type=$d.LogonType; SubStatus=$d.SubStatus }
  } | Group-Object User, IP | Sort-Object Count -Descending | Select-Object -First 20 Count, Name

Microsoft Sentinel (KQL)

SecurityEvent
| where TimeGenerated > ago(24h) and EventID == 4625
| summarize Failures = count(), Accounts = dcount(TargetAccount) by IpAddress, bin(TimeGenerated, 10m)
| where Failures >= 10 or Accounts >= 5
| order by Failures desc

What to do next

  1. Check for a success. Search 4624 for the same account and IP right after the failures.
  2. Look up the source IP. Public IP on RDP or SMB means the service is exposed to the internet; that is the real finding.
  3. Block or restrict. Block the IP at the firewall, put RDP behind a VPN or gateway with MFA, and make sure account lockout policy is set.
  4. If a success happened: reset the password, sign the user out everywhere, review what the session did (4688 process creation, new services 7045, new users 4720).
  5. If it is a stale credential: find the task, service or mapped drive on the source host and update it, or the noise will hide a real attack later.