Dev.to Security 🔐 Cybersecurity 👁 0 📖 20 min read

Entra Connect Password Hash Sync Not Working: A Read-First Heartbeat, Event 611, and Per-User Triage

A user changed their password on-premises at 9:00. At 9:40, Outlook on the web still only accepts the old one. Connect Health has raised Password Hash Synchronization heartbeat was skipped in last 120 minutes, and the Ap

A user changed their password on-premises at 9:00. At 9:40, Outlook on the web still only accepts the old one. Connect Health has raised Password Hash Synchronization heartbeat was skipped in last 120 minutes, and the Application log on the sync server shows Event 611 from Directory Synchronization. Someone in the ticket has already found the "trigger a full sync of all passwords" script and wants to run it "just to be safe."

Don't run anything that changes state yet. A password change made in Active Directory only works for a cloud sign-in when the whole chain holds: password hash sync is enabled for the tenant and for that AD connector → the server you're looking at isn't in staging mode → each forest's password sync channel is alive (heartbeats are logged) → the AD DS connector account can replicate password hashes from a reachable domain controller in every domain → the user is an in-scope user object that's joined to an exported Entra object by a sync rule with password sync turned on → the password isn't a "temporary" one the client skips → the sign-in actually uses the synced hash (managed domain, not federation or pass-through). The event IDs and the per-user password sync log tell you which link failed.

If the problem is object-level export errors (duplicate UPNs, InvalidSoftMatch, permission-issue 8344) rather than passwords, start with the Entra Connect sync errors triage. If Connect-MgGraph refuses the read-only queries below, the Connect-MgGraph "Insufficient privileges" walkthrough covers scopes and roles. This post covers password hash synchronization in Microsoft Entra Connect Sync (the on-premises sync engine). Microsoft Entra Cloud Sync has its own agent and its own troubleshooting docs.

TL;DR

  • Decide first: all users or one user? Microsoft's troubleshooting splits along exactly that line, and the reads are different.
  • Password hash sync runs every 2 minutes and you can't change that. When nothing is pending, each AD connector logs a heartbeat, Event 654, every 30 minutes. No 654 in the last few hours means the channel is down, not "nobody changed a password."
  • A server in staging mode syncs no passwords. Check which server is active before you read anything else.
  • Event 611 with RPC error 8453 ("Replication access was denied") = the AD DS connector account is missing Replicating Directory Changes and/or Replicating Directory Changes All at a domain root. RPC 1722 = it can't reach the domain controller over RPC.
  • One user only: read that object's password sync log (kept 7 days). FilteredByTarget = "User must change password at next logon" is set, so the temporary password wasn't synced. TargetNotExportedToDirectory = the cloud object isn't exported yet.
  • "Synced" doesn't mean "used." A federated domain authenticates at the federation service, and pass-through authentication doesn't automatically fail over to the synced hash.
  • The full password sync script is a "run once" tool. Microsoft says if you need it more than once, something else is wrong.

Where in the chain did it break?

Step What should be true Typical symptom when it breaks
1. Scope You know whether it's every user or one user, and how the domain signs in Hours spent on one user's object while the whole channel is down
2. Feature and server Feature enabled in the tenant and on the AD connector; active server not in staging mode Nobody's new password works in the cloud; no PHS events at all
3. Channel health Heartbeat (654) logged per connector; no 611/652/655 errors Connect Health "heartbeat was skipped in last 120 minutes" or "Password Hash Synchronization stopped working"
4. AD DS permissions and reachability Connector account has both replication rights at every domain root and can reach a DC over RPC Event 611 with RPC 8453 (access denied) or 1722 (RPC server unavailable)
5. The object User is in the AD connector space, joined in the metaverse, exported to Entra, with a PasswordSync = True rule on both sides Password sync log shows NoTargetConnection, SourceConnectorNotPresent, TargetNotExportedToDirectory, or nothing at all
6. The password itself Not a temporary password the client skips; account state is what you think FilteredByTarget; "Your account or password is incorrect" for a new user
7. The sign-in The cloud sign-in actually validates against the synced hash Hash synced fine, but sign-in still fails or still takes the old password

Write down the user's DN, UPN, the time of the password change, and which Entra Connect server is active before you change anything.

Step 1: All users or one user, and how does the domain sign in?

Evidence Read it as
Several users changed passwords today and none of the new ones work in the cloud Channel-level problem. Steps 2–4
Most users are fine, one user isn't Object-level problem. Steps 5–6
Connect Health alert Password Hash Synchronization heartbeat was skipped in last 120 minutes Microsoft's description: PHS hasn't connected with Entra ID in the last 120 minutes, so passwords won't sync. Channel-level
Connect Health alert Password Hash Synchronization stopped working PHS is stopped. Channel-level

Then read how the domain authenticates, because a hash can sync perfectly and still never be used. Read-only Microsoft Graph PowerShell:

Connect-MgGraph -Scopes 'Domain.Read.All'
Get-MgDomain | Select-Object Id, AuthenticationType, IsVerified   # Managed or Federated
Domain / sign-in method What the synced hash does
Managed, password hash sync is the sign-in method Entra ID validates the password against the synced hash. This post applies directly
Managed, pass-through authentication Sign-in is validated by on-premises PTA agents. Microsoft says PTA doesn't automatically fail over to password hash sync
Federated Sign-in goes to the federation service (for example AD FS). Microsoft describes PHS here as a possible fallback if federation has an outage. Users in a Staged Rollout group for password hash sync are the exception: they sign in with the synced hash

The tenant-level switches are on onPremisesDirectorySynchronization in Microsoft Graph. Microsoft documents OnPremDirectorySynchronization.Read.All for this read, with Global Administrator as the supported role:

Connect-MgGraph -Scopes 'OnPremDirectorySynchronization.Read.All'
(Get-MgDirectoryOnPremiseSynchronization).Features |
  Select-Object PasswordSyncEnabled, UserForcePasswordChangeOnLogonEnabled, CloudPasswordPolicyForPasswordSyncedUsersEnabled

PasswordSyncEnabled is the tenant side. The next step reads the server side. Both have to agree.

Step 2: Feature, server, and per-connector channel

Read-only, on the Entra Connect server (elevated PowerShell). This is a shortened version of Microsoft's "Get the status of password sync settings" script:

Import-Module ADSync

# Tenant feature as the sync engine sees it, and whether this server is allowed to sync at all
"PasswordHashSync feature in tenant : $((Get-ADSyncAADCompanyFeature).PasswordHashSync)"
"This server in staging mode        : $((Get-ADSyncScheduler).StagingModeEnabled)"   # True = no passwords sync from here

# One password sync channel per on-premises AD connector (forest)
$adConnectors = Get-ADSyncConnector | Where-Object { $_.ConnectorTypeName -eq 'AD' }
foreach ($c in $adConnectors) {
  "`n=== AD connector: $($c.Name) ==="
  Get-ADSyncAADPasswordSyncConfiguration -SourceConnector $c.Name

  # Heartbeat = Event 654, logged with the connector's identifier in the message
  $id   = $c.Identifier.ToString('D')
  $beat = Get-WinEvent -FilterHashtable @{ LogName = 'Application'; ProviderName = 'Directory Synchronization'
                                            Id = 654; StartTime = (Get-Date).AddHours(-3) } -ErrorAction SilentlyContinue |
          Where-Object { $_.Message -match [regex]::Escape($id) } | Select-Object -First 1
  if ($beat) { "Latest heartbeat (654): $($beat.TimeCreated)" } else { 'No heartbeat (654) in the last 3 hours' }
}

How to read it:

Result Read it as
PasswordHashSync is False The feature isn't enabled in the tenant. The wizard's PHS troubleshooter reports the same
StagingModeEnabled is True This is the staging server. Microsoft: a server in staging mode doesn't synchronize any passwords. Go read the active one
Password sync configuration for a connector isn't enabled The channel for that forest is off. With multiple connectors, PHS can be turned off for some and not others
Feature on, not staging, but no 654 in 3 hours The channel isn't running. Microsoft's troubleshooter uses the same 3-hour look-back. (Microsoft describes 654 as the idle heartbeat, so on a busy forest also look for batch events 650/651.) Go to Step 3
Recent 654 for every connector The channel is alive. If one user still fails, go to Step 5

Microsoft's wizard has the same checks built in: Entra Connect wizard > Additional tasks > Troubleshoot > Launch, then Troubleshoot password hash synchronization > Password hash synchronization does not work at all. It validates the tenant feature, staging mode, each connector's channel and heartbeat, DC reachability, and the AD DS account's username, password, and permissions. Read its prompts. Some menus in that console can apply fixes, so don't accept a change until you've finished Step 4.

Step 3: Read the Directory Synchronization events

Microsoft's manual steps say events 0, 611, 652, and 655 from source Directory Synchronization indicate a connectivity problem, and the message names the forest or domain involved. Read the last day (read-only):

$ids = 0, 603, 604, 607, 611, 612, 613, 616, 621, 652, 655, 662, 664, 667
Get-WinEvent -FilterHashtable @{ LogName = 'Application'; ProviderName = 'Directory Synchronization'
                                  Id = $ids; StartTime = (Get-Date).AddHours(-24) } -ErrorAction SilentlyContinue |
  Select-Object TimeCreated, Id, LevelDisplayName,
    @{n = 'Message'; e = { ($_.Message -split "`r?`n" | Select-Object -First 3) -join ' ' }} |
  Format-Table -Wrap

Microsoft's event table for password hash sync, the IDs that matter most when it's broken:

Event ID Microsoft's description What to read next
654 End of password hash sync ping (the heartbeat) Absent = channel down (Step 2)
611 Error during password hash sync for a domain The RPC error inside the message (table below)
652 Error during password hash sync operation Message detail; Microsoft groups it with connectivity problems
655 Error during password hash sync ping Connectivity to Entra ID or the DC
613 Password hash sync agent has paused because directory full sync hasn't completed yet Run history: wait for the full sync to finish
616 Password hash sync connection to preferred DC failed The preferred DC list (Step 4)
621 Full password hash sync attempt failed Message detail before any retry
664 Single object sync task failed The one object named in the message (Step 5)
667 Generating MD5 decryption key has failed FIPS policy on the server (see below)

Microsoft also suggests making the Application log bigger, because PHS logs a lot and older events get overwritten.

Inside an Event 611, the RPC error number tells you the cause. From Microsoft's 611 and RPC-error troubleshooting articles:

Error inside 611 Microsoft's cause Read
RPC Error 8453: Replication access was denied The AD DS connector account is missing Replicating Directory Changes and/or Replicating Directory Changes All Step 4 permissions read
RPC Error 1722: The RPC server is unavailable Network-level failure reaching the DC (Microsoft's example traced it to blocked port 135) DNS, firewall, and which DC the message names
RPC Error 8333: Directory object not found The server couldn't find the object it was trying to sync in AD The object and DC named in the message
0x5 (access denied) Can have several causes. Microsoft's example is hardening policy such as Network access: Restrict clients allowed to make remote calls to SAM Recent GPO hardening on domain controllers
RPC Error 8439 (distinguished name invalid) / 8593 (different replication epochs) Known issues fixed in later builds Microsoft's resolution is to update Entra Connect

FIPS. Microsoft documents that MD5 is disabled on servers locked down to FIPS, and PHS needs it to decrypt the hash envelope from the DC. Microsoft's fix is an enforceFIPSPolicy enabled="false" entry in miiserver.exe.config, with a known-issue warning about editing that file on some Connect versions. Reading Event 667 as the FIPS symptom is our interpretation of the event name, so confirm the server's FIPS policy before you edit anything.

Step 4: AD DS connector account permissions and DC reachability

Find the account first. Synchronization Service Manager > Connectors > your AD connector > Properties > Connect to Active Directory Forest shows the username and its domain. (Get-ADSyncADConnectorAccount from the ADSyncConfig module returns the same thing.)

Microsoft's requirement: that account needs Replicating Directory Changes and Replicating Directory Changes All at the root of every domain in the forest. Express setup grants them automatically. Custom installs, rebuilt accounts, and "we tightened AD permissions" projects are where they go missing.

Microsoft's read-only viewer (from the ADSyncConfig module that ships with Entra Connect):

Import-Module 'C:\Program Files\Microsoft Azure Active Directory Connect\AdSyncConfig\AdSyncConfig.psm1'
Get-ADSyncADConnectorAccount
Show-ADSyncADObjectPermissions -ADobjectDN 'DC=contoso,DC=com'   # repeat for each domain root

A narrower read with the ActiveDirectory module. It looks only for the two extended rights by their schema GUIDs:

Import-Module ActiveDirectory
$acct = 'MSOL_1a2b3c4d5e6f'                   # the account from Connect to Active Directory Forest
$root = (Get-ADDomain).DistinguishedName      # run against each domain in the forest
$need = @{
  '1131f6aa-9c07-11d1-f79f-00c04fc2dcd2' = 'Replicating Directory Changes'
  '1131f6ad-9c07-11d1-f79f-00c04fc2dcd2' = 'Replicating Directory Changes All'
}
(Get-Acl -Path "AD:\$root").Access |
  Where-Object { $_.IdentityReference -like "*\$acct" -and $need.ContainsKey($_.ObjectType.ToString()) } |
  Select-Object @{n = 'Right'; e = { $need[$_.ObjectType.ToString()] }}, AccessControlType, IdentityReference, IsInherited
Result Read it as
Both rights listed as Allow Permissions aren't the 8453 cause on this domain. Check the next domain, then reachability
One or both missing Matches RPC 8453. Microsoft's fix is Set-ADSyncPasswordHashSyncPermissions (sets both rights at the domain root only) or the troubleshooter's permission option
Nothing listed, but the account is in a group that has the rights The filter above only matches ACEs granted to the account by name. Use Show-ADSyncADObjectPermissions or the troubleshooter before you conclude anything
A Deny entry for either right Someone hardened replication rights. Find out why before you remove it

Reachability. If the Connect server can't reach every domain controller, Microsoft's manual steps say to configure Only use preferred domain controllers on the AD connector (Configure Directory Partitions). The same list is used for password sync, import, and export, and the ADSync service needs a restart to apply it. Event 616 points at a failing preferred DC.

Step 5: One user. Follow the object and read its password sync log

The quickest route is Microsoft's wizard: Troubleshoot > Troubleshoot password hash synchronization > Password isn't synchronized for a specific user account. It checks the object in the AD connector space, the metaverse, and the Entra connector space, confirms a sync rule with password sync enabled applies, and shows the last sync attempt. The same diagnostic from PowerShell:

Import-Module ADSyncDiagnostics
Invoke-ADSyncDiagnostics -PasswordSync -ADConnectorName 'contoso.com' -DistinguishedName 'CN=Bob Taylor,OU=Staff,DC=contoso,DC=com'

To read the raw log yourself (read-only):

Import-Module ADSync
$cs = Get-ADSyncCSObject -ConnectorName 'contoso.com' -DistinguishedName 'CN=Bob Taylor,OU=Staff,DC=contoso,DC=com'
$cs | Format-List                      # no object = not in the AD connector space (filtering / scope)

# Connector space object log = the password sync history for this object (kept 7 days by default)
Get-ADSyncCSObjectLog -Identifier $cs.ObjectId -Count 10 | Format-List

In the UI it's the same data: Connectors > [AD connector] > Search Connector Space (scope DN or Anchor) > Properties > Log. Microsoft's status values:

Status Microsoft's description Read it as
Success Password has been successfully synchronized Sync worked. Go to Step 7 (the sign-in)
FilteredByTarget Password is set to User must change password at next logon; not synchronized Temporary password. Step 6
NoTargetConnection No object in the metaverse or in the Entra connector space The user isn't joined/provisioned to Entra. Check filtering and the Entra connector
SourceConnectorNotPresent No object found in the on-premises AD connector space Out of scope on the AD side (domain/OU/attribute filtering)
TargetNotExportedToDirectory The object in the Entra connector space hasn't been exported yet New user waiting for the next export, or blocked by an export error (see the sync errors post)
Error / Unknown Unknown service error / error processing a batch Event log for the same time (Step 3)
MissingAttribute / RetryRequestedByTarget Kerberos hash (or similar) needed by Microsoft Entra Domain Services wasn't available / is being retried Only relevant if you run Entra Domain Services
(log is empty) Microsoft: Entra Connect can't read the password hash from AD Treat it as a connectivity or permission problem (Steps 3–4)

If the log is fine but you're not sure the object is wired correctly, Microsoft's manual check on the same Properties dialog:

  • Lineage tab: at least one rule in the PasswordSync column is True (default: In from AD - User AccountEnabled).
  • Metaverse Object Properties: no cloudFiltered attribute, and domainFQDN / domainNetBios have the values you expect.
  • Connectors tab: the object has connectors to both AD and Entra ID. The Entra row's Lineage shows an outbound rule with PasswordSync True (default: Out to Microsoft Entra ID - User Join).

Two scope facts from Microsoft that explain a lot of "just this one user" tickets: password sync is supported only for the user object type, not iNetOrgPerson, and you can't pick a subset of users for PHS. The only scoping is per connector.

Step 6: The password itself (temporary, expired, or overwritten)

Read the AD side and the Entra side of the same user side by side (read-only):

# On-premises (RSAT ActiveDirectory)
Get-ADUser -Identity 'bob' -Properties pwdLastSet, PasswordLastSet, PasswordExpired, PasswordNeverExpires, AccountExpirationDate |
  Select-Object SamAccountName, ObjectClass, Enabled, PasswordLastSet,       # PasswordLastSet is local time
    @{n = 'MustChangeAtNextLogon'; e = { $_.pwdLastSet -eq 0 }}, PasswordExpired, AccountExpirationDate

# Entra (Microsoft Graph PowerShell)
Connect-MgGraph -Scopes 'User.Read.All'
Get-MgUser -UserId '[email protected]' -Property userPrincipalName, onPremisesSyncEnabled, onPremisesLastSyncDateTime, lastPasswordChangeDateTime, passwordPolicies |
  Select-Object UserPrincipalName, OnPremisesSyncEnabled, OnPremisesLastSyncDateTime, LastPasswordChangeDateTime, PasswordPolicies   # UTC
Finding Microsoft's documented behavior Read it as
MustChangeAtNextLogon = True, log says FilteredByTarget Temporary passwords sync only with Entra Connect 2.0.3.0+ and the ForcePasswordChangeOnLogon feature (UserForcePasswordChangeOnLogonEnabled) on. Without it, the client doesn't try Expected. The user changes the password on-premises, or you deliberately enable the feature (below)
New AD user created with "must change at next logon" and PHS was off at the time The cloud account has no password, so sign-in shows "Your account or password is incorrect" Microsoft's fix: clear the checkbox in AD, select it again, and let the next sync run
PasswordExpired = True on-premises, user still signs in to the cloud with it By default, synced users' cloud passwords are set to never expire. Connect writes DisablePasswordExpiration to passwordPolicies each time it syncs a hash (unless CloudPasswordPolicyForPasswordSyncedUsersEnabled is on) Expected by default. The cloud password updates the next time it changes on-premises
AccountExpirationDate in the past, cloud account still works accountExpires isn't synchronized Expected. Microsoft recommends a scheduled script that disables the AD account at expiry
Admin reset the password in Entra ID earlier A cloud reset overrides the synced password until the next on-premises change, which then overrides it again Ask who reset what, and when
LastPasswordChangeDateTime older than the AD PasswordLastSet lastPasswordChangeDateTime is when the Entra user last changed or created their password Our reading: for a synced user, a newer AD change with an older cloud value suggests the hash hasn't landed. A pointer, not proof. Confirm with the Step 5 log
PasswordPolicies contains DisablePasswordExpiration Set by Connect when a hash syncs (default configuration) At least one hash has synced for this user at some point

Before you turn on ForcePasswordChangeOnLogon: Microsoft cautions to use it only when Self-Service Password Reset and password writeback are enabled, so a password the user sets in the cloud flows back to AD.

Step 7: Synced, but the sign-in still fails or still takes the old password

If the log says Success and the timestamps line up, read the sign-in instead of the sync. Read-only (or use Sign-in logs in the Entra admin center). Microsoft says the sign-in log API needs a Microsoft Entra ID P1 or P2 license in the tenant, plus AuditLog.Read.All:

Connect-MgGraph -Scopes 'AuditLog.Read.All'
$since = (Get-Date).ToUniversalTime().AddHours(-24).ToString('yyyy-MM-ddTHH:mm:ssZ')
Get-MgAuditLogSignIn -Filter "userPrincipalName eq '[email protected]' and createdDateTime ge $since" -All |
  Sort-Object CreatedDateTime -Descending |
  Select-Object CreatedDateTime, AppDisplayName, ClientAppUsed,
    @{n = 'ErrorCode'; e = { $_.Status.ErrorCode }}, @{n = 'Reason'; e = { $_.Status.FailureReason }}
Error code Microsoft's meaning Read it as
50126 Invalid username or password Wrong password for the hash Entra has. Compare the attempt time with the Step 5 Success time
50055 The password is expired Cloud expiration is being enforced (for example CloudPasswordPolicyForPasswordSyncedUsersEnabled or a cloud-managed user)
50053 Account locked (too many attempts) or sign-in blocked from a malicious IP Often an old password still saved on a phone or mail client hammering the account

And the session side. Microsoft says a synced password change doesn't affect a session that's already signed in. The user is asked for the new password when the service next requires authentication, and Keep me signed in can stretch that out. A device still using a cached session isn't proof that sync failed. The Outlook keeps asking for my password card covers the client side.

Timing: when "still broken" is just waiting

Event Microsoft's timing
Password hash sync cycle Every 2 minutes. Can't be changed
On-premises password change reaching Entra ID "Most often in a matter of minutes"
Heartbeat (Event 654) when nothing is pending Every 30 minutes, per AD connector
Troubleshooter's heartbeat look-back 3 hours
Connect Health "heartbeat was skipped" alert No PHS connection to Entra ID in the last 120 minutes
Per-object password sync results Kept 7 days by default
Directory sync scheduler (creates the cloud object a new user's hash needs) Every 30 minutes by default
Sessions already signed in Not affected by the change; the new password is needed at the next authentication

A brand-new AD user needs two things in order: the object exported by the regular sync cycle, then the hash. Until the export happens, the log shows TargetNotExportedToDirectory.

When a change is justified

Finding Prefer Avoid
Staging mode on the server you were reading Read the active server. Switch roles only as a deliberate, planned change "Fixing" PHS on the staging server, or running two active servers
Feature or connector channel disabled Microsoft's path: in the wizard, Customize synchronization options, clear password hash sync, run the wizard again and re-enable it, then re-read Step 2 Flipping Set-ADSyncAADPasswordSyncConfiguration per connector without knowing why it was off
No heartbeat / Health "stopped working" Microsoft's alert remediation is restarting the Microsoft Entra ID Sync service, when no sync operation is running Restarting it mid-cycle, or rebooting before you've read the 611/652/655 events
611 + 8453 Grant exactly the two rights at each domain root with Set-ADSyncPasswordHashSyncPermissions or the troubleshooter Adding the connector account to Domain Admins, or granting the rights to a broad group
611 + 1722 / 0x5 Fix the network path or the hardening policy with the AD and network teams. Use preferred DCs if some DCs are unreachable by design Opening every RPC port to the sync server without knowing which DC it's calling
No heartbeat after the channel is fixed Microsoft's trigger a full sync of all passwords script, once Running it repeatedly. Microsoft says repeated need means something else is wrong; open a support case
One user's hash is stale and everything else is healthy Fix the cause from the log, then a single-object retry (Invoke-ADSyncCSObjectPasswordHashSync for that DN) A full password sync for the whole forest to fix one user
FilteredByTarget on a user who needs to sign in now Have the user change the password on-premises, or set a non-temporary password Enabling ForcePasswordChangeOnLogon without SSPR and password writeback in place
Expired-on-prem users still working in the cloud Decide deliberately on CloudPasswordPolicyForPasswordSyncedUsersEnabled and the domain expiry policy. Set DisablePasswordExpiration again on service accounts that need it Enabling cloud expiry tenant-wide on a Friday without listing service accounts first
accountExpires relied on for leavers A scheduled script that disables expired AD accounts (Microsoft's recommendation) Assuming an expired AD account can't sign in to Microsoft 365
FIPS-locked server with MD5 failures Microsoft's documented enforceFIPSPolicy change, after checking the version-specific known issue Editing miiserver.exe.config on a hunch

FAQ

Why is password hash sync not working in Entra Connect?
Most cases fall into one of four buckets: the server is in staging mode or the feature/channel is off, the per-forest channel stopped (no Event 654 heartbeat), the AD DS connector account can't replicate hashes (Event 611 with RPC 8453 or 1722), or a single user is out of scope, unexported, or has a temporary password. Run the wizard's Troubleshoot password hash synchronization task first. It checks most of these in one go.

What does "Password Hash Synchronization heartbeat was skipped in last 120 minutes" mean?
It's a Microsoft Entra Connect Health alert. Microsoft's description is that PHS hasn't connected with Entra ID in the last 120 minutes, so passwords won't sync. Read the Directory Synchronization events (611, 652, 655) and the per-connector heartbeat before you take Microsoft's documented remediation, restarting the Microsoft Entra ID Sync service, at a time when no sync cycle is running.

How do I fix Event 611 "Replication access was denied"?
RPC error 8453 inside Event 611 means the AD DS connector account is missing Replicating Directory Changes and/or Replicating Directory Changes All at the domain root. Confirm the account and read the domain root's permissions. Then grant exactly those two rights with Set-ADSyncPasswordHashSyncPermissions or the Entra Connect troubleshooter, on every domain in the forest.

How often does password hash sync run?
Every 2 minutes, and Microsoft says the interval can't be changed. That's separate from the 30-minute directory sync scheduler. A new user needs the scheduler to export the object before the hash can land. When nothing is pending, each AD connector logs a heartbeat (Event 654) every 30 minutes.

Why can a user still sign in with an expired AD password?
By default, a synced user's cloud password is set to never expire. Entra Connect writes DisablePasswordExpiration to the user's passwordPolicies when it syncs the hash. The cloud password only changes the next time the password changes on-premises. To enforce cloud expiration for synced users, Microsoft documents the CloudPasswordPolicyForPasswordSyncedUsersEnabled feature, ideally enabled before PHS is turned on.

Related posts

Free checklist

Password hash sync is more than a sign-in method. Microsoft's leaked credentials risk detection in Identity Protection needs PHS for on-premises passwords, and that detection is one of the signals risk-based Conditional Access acts on. If you're heading toward enforcing Conditional Access, the free Conditional Access pre-enforcement checklist keeps break-glass accounts, pilot groups, and report-only review on one page:

👉 https://cashflow4375.gumroad.com/l/ujkqxb?utm_source=devto&utm_medium=article&utm_campaign=aps_first_sale&utm_content=entra-connect-password-hash-sync-not-working

If you want the rest of the identity and Intune runway written down for the team (enrollment hygiene, compliance phasing, break/fix cards and read-only PowerShell snapshots), the Intune & M365 Admin Starter Pack pairs with this triage: https://cashflow4375.gumroad.com/l/joonf?utm_source=devto&utm_medium=article&utm_campaign=aps_first_sale&utm_content=entra-connect-password-hash-sync-not-working

Admin Pack Studio; not affiliated with Microsoft. Steps 1–7 only read (the Graph calls are GET-only; the ADSync, ADSyncConfig, and AD cmdlets shown are Get-/Show- reads and the Microsoft diagnostics) until you deliberately change connector permissions, sync features, service state, or a user's password. Fix the channel before you touch individual users, run a full password sync at most once, and check current Microsoft docs for feature names and defaults.

📰 Read the original article on Dev.to Security

Originally published by Dev.to Security. Aggregated on AIWithGhost for educational purposes — full credit and traffic to the original publisher.