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 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.
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 phase | Security context | What Microsoft says it tracks |
|---|---|---|
| Device preparation | Device | Secure your hardware, join your organization's network, register your device for mobile management |
| Device setup | Device | Security 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 setup | User | Security 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.
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.
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.
- Intune applies the highest-priority profile assigned to the device.
- 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.
- 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 node | Device scope | User scope |
|---|---|---|
| SkipDeviceStatusPage | Yes | No |
| SkipUserStatusPage | Yes | No |
| BlockInStatusPage | Yes | No |
| TimeOutUntilSyncFailure | Yes | No |
| IsSyncDone | Yes | Yes |
| ServerHasFinishedProvisioning | Yes | Yes |
| WasDeviceSuccessfullyProvisioned | Yes | Yes |
| AllowCollectLogsButton | Yes | Yes |
| ExpectedPolicies | Yes | Yes |
| ExpectedMSIAppPackages | Yes | Yes |
| ExpectedModernAppPackages | Yes | Yes |
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.
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.
- Scripts. Microsoft lists as a known issue that scripts configured to run using the logged-on credentials might not execute during ESP. The documented workaround is to run them in System context instead. A user-context script has no context to run in during the device phases.
- Reboots. Reboots are supported during the device setup phase and are not supported during account setup. A reboot during device setup also forces the user to re-enter credentials before account setup can begin, because those credentials are not preserved.
- Hybrid join. When using Microsoft Entra hybrid join, Win32 and UWP apps assigned to the device with a user installation context are not tracked during provisioning at all. That is a device assignment with a user-context payload, which belongs cleanly to neither side.
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.
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.
| Relative path | Context | What it tells you |
|---|---|---|
| Device\DevicePreparation\PolicyProviders\{Provider}\InstallationState | Device | 1 NotInstalled, 2 NotRequired, 3 Completed, 4 Error |
| Device\DevicePreparation\PolicyProviders\{Provider}\LastError | Device | HRESULT the provider set; the ESP reads it only when InstallationState is 4 |
| Device\DevicePreparation\PolicyProviders\{Provider}\Timeout | Device | Minutes the provider may run; documented default is 15 when absent |
| Device\DevicePreparation\PolicyProviders\{Provider}\TrackedResourceTypes\Apps | Device | Whether the provider registered for app provisioning |
| Device\Setup\Apps\Locked | Device | Whether device use is blocked until device setup completes |
| Device\Setup\Apps\PolicyProviders\{Provider}\TrackingPoliciesCreated | Device | Whether the tracking policy for device setup was built |
| Device\Setup\Apps\Tracking\{Provider}\{AppName}\InstallationState | Device | 1 NotInstalled, 2 InProgress, 3 Completed, 4 Error, for device-context apps |
| Device\Setup\Apps\Tracking\{Provider}\{AppName}\RebootRequired | Device | 1 NotRequired, 2 SoftReboot, 3 HardReboot |
| Device\Setup\HasProvisioningCompleted | Device | Set by the ESP when it finishes; providers query it to stop reporting |
| {User SID} | User | Created during account setup; absent if device setup failed |
| {User SID}\Setup\Apps and below | User | Installation state of user-context Win32 apps and the account-setup tracking policy status |
| ESPTrackingInfo\Diagnostics\ExpectedPolicies | Device | Holds only the dummy EntDMID entry, because the ESP does not track security policies |
| ESPTrackingInfo\Diagnostics\ExpectedMSIAppPackages | Device | Timestamped snapshot per line-of-business MSI app |
| ESPTrackingInfo\Diagnostics\ExpectedNetworkProfiles | Device | Timestamped snapshot per Wi-Fi profile |
| ESPTrackingInfo\Diagnostics\ExpectedCertificateProfiles | Device | Timestamped snapshot per SCEP certificate profile |
| ESPTrackingInfo\Diagnostics\ExpectedModernAppPackages | Device | Store app snapshots for device-context deployments |
| ESPTrackingInfo\Diagnostics\{User SID}\ExpectedModernAppPackages | User | Store app snapshots when the app was deployed in user context |
The ESP settings themselves live somewhere else entirely, under the enrollment record.
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.
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.
The channel path is worth writing down once.
| Event ID | Type | Relevance to the device phase |
|---|---|---|
| 100 | Warning | Autopilot profile not yet downloaded; usually transient during device preparation |
| 101 | Info | Numeric OOBE setting retrieved from the profile |
| 103 | Info | String OOBE setting retrieved, such as the Entra tenant name |
| 109 | Info | State-related OOBE setting override retrieved |
| 111 | Info | Profile settings controlling OOBE behaviour were retrieved successfully |
| 153 | Info | Profile state moved to Available, so the device can deploy |
| 160 | Info | Profile settings acquisition beginning |
| 161 | Info | Profile downloaded successfully |
| 163 | Info | Download not required, device already provisioned |
| 164 | Info | Internet available for policy download |
| 171 | Error | TPM identity could not be confirmed; blocks the Secure your hardware step |
| 172 | Error | Profile could not be marked available; typically follows 171 |
| 807 | Error | ZtdDeviceIsNotRegistered |
| 809 | Error | ZtdDeviceHasNoAssignedProfile, assigned profile does not exist |
| 815 | Error | ZtdDeviceHasNoAssignedProfile, and no default profile in the tenant |
| 908 | Error | SerialNumberMismatch or ProductKeyIdMismatch |
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.
- Sign in to the Microsoft Intune admin center.
- Select Devices, expand Device onboarding, then select Enrollment.
- On the Windows tab, under Windows Autopilot, select Enrollment Status Page.
- Select Create, name the profile in Basics, then select Next.
- In Settings, set Show app and profile configuration progress to Yes.
- Set Block device use until all apps and profiles are installed to Yes, so the phases actually gate rather than merely report.
- 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.
- 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.
- Select Next through Scope tags, then Review + create.
- Back on the Enrollment Status Page list, drag your profile so its priority is 1. Priority 1 is the highest.
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
- Open the application, configuration profile or certificate profile in the admin center.
- 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.
- 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.
- 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.
- 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.
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.
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.
References
- Set up the Enrollment Status Page — Microsoft Intune — the three tracked phases, what each phase tracks, the three-step profile selection order, and the quality-update restriction on user-targeted profiles.
- EnrollmentStatusTracking CSP — the two documented trees, the device-only
DevicePreparationnode, and bothInstallationStatevalue sets. - Troubleshoot the Enrollment Status Page (ESP) — the registry subkey layout, the
{User SID}subkey behaviour, and the0xffffffffskip values underFirstSync. - DMClient CSP — the device and user scope of every
FirstSyncStatusnode, including both skip nodes andBlockInStatusPage. - Windows Autopilot troubleshooting FAQ — the Autopilot event channel and the documented event ID catalog.
- Windows Autopilot Enrollment Status Page — the overview statement that ESP profiles are deployed to a licensed Intune user.
Community deep-dives that were fetched, checked and are genuinely on this topic:
| Author | Post | Why it is relevant |
|---|---|---|
| Rudy Ooms | Account Setup, Identifying Security Policies | Walks the account setup phase and the per-user Diagnostics subkeys, including the EntDMID dummy policy entry |
| Rudy Ooms | Something Went Wrong, user account ESP | A concrete case of the account setup phase failing after the device phase succeeded, traced to a user-context restriction |
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.