HomeNewsletterCommunityMVP FeedToolsArchiveBlogToday's NewsAboutServicesQuick Links Subscribe free
← Back to Blog
Autopilot AutopilotEnrollment Status PageESPIntuneEnrollmentStatusTrackingDMClient CSPAssignmentsOOBEWindows 11

The ESP device phase and user phase are two different machines: policy targeted at the wrong one never lands

IA
Imran Awan
21 August 2026

The Enrollment Status Page is usually described as one screen with a progress bar. It is not. It is a sequence of phases, and the phases do not all run as the same identity. The early phases run before any human has signed in. The last phase runs as the person who just signed in. That single fact decides whether the policy you assigned lands before the desktop appears, or forty minutes after the user has already started working.

The short version

The Enrollment Status Page runs a device preparation phase and a device setup phase in device context, then an account setup phase in the signed-in user's context. Device context has no user, so anything assigned only to a user group cannot be enforced by either device phase. Microsoft documents this split directly in the EnrollmentStatusTracking CSP, where the user tree has no DevicePreparation node at all. On a real device you can prove which side of the boundary did what by checking whether a {User SID} subkey exists under the EnrollmentStatusTracking registry key.

The problem: the device reaches the desktop unconfigured

The report always sounds the same. A new laptop finishes the Enrollment Status Page, or ESP, in a reasonable time. The user gets to the desktop. Then the help desk hears that the corporate wireless profile is missing, the certificate has not arrived, and the line-of-business application is nowhere to be found. Nothing failed. Nothing errored. The ESP said everything was fine.

Check the Intune assignments and they look correct. The Wi-Fi profile is assigned. The certificate profile is assigned. The application is assigned as required. Every one of them is assigned to a single group that contains all the staff who get new laptops. That group is a user group.

That is the whole bug. It is not a timing problem, a network problem, or an Intune Management Extension problem. It is a targeting problem. The reason it produces silence rather than an error is that the ESP phase which could have enforced those assignments either never ran, or ran after the point you were watching.

Context: Microsoft states plainly that ESP profiles themselves are deployed to a licensed Intune user, so admins reasonably conclude that user-group targeting is the normal pattern for everything ESP-related. That conclusion is right for the ESP profile and wrong for the payloads the ESP is supposed to gate.

Habit makes this worse. Most Intune tenants started life with user-group assignments, because that is how software distribution worked for twenty years. Autopilot inverted the assumption. During the phases that matter most, there is no user yet.

Why it happens: two phases, two contexts, two rulebooks

Microsoft documents the ESP as tracking three phases. The names matter, because the names map to security contexts.

Documented phaseSecurity contextWhat Microsoft says it tracks
Device preparationDeviceSecure your hardware, join your organization's network, register your device for mobile management
Device setupDeviceSecurity policies, SCEP certificate profiles targeted at devices, VPN and Wi-Fi profiles targeted at devices, apps deployed in device context and targeted to devices
Account setupUserSecurity policies, SCEP certificate profiles assigned to users, Wi-Fi profiles assigned to users, apps assigned to the user

Read the third column twice. Device setup tracks SCEP profiles targeted at devices. Account setup tracks SCEP profiles assigned to users. These are two separate tracking lists, built from two separate assignment scopes. The ESP does not merge them.

There is even an asymmetry inside that table. Device setup tracks VPN and Wi-Fi profiles. Account setup tracks Wi-Fi profiles only. A user-assigned VPN profile has no documented tracking slot in either phase.

The CSP proves the boundary is structural

The clearest evidence is not in the Intune documentation. It is in the EnrollmentStatusTracking configuration service provider, or CSP. That CSP publishes two separate trees, and they are not the same shape.

EnrollmentStatusTracking CSP — the two documented trees
./Device/Vendor/MSFT/EnrollmentStatusTracking ----DevicePreparation # device context ONLY - no user equivalent exists --------PolicyProviders ------------ProviderName ----------------InstallationState ----------------LastError ----------------Timeout ----------------TrackedResourceTypes/Apps ----Setup # read during the DEVICE SETUP phase in device context --------Apps/PolicyProviders/... --------Apps/Tracking/... --------HasProvisioningCompleted ./User/Vendor/MSFT/EnrollmentStatusTracking ----Setup # read during the ACCOUNT SETUP phase in user context --------Apps/PolicyProviders/... --------Apps/Tracking/... --------HasProvisioningCompleted # Note what is missing above: the user tree has NO DevicePreparation node.

Microsoft describes the Setup node in one sentence that settles the argument. It provides the settings that the ESP reads during the account setup phase in the user context, and during the device setup phase in the device context. Same node name, two instantiations, two different phases. The device tree additionally carries DevicePreparation, which Microsoft marks as supported only in device context.

So the boundary is not a convention. It is the shape of the CSP. A user-context provider has no way to register a device preparation block, because the node it would register under does not exist in the user tree.

Gotcha: the same value name means different things on either side of the boundary. Under DevicePreparation/PolicyProviders/{Provider}/InstallationState the documented values are 1 NotInstalled, 2 NotRequired, 3 Completed, 4 Error. Under Setup/Apps/Tracking/{Provider}/{AppName}/InstallationState they are 1 NotInstalled, 2 InProgress, 3 Completed, 4 Error. A 2 means "skip me" in device preparation and "still working" in either setup phase. Decode it against the wrong node and you reach the opposite conclusion.

Which ESP profile the device gets is decided device-first

Assignment targeting also decides which ESP profile applies. Microsoft documents a three-step selection order, and the order is not alphabetical or arbitrary.

  1. Intune applies the highest-priority profile assigned to the device.
  2. If no profiles are targeted at the device, Intune applies the highest-priority profile assigned to the user. Microsoft adds that this only works where there is a user, and that in pre-provisioning and self-deploying scenarios only device-targeted profiles are applied.
  3. If nothing is assigned to either, Intune applies the Default ESP profile.

The consequence is easy to miss. A single device-targeted ESP profile anywhere in scope wins outright, and your carefully prioritised user-targeted profile is never consulted. A tenant can hold up to 51 ESP profiles, the Default plus 50, so there is plenty of room for one forgotten device-targeted profile to shadow everything else.

One ESP setting makes the asymmetry explicit. Microsoft states that the Install Windows quality updates setting does not support user-targeted ESP profiles at all. The device uses the highest-priority device-targeted profile instead, which is typically the Default profile.

The skip switches for both phases are device-scoped

Here is the detail that surprises even experienced engineers. The two nodes that decide whether each phase is displayed both live in the device half of the DMClient CSP.

DMClient FirstSyncStatus nodeDevice scopeUser scope
SkipDeviceStatusPageYesNo
SkipUserStatusPageYesNo
BlockInStatusPageYesNo
TimeOutUntilSyncFailureYesNo
IsSyncDoneYesYes
ServerHasFinishedProvisioningYesYes
WasDeviceSuccessfullyProvisionedYesYes
AllowCollectLogsButtonYesYes
ExpectedPoliciesYesYes
ExpectedMSIAppPackagesYesYes
ExpectedModernAppPackagesYesYes

SkipUserStatusPage controls the user phase, but it is a device-only node. So a device-scoped setting can delete the only phase capable of enforcing user-targeted assignments, and nothing in the user's own configuration can restore it. Microsoft documents the CSP default for both skip nodes as true, which is why an enrollment that never received an explicit ESP policy shows no ESP at all.

Watch out: setting SkipUserStatusPage is the standard advice for making OOBE feel faster, and it is a genuinely valid choice. But it removes the account setup phase entirely. Every user-assigned certificate, Wi-Fi profile and application then installs after the desktop appears, with no gate and no progress indicator. Do not apply that setting and then keep relying on user-group assignment for anything a user needs at first login.

Three more documented consequences of the boundary

Once you see the boundary, several long-standing Autopilot oddities stop being mysterious.

Context: Windows Autopilot device preparation, sometimes called Autopilot v2, does not use the ESP. Microsoft says so explicitly when explaining why the quality-update setting and the LOB-plus-Win32 mixing restriction do not apply there. If you are troubleshooting a device preparation deployment, none of the registry state in this article will exist.

How to verify: read which phase this device actually recorded

You do not have to guess which side of the boundary did what. Microsoft documents the registry surface, and the top-level subkey list is the answer on its own.

Registry Editor
Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Autopilot\EnrollmentStatusTracking
|-- Device  (device context: DevicePreparation and Setup)
|-- DevicePreparation\PolicyProviders\Sidecar
|-- Setup\Apps\Tracking\Sidecar\Win32App_APPID
|-- ESPTrackingInfo  (Diagnostics snapshots)
|-- Diagnostics\ExpectedPolicies
|-- Diagnostics\S-1-5-21-USERRID\ExpectedModernAppPackages
|-- S-1-5-21-USERRID  (user context: account setup phase)

That bottom entry is the whole diagnostic. Microsoft documents the {User SID} subkey as being created during the account setup phase, and states that it will not be created if the device setup phase fails. Its presence proves a user phase ran. Its absence proves one did not.

Registry reference for the whole feature area

Every path below hangs off one parent key.

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Autopilot\EnrollmentStatusTracking
Relative pathContextWhat it tells you
Device\DevicePreparation\PolicyProviders\{Provider}\InstallationStateDevice1 NotInstalled, 2 NotRequired, 3 Completed, 4 Error
Device\DevicePreparation\PolicyProviders\{Provider}\LastErrorDeviceHRESULT the provider set; the ESP reads it only when InstallationState is 4
Device\DevicePreparation\PolicyProviders\{Provider}\TimeoutDeviceMinutes the provider may run; documented default is 15 when absent
Device\DevicePreparation\PolicyProviders\{Provider}\TrackedResourceTypes\AppsDeviceWhether the provider registered for app provisioning
Device\Setup\Apps\LockedDeviceWhether device use is blocked until device setup completes
Device\Setup\Apps\PolicyProviders\{Provider}\TrackingPoliciesCreatedDeviceWhether the tracking policy for device setup was built
Device\Setup\Apps\Tracking\{Provider}\{AppName}\InstallationStateDevice1 NotInstalled, 2 InProgress, 3 Completed, 4 Error, for device-context apps
Device\Setup\Apps\Tracking\{Provider}\{AppName}\RebootRequiredDevice1 NotRequired, 2 SoftReboot, 3 HardReboot
Device\Setup\HasProvisioningCompletedDeviceSet by the ESP when it finishes; providers query it to stop reporting
{User SID}UserCreated during account setup; absent if device setup failed
{User SID}\Setup\Apps and belowUserInstallation state of user-context Win32 apps and the account-setup tracking policy status
ESPTrackingInfo\Diagnostics\ExpectedPoliciesDeviceHolds only the dummy EntDMID entry, because the ESP does not track security policies
ESPTrackingInfo\Diagnostics\ExpectedMSIAppPackagesDeviceTimestamped snapshot per line-of-business MSI app
ESPTrackingInfo\Diagnostics\ExpectedNetworkProfilesDeviceTimestamped snapshot per Wi-Fi profile
ESPTrackingInfo\Diagnostics\ExpectedCertificateProfilesDeviceTimestamped snapshot per SCEP certificate profile
ESPTrackingInfo\Diagnostics\ExpectedModernAppPackagesDeviceStore app snapshots for device-context deployments
ESPTrackingInfo\Diagnostics\{User SID}\ExpectedModernAppPackagesUserStore app snapshots when the app was deployed in user context

The ESP settings themselves live somewhere else entirely, under the enrollment record.

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Enrollments\{EnrollmentGUID}\FirstSync

Microsoft documents that when either skip node is configured, the matching value under that key is set to 0xffffffff. That is the fastest way to confirm a phase was deliberately suppressed rather than silently broken.

PowerShell — on the device (run elevated)
$root = 'HKLM:\SOFTWARE\Microsoft\Windows\Autopilot\EnrollmentStatusTracking' Get-ChildItem -LiteralPath $root | Select-Object -ExpandProperty PSChildName # Healthy user-driven Autopilot: Device, ESPTrackingInfo, and one S-1-5-21-... subkey. # Only "Device" comes back? No account setup phase was ever recorded here. Get-ChildItem 'HKLM:\SOFTWARE\Microsoft\Enrollments' | ForEach-Object { Join-Path $_.PSPath 'FirstSync' } | Where-Object { Test-Path $_ } | Get-ItemProperty | Select-Object SkipDeviceStatusPage, SkipUserStatusPage, BlockInStatusPage # SkipUserStatusPage of -1 is 0xffffffff, which means the user phase was skipped.
Tip: compare the two counts, not the two states. Count the entries under Device\Setup\Apps\Tracking and the entries under {User SID}\Setup\Apps\Tracking, then compare each against what you assigned to device groups and user groups respectively. A user-side count of zero when you assigned six required apps to a user group is the finding. Nothing will be marked as failed, because nothing was ever tracked.

What the event log can and cannot tell you

Autopilot writes to its own channel, which you can read in Event Viewer.

Event Viewer — ModernDeployment-Diagnostics-Provider › Autopilot
Warning100Autopilot policy [name] not found
Info160AutopilotRetrieveSettings beginning acquisition
Info161AutopilotManager retrieve settings succeeded
Info153State changed from ProfileState_Unknown to ProfileState_Available
Error171Failed to set TPM identity confirmed. HRESULT=[code]
Error172Failed to set Autopilot profile as available. HRESULT=[code]

The channel path is worth writing down once.

Applications and Services Logs > Microsoft > Windows > ModernDeployment-Diagnostics-Provider > Autopilot
Event IDTypeRelevance to the device phase
100WarningAutopilot profile not yet downloaded; usually transient during device preparation
101InfoNumeric OOBE setting retrieved from the profile
103InfoString OOBE setting retrieved, such as the Entra tenant name
109InfoState-related OOBE setting override retrieved
111InfoProfile settings controlling OOBE behaviour were retrieved successfully
153InfoProfile state moved to Available, so the device can deploy
160InfoProfile settings acquisition beginning
161InfoProfile downloaded successfully
163InfoDownload not required, device already provisioned
164InfoInternet available for policy download
171ErrorTPM identity could not be confirmed; blocks the Secure your hardware step
172ErrorProfile could not be marked available; typically follows 171
807ErrorZtdDeviceIsNotRegistered
809ErrorZtdDeviceHasNoAssignedProfile, assigned profile does not exist
815ErrorZtdDeviceHasNoAssignedProfile, and no default profile in the tenant
908ErrorSerialNumberMismatch or ProductKeyIdMismatch
Gotcha: notice what is not in that catalog. Microsoft publishes no per-phase ESP event IDs, so there is no event that says "account setup phase started" or "user phase skipped". For unexpected restarts there is one documented event on the MDM_DIAGNOSTICS_ADMIN_CHANNEL, symbol RebootRequiredURI with value 2800, which names the URI that triggered the reboot. Beyond that, the registry is the documented surface for phase state. Do not go hunting for an ESP event ID that does not exist.

The fix: target the phase you need, then prove the targeting

The fix is not a setting. It is a rule you apply to every assignment. Decide which phase must enforce it, then assign to the scope that phase can see.

Step 1: give the ESP profile a device-group assignment

Because selection is device-first, a device-targeted ESP profile is the only one you can rely on in every scenario, including pre-provisioning and self-deploying.

intune.microsoft.comDevices › Device onboarding › EnrollmentWindows tabEnrollment Status Page
  1. Sign in to the Microsoft Intune admin center.
  2. Select Devices, expand Device onboarding, then select Enrollment.
  3. On the Windows tab, under Windows Autopilot, select Enrollment Status Page.
  4. Select Create, name the profile in Basics, then select Next.
  5. In Settings, set Show app and profile configuration progress to Yes.
  6. Set Block device use until all apps and profiles are installed to Yes, so the phases actually gate rather than merely report.
  7. Set Turn on log collection and diagnostics page for end users to Yes. That also enables the Windows 11 diagnostics page, reachable with CTRL + SHIFT + D.
  8. Select Next, and in Assignments pick a group of devices, not users. Filters are supported, but restricted to rules on model, manufacturer, osVersion, operatingSystemSKU, deviceOwnership and enrollmentProfileName.
  9. Select Next through Scope tags, then Review + create.
  10. Back on the Enrollment Status Page list, drag your profile so its priority is 1. Priority 1 is the highest.
Gotcha: there is no Group Policy equivalent for any of this. The ESP is configured purely through Intune and the underlying DMClient and EnrollmentStatusTracking CSPs. Microsoft also documents that the ESP does not apply to a Windows device that was enrolled with Group Policy. If you need to reach an individual node such as SkipUserStatusPage, the only route is a custom OMA-URI profile using ./Vendor/MSFT/DMClient/Provider/MS DM Server/FirstSyncStatus/SkipUserStatusPage with data type Boolean.

Step 2: move anything that must land before the desktop to a device group

intune.microsoft.comApps › Windowsselect the app › PropertiesAssignments › Required
  1. Open the application, configuration profile or certificate profile in the admin center.
  2. Edit its Assignments and add a group containing the devices, using a Required assignment. Microsoft is explicit that ESP tracking needs a required assignment to a group containing the device for device-targeted items, or the user for user-targeted items.
  3. For applications, confirm the install context is device and that there are no user-context applicability rules. Microsoft lists both as conditions for ESP tracking.
  4. Keep line-of-business MSI apps and Win32 apps out of the same ESP run. Both use TrustedInstaller, which does not permit simultaneous installations, and the documented failure is Another installation is in progress, please try again later.
  5. If a payload genuinely must be per-user, accept that it belongs to the account setup phase, and keep the user status page enabled so that phase exists.

One caveat on the blocking-apps list. Microsoft explains it as a filter, not an instruction. If you list App 1, App 2 and App 3, but App 3 and App 4 are the apps actually targeted, the ESP tracks App 3 only. In user-driven and self-deploying modes, App 4 is not even installed until after the ESP completes when it is a Win32, Microsoft Store or Enterprise app catalog app.

Tip: write the rule down for your team as a single sentence. If the user must have it at first login, assign it to a device group; if it is genuinely personal, assign it to a user group and keep the account setup phase enabled. Reviewing assignments against that sentence catches this class of bug in minutes.

Proof it worked: a real phase boundary report

The companion script reads only the documented registry state described above, and reports which phases this device recorded in which context. It is read-only, needs no PowerShell module, and aborts rather than printing a partial report if any read fails. Below is a genuine run, with the host name and enrollment identifier redacted.

PowerShell 5.1 — Get-EspPhaseBoundaryReport.ps1 (real run, identifiers redacted)
Host : CONTOSO-1234 Elevated : True Top level records under EnrollmentStatusTracking Device (SYSTEM context, device phases) : PRESENT ESPTrackingInfo (Diagnostics snapshots) : ABSENT {User SID} (user context, account setup) : ABSENT Phase 1 - Device preparation (device context, no user signed in) Provider : ConfigMgr InstallationState : 3 Completed Timeout (minutes) : not set, so the documented default of 15 applies Phase 2 - Device setup (device context, device-targeted assignments only) Provider ConfigMgr TrackingPoliciesCreated : 1 Tracked by ConfigMgr: ProvisioningTS : 3 Completed Device-context apps tracked : 1 , in Error state : 0 Phase 3 - Account setup (user context, user-targeted assignments) NO USER PHASE RECORD ON THIS DEVICE. # The {User SID} subkey was never created, so no account setup phase ran. FirstSync settings that gate each phase Enrollment {aaaaaaaa-0b0b-1c1c-2d2d-333333333333} - FirstSync SkipDeviceStatusPage = 0 SkipUserStatusPage = -1 BlockInStatusPage = 7 IsSyncDone = 1 # -1 is 0xffffffff: the user status page was configured to be skipped. VERDICT Device phases recorded (SYSTEM context) : YES Account setup recorded (user context) : NO Device-context apps tracked : 1 User-context apps tracked : 0 READ THIS: the device phases ran but no account setup phase was recorded.

That output is the whole article in one screen. The device phases ran and completed. The account setup phase does not exist on this machine, and FirstSync shows exactly why, because SkipUserStatusPage is set to 0xffffffff. Any application, certificate or Wi-Fi profile assigned to a user group on this device had no ESP phase in which to be enforced. It was never going to appear before the desktop, and no error was ever going to be raised.

Two details are worth calling out in that run. First, the provider is named ConfigMgr rather than Sidecar, because this device was enrolled through Configuration Manager co-management rather than user-driven Autopilot. Microsoft documents that the ESP lists installation status for all enrollment methods, co-management included. Second, BlockInStatusPage is 7, which under the documented flag values is 0x1 plus 0x2 plus 0x4, so the page blocks and offers Reset PC, Try Again and Continue Anyway on failure.

Run the script on a device that behaved as expected and on one that did not, then compare the two verdict blocks. If the working device has a {User SID} record and the broken one does not, you have found the boundary rather than guessed at it.

Context: one known issue is worth ruling out first. Microsoft documents that the ESP can sit in the Identifying state indefinitely if the current user has no Intune license assigned, because that is when Intune computes the ESP policies. That failure looks like a stuck user phase, but the cause is licensing rather than targeting.

References

Community deep-dives that were fetched, checked and are genuinely on this topic:

AuthorPostWhy it is relevant
Rudy OomsAccount Setup, Identifying Security PoliciesWalks the account setup phase and the per-user Diagnostics subkeys, including the EntDMID dummy policy entry
Rudy OomsSomething Went Wrong, user account ESPA concrete case of the account setup phase failing after the device phase succeeded, traced to a user-context restriction
PowerShell — companion script

Download it from Imran76Awan/Windows-Autopilot-Scripts — no sign-in required. It is read-only: it reports and never changes a device or anything in Intune. Validate it in your own environment before relying on the output.

Get-EspPhaseBoundaryReport.ps1 — Reports which Enrollment Status Page (ESP) phases a Windows device recorded, in which
View all scripts on GitHub
Was this post helpful?
React below — no account needed
Share this post
LinkedIn X / Twitter Reddit Bluesky

More from EndpointWeekly

Autopilot
Which apps actually block the Enrollment Status Page (and why…
You set the ESP to block until your required apps install, it cleared in four minutes,…
Autopilot
The ESP Hit Its Time Limit, The User Clicked Continue Anyway,…
The Enrollment Status Page time limit is not a patience setting. It is the moment Windows…
Autopilot
Autopilot pre-provisioning: the reseal step is the part everyone…
The green success screen at the end of an Autopilot technician flow confirms enrollment,…