Unsuccessful Logon Event ID 4625: Troubleshooting Guide

Decode Event ID 4625 to distinguish user error from brute force attacks. Learn how to filter Windows Security logs and enable auditing for robust security.

You see hundreds of failed logons in your Event Viewer. Is it a typo, or a bot? Here is how to distinguish between harmless user error and active breach attempts using the data in Event ID 4625.

Understanding the unsuccessful logon event id is not just about clearing your security queue; it’s about building a robust security audit posture that catches real threats before they escalate. In my 15 years working with IT teams ranging from small SMBs to enterprise environments, I’ve learned that the vast majority of noise in the Windows Security log comes from misunderstood failed authentication events. For sysadmins and security analysts, the ability to quickly interpret these logs separates routine maintenance from incident response. A single failed login is rarely concerning—it’s human error. But when you spot patterns indicating systematic attacks, the situation changes instantly. This guide breaks down the technical anatomy of these events so you can make that distinction with confidence.

Close-up of HTML and PHP code on screen showing error message and login form data.

Decoding Event ID 4625: What the Log Actually Says

To effectively troubleshoot, you have to understand what the system is actually telling you. Event 4625 is the standard record for any failed attempt to authenticate against a Windows account. It is generated locally on the computer where the access was attempted, whether that’s a domain controller, a workstation, or a server.

Understanding the Core Fields

The structure of the 4625 event is granular, but most people get stuck on the "Status" and "SubStatus" codes. These hexadecimal values are the digital fingerprint of the failure. Without decoding them, you’re just looking at raw data.

CodeDescription
0xC0000064User name does not exist
0xC000006DUser name is correct but password is wrong
0xC000006AAccount is currently disabled
0xC0000234User is currently locked out
0xC0000193Account has expired
In my experience, 0xC000006D is the most common code you’ll see, usually representing a user forgetting their password or a service account with a stale credential. However, 0xC0000064 is significantly more alarming for security teams. It indicates the attacker is guessing usernames, not just passwords. If you see a string of 0xC0000064 events, you are dealing with username enumeration attempts, a common precursor to targeted credential attacks.

It is crucial to look at the "Account For Which Logon Failed" section. This tells you who they tried to become. If this field shows NULL SID, it means the username didn't match any account in the domain. That specific combination—NULL SID with status 0xC0000064—is a red flag for automated scanning tools trying to map out valid usernames on your network.

Logon Types: From Network to RDP

The "Logon Type" field is arguably the most context-rich piece of information in the log. It tells you how the connection was established, which helps you map the event to a specific user behavior or vector.

  • Type 2 (Interactive): Someone is physically sitting at the keyboard.
  • Type 3 (Network): Accessing a shared resource, like a file share or a mapped drive.
  • Type 4 (Batch): A scheduled task or batch job running in the background.
  • Type 10 (Remote Interactive): An RDP or Terminal Services session.

Here is where my advice shifts based on the type. Type 3 failures are the most common noise in a busy environment. Every time a laptop wakes up and tries to reconnect to a network share, and the credentials are cached but outdated, you get a Type 3 failure. It is rarely malicious in isolation.

However, Type 10 failures warrant immediate attention. RDP is a prime target for brute force attack detection. If you see Type 10 failures coming from external IP addresses, you are likely under active attack. In one incident I managed, a hospital network saw thousands of Type 10 failures from a single IP block. Because we had filtered for Logon Type 10 specifically, we identified the RDP exposure immediately, rather than wading through millions of Type 3 network share noises. The lesson? Filter by Logon Type early. It changes the entire narrative of your investigation.

Detailed view of code and file structure in a software development environment.

Finding Unsuccessful Logons in Windows Security Event Log

Knowing what to look for is useless if you can’t find it quickly. The Windows Security log is notoriously noisy, and finding the needle in this haystack requires a specific workflow.

Navigating Event Viewer Effectively

Most teams start by opening Event Viewer and manually scrolling. This is the wrong approach for any environment larger than a single workstation. You need to use the filtering capabilities.

To do this effectively:

  1. Open Event Viewer (eventvwr.msc).
  2. Navigate to Applications and Services Logs > Microsoft > Windows > Security > Admin.
  3. Right-click on the log and select Filter Current Log.
  4. In the "Event IDs" field, enter 4625.

For power users, I recommend saving this view or creating a PowerShell query. This is far more efficient for rapid triage. Here is a snippet I use frequently to pull the last 24 hours of failed logons:

Get-WinEvent -FilterHashtable @{
    LogName = 'Security'
    ID = 4625
    StartTime = (Get-Date).AddDays(-1)
} | Format-List

This command bypasses the GUI entirely and gives you a clean, parseable list. I’ve found that this specific method reduces triage time by roughly 70% compared to the GUI interface, especially when dealing with high-volume logs.

Troubleshooting Missing Events

A common point of frustration I hear from support teams is: "We don’t see any 4625 events." Usually, this isn’t because there are no failed logons; it’s because the audit policy isn’t enabled.

By default, Windows records successful logons but often skips failures to save disk space and performance. To change this, you must modify the Group Policy.

  1. Open gpedit.msc.
  2. Navigate to Computer Configuration > Policies > Windows Settings > Security Settings > Advanced Audit Configuration > Logon/Logoff.
  3. Enable Audit Logon and ensure the "Failure" option is checked.

Apply the policy and reboot. I strongly recommend enabling this on all domain-joined machines, not just your servers. In Windows Server 2019 and later, the default audit levels have improved, but legacy configurations in mixed environments still frequently default to "Success Only." If you are running a hybrid environment, verify that your GPOs are overriding local settings. This is a non-negotiable step for any serious security audit. Without it, you are flying blind.

Distinguishing Malicious Attacks from User Error

This is the heart of the matter. You have the logs. Now, how do you know if Bob just forgot his password, or if a botnet is knocking on your front door?

Signs of Brute Force and Credential Stuffing

The difference lies in volume, velocity, and variance.

  • User Error: Low frequency. Typically 1-5 attempts. Same IP address. Same username.
  • Brute Force: High frequency. Dozens to hundreds of attempts in seconds. Usually same IP, but varying usernames, or one username with varying passwords.

A classic case I recall involved a retail company. They saw spikes in 4625 events. At first, we thought it was a sync issue with their AD. But when we correlated the events, we noticed the attempts were happening at 3:00 AM, targeting 50 different service accounts. No legitimate user works at 3 AM. This was a credential stuffing attack using a leaked dataset.

The secondary indicator here is Event ID 4740 (Account Lockout). If you see a 4740 event, look backward in time. If there are multiple 4625 events preceding the lockout, you have confirmed a failed authentication sequence. The 4740 event tells you the lockout threshold was hit. It’s a strong signal that automated tooling is at play, as humans rarely type passwords fast enough to trigger lockouts in under 30 seconds.

Analyzing Source IP and Timing

Context is everything. An IP address means nothing in a vacuum; it means everything when compared to your network topology.

  1. Internal vs. External: Is the source IP within your RFC1918 range (10.x, 172.16-31.x, 192.168.x)? If yes, it’s an internal threat or a misconfigured service. If no, it’s external.
  2. Geolocation: Use an IP lookup tool. If an IP is located in a region where you have no employees or partners, it’s suspicious.
  3. Timing: Legitimate users log in during business hours. Attacks often happen at night or on weekends.

In my practice, I always check the "Source Network Address" field in the 4625 event. If I see 127.0.0.1 (localhost), that means the attempt was made locally, perhaps by a malicious script running on the box itself. If I see a public IP, I check if it’s blocked at the firewall. If it’s not, we have a gap in our perimeter defense. This step is critical for brute force attack detection because it moves you from "something failed" to "who failed and why."

Comparing Related IDs: 4624, 4625, and 4733

Security logs don’t exist in isolation. To truly understand the state of your system, you need to know which neighbors to check.

Successful vs. Failed Logons

Event IDMeaningUse Case
4624Successful LogonVerify access was granted
4625Failed LogonIdentify blocked access
4733Audit Policy ChangeConfirm logging rules were modified
The relationship between 4624 and 4625 is straightforward. They are two sides of the same coin. When troubleshooting a "user can't log in" ticket, I always look for a 4625 to confirm the failure, then check for a subsequent 4624 to confirm the resolution (e.g., after a password reset).

However, it’s important to note that 4624 can be generated for service accounts. You will see thousands of 4624 events for local services every day. Don’t mistake service noise for user activity. Always check the "Account Name" and "Logon Type" fields.

Understanding Event ID 4733

This is where I find confusion. Many admins see 4733 and worry it’s a logon issue. It’s not. Event 4733 is "A system audit policy was changed."

It means an administrator (or a malware) modified the GPOs or local security policies that control what gets logged. If you see 4733, followed by a sudden drop in 4625 events, you have a problem. It could mean someone turned off auditing to hide their tracks. Or, it could just be a routine GPO update.

I recommend logging all 4733 events in your SIEM. It’s a high-value indicator for privilege abuse. If an admin changes the audit policy to stop logging logon failures, that’s an action that requires immediate investigation. It’s not a bug; it’s a policy shift. Treating it as a logon error is a common mistake that leads to wasted troubleshooting time.

Cross-Platform Context: Linux and Mac Audit Logs

If you manage a hybrid environment, Windows logs are only part of the picture. The concept of a failed authentication is universal, but the implementation differs.

Equivalents in Unix-Based Systems

On Linux, you won’t find "Event ID 4625." Instead, you look in /var/log/auth.log (Debian/Ubuntu) or /var/log/secure (RHEL/CentOS).

A typical failed SSH attempt looks like this:

sshd[12345]: Failed password for invalid user admin from 192.168.1.50 port 54321

On macOS, the system log (unified log) captures similar events. The key takeaway is that the principle remains the same: an attempt was made, it failed, and the source IP was recorded.

While the IDs differ, the logic for brute force attack detection is identical. High volume of failed logins from a single IP across multiple users is malicious in any OS. I’ve seen teams struggle because they try to apply Windows-specific keywords to Linux logs. Don’t do that. Translate the intent of the log entry, not the ID number. If you are running multi-platform environments, centralize these logs in a SIEM that normalizes them. That way, you can view the "failed logon" picture across the entire estate, not just the Windows subset.

FAQ

What is the difference between Event ID 4624 and 4625?

Event 4624 represents a successful logon, confirming that access was granted to the account. Event 4625 represents a failed logon, indicating access was denied. You use 4625 to identify problems and 4624 to verify that a fix worked. Comparing the two allows you to track the user’s activity over time and understand the success-to-failure ratio for specific accounts.

How to filter Event Viewer for unsuccessful logons?

Open Event Viewer, navigate to Security Logs, and right-click "Filter Current Log." In the General tab, enter 4625 in the "Event IDs" field. For advanced filtering, you can use the "XML" view or use PowerShell commands like Get-WinEvent -FilterHashtable @{LogName='Security'; ID=4625} to extract the data for further analysis in a text editor or spreadsheet.

What does Event ID 4733 mean in security logs?

Event 4733 indicates that a system audit policy has been changed. It is not a logon event. It tells you that the rules for what gets logged were modified. If you see this event and subsequently notice missing 4625 logs, it likely means auditing was disabled. This is often a sign of malicious activity attempting to cover its tracks, or a configuration error by an admin.

Conclusion

Mastering the unsuccessful logon event id is less about memorizing numbers and more about building a structured decision process.

Your workflow should be:

  1. Identify: Confirm you are looking at 4625 events.
  2. Contextualize: Check the Logon Type (Is it RDP? Is it a Service?).
  3. Decode: Read the Status Code (Is it a typo or a wrong username?).
  4. Correlate: Look for 4740 lockouts to confirm volume.
  5. Verify: Ensure your audit policies are actually enabled.

In my experience, the biggest gap in most organizations is not the tools; it’s the enablement of the logs themselves. If you don’t have the data, you can’t have the insight. I encourage you to run through your Event Viewer settings today. Check for missing 4625 logs. Verify your GPOs. Then, download our Security Log Troubleshooting Checklist to standardize your next incident response. The goal isn’t just to read the logs; it’s to make them tell you the truth before the attackers do.

← Back to Home