HomeNewsletterCommunityMVP FeedToolsArchiveBlogToday's NewsAboutServicesQuick Links Subscribe free
← Back to Blog
Autopilot AutopilotIntuneEnrollment Status PageEnrollment RestrictionsMicrosoft GraphPowerShellWindows 11Device Enrollment

Enrollment Configuration Priority: Why Your Second ESP Profile Never Applied

IA
Imran Awan
21 August 2026

You built a second Enrollment Status Page profile for a pilot ring. You gave it a 120 minute timeout instead of the 60 minute default. You assigned it to the pilot group. Then you provisioned a pilot device and watched it time out at exactly 60 minutes. No conflict warning. No error in the portal. Nothing in the assignment report to explain it. The profile you created simply did not happen.

This is not a bug, and it is not a replication delay. It is the documented behaviour of a whole family of Intune policy that most administrators assume works like device configuration profiles. It does not. Device enrolment configurations are priority ordered, and exactly one of them wins per device. Everything else in the list is discarded silently.

The short version

Device configuration profiles merge setting by setting, and Intune shows you a Conflict state when two of them disagree. Device enrolment configurations do not merge at all. Microsoft Graph states it plainly on the priority property of deviceEnrollmentConfiguration: users are subject only to the configuration with the lowest priority value. So a broad Enrollment Status Page profile at priority 1 permanently shadows every narrower profile below it. The admin center gives you no warning. Fix it by putting your narrow profiles at the top of the list and keeping the broad baseline in the Default profile. Then audit for any profile whose assigned groups are a subset of a higher priority profile's groups.

The problem: the pilot profile that never applied

Here is the shape of the failure. It looks like a replication problem for about a day, and then it looks like a product bug for about a week.

A tenant has three Microsoft Entra groups that all contain the same Autopilot device. One group is the broad corporate device group. One is the pilot ring. One is the kiosk fleet. Each group is assigned its own Enrollment Status Page (ESP) profile, and each profile has different settings.

MICROSOFT INTUNE ADMIN CENTER — ENROLLMENT STATUS PAGE
PriorityProfile nameAssigned to
1ESP — All corporate Autopilot3 groups
2ESP — Pilot ring 0 (120 min)1 group
3ESP — Kiosk (no blocking)1 group
DefaultAll users and all devicesbuilt in

The administrator expects the pilot device to end up with a merged result. Perhaps the longest timeout wins. Perhaps the most restrictive blocking list wins. Perhaps a Conflict state appears somewhere. None of that happens.

Instead the device gets the settings from priority 1, and only from priority 1. The pilot profile and the kiosk profile might as well not exist. The symptoms line up like this.

Context: device enrolment configurations are a distinct object family from device configuration profiles. In Microsoft Graph they are all subclasses of deviceEnrollmentConfiguration, reachable at /deviceManagement/deviceEnrollmentConfigurations. Enrollment Status Page profiles, device platform restrictions, device limit restrictions, enrolment notifications, the Windows Hello for Business enrolment policy, the co-management authority configuration and the Windows Restore setting all live there. Device configuration profiles, compliance policies and endpoint security policies do not.

Why it happens: priority ordered, not merged

The reason is a single sentence in the Microsoft Graph reference. It is worth reading twice, because it is the whole post.

Priority is used when a user exists in multiple groups that are assigned enrollment configuration. Users are subject only to the configuration with the lowest priority value.

That is the documented description of the priority property on the deviceEnrollmentConfiguration resource type, in both the v1.0 and the beta Graph references. Note the direction. Lowest priority value means the smallest number. Priority 1 beats priority 2. The Intune documentation for the Enrollment Status Page says the same thing in portal language: the profile set to 1 has the highest priority.

The documented evaluation order for ESP

For Enrollment Status Page profiles specifically, Microsoft documents a three step order. It is not just a numeric sort, because device targeting outranks user targeting.

  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. This only works where there is a user. In pre-provisioning and self-deploying scenarios, Intune only applies profiles targeted at devices.
  3. If no profiles are assigned to the device or the user, Intune applies the Default ESP profile.

So a device-targeted profile at priority 9 beats a user-targeted profile at priority 1. That single rule explains a large share of the "my profile is being ignored" reports. It is also invisible in the portal, because the priority column does not tell you whether a group holds users or devices.

What is additive, and what is single winner

This is the distinction that catches people out. Both models are documented, and they are genuinely different.

BehaviourDevice configuration profilesDevice enrolment configurations
How multiple assigned policies combineEvaluated at the individual setting level, so settings from several profiles all land on the deviceNot combined. Exactly one configuration per family applies
Which one wins on the same settingCompliance policy beats configuration profile. Two configuration profiles that disagree produce a Conflict you must resolve manuallyThe configuration with the lowest priority number wins entirely. Nothing from the losers applies
Is a clash surfaced in the portalYes, as a Conflict state on the device and in the reportNo. There is no conflict, so there is nothing to surface
Ordering controlNone. There is no priority listA drag-to-reorder priority list per configuration type
Graph resourcedeviceConfiguration and the settings catalog resourcesdeviceEnrollmentConfiguration, which carries a priority property

Which configuration types are in the priority family

The Graph beta reference exposes a deviceEnrollmentConfigurationType property whose enum tells you exactly which object types share this behaviour. Members with a default prefix are the built-in baselines.

Graph enum memberAdmin center featureGroup assignable
windows10EnrollmentCompletionPageConfigurationEnrollment Status Page profileYes, users or devices
defaultWindows10EnrollmentCompletionPageConfigurationDefault ESP profileNo, it is the fallback
platformRestrictions, singlePlatformRestrictionDevice platform restrictionYes
defaultPlatformRestrictionsDefault platform restrictionNo, it is the fallback
limitEnrollment device limit restrictionYes
defaultLimitDefault device limit restrictionNo, it is the fallback
windowsHelloForBusiness, defaultWindowsHelloForBusinessWindows Hello for Business enrolment policyTenant wide in the admin center
enrollmentNotificationsConfigurationEnrollment notificationsYes, but with no exclude option
deviceComanagementAuthorityConfigurationCo-management authority settingsYes
windowsRestoreWindows Backup and Restore during OOBETenant level setting

Two precision points here, because getting them wrong is easy.

First, the Windows Hello for Business item under Devices > Enrollment is documented as a tenant-wide policy. It configures Windows Hello at the moment a device enrols. The admin center does not offer group assignment on it. For Windows Hello on discrete groups of devices, Microsoft points you at endpoint security Account protection policy, security baselines or the settings catalog. Those are ordinary configuration policies, and they use merge semantics rather than priority.

Second, Autopilot deployment profiles are not in this family. They are a different Graph resource with their own assignment rules. This post is not about them.

Gotcha: enrolment restrictions are only honoured for user-driven enrolments. For scenarios that are not user driven, Microsoft documents that Intune enforces the Default policy regardless of your priority list. That includes Windows Autopilot self-deploying mode, Windows Autopilot for pre-provisioned deployment, bulk enrolment via Windows Configuration Designer, co-managed enrolments, userless Apple automated device enrolment, Azure Virtual Desktop, Windows 365 and Android Enterprise corporate-owned dedicated devices. A co-managed device enrols on its Microsoft Entra device token rather than a user token, and the documentation states that only the default Intune enrolment restriction applies to it.

How shadowing actually forms

A profile is shadowed when every group it is assigned to is also assigned to a higher priority profile in the same family. Once that is true, there is no device or user anywhere in the tenant for which the lower profile can win. It is dead configuration that still looks alive.

Two variants cause almost all of it.

Assignment filters complicate this, because a filter can carve members out of the higher priority profile and let the lower one through. Microsoft documents that only a restricted set of filter properties is available on enrolment policies. The device is not enrolled yet, so Intune does not have its full inventory. For Windows, the always-available properties are OS version, operating system SKU, ownership and enrolment policy name. Manufacturer and model need Windows 11 version 22H2 or later with KB5035942 or later. The documentation also warns that this processing is not instant. User, group and filter assignments between Microsoft Entra and Intune typically take around 15 minutes. So do not enrol a device immediately after changing group membership.

How to verify: read the list, then read the device

There are three places to look, and you want all three. The portal tells you the intended order. Graph tells you the order plus the assignments in one payload. The device tells you what actually arrived.

1. Read the priority list in the admin center

For the Enrollment Status Page:

intune.microsoft.comDevicesDevice onboarding › EnrollmentWindows tabEnrollment Status Page

For device platform restrictions:

intune.microsoft.comDevicesDevice onboarding › EnrollmentEnrollment optionsDevice platform restriction

For the Windows Hello for Business enrolment policy:

intune.microsoft.comDevices › EnrollmentWindows tabEnrollment optionsWindows Hello for Business
Gotcha: scope tags can hide part of the list from you. Microsoft documents that scope tags limit who can see and reprioritise ESP profiles, and that a scoped user can tell the relative priority of their own profile even when they cannot see all the other profiles. So the list you are looking at may not be the list the service is evaluating. Creating and reprioritising device platform restrictions requires the Intune Administrator role, and the Windows Hello for Business enrolment policy requires Intune Service Administrator. All other built-in roles get read-only access.

2. Read the whole family from Graph in one call

This is the fastest reliable read, because it returns priority and assignments together. The v1.0 endpoint is GET /deviceManagement/deviceEnrollmentConfigurations, and the least-privilege permission is DeviceManagementServiceConfig.Read.All, for both delegated and application calls.

PowerShell — admin workstation (read-only Graph scope)
Connect-MgGraph -Scopes 'DeviceManagementServiceConfig.Read.All' -NoWelcome # Least privilege. This scope cannot reorder or edit anything. # The beta endpoint is worth using here: it adds deviceEnrollmentConfigurationType, # which is the only reliable way to group objects into competing families. $uri = 'https://graph.microsoft.com/beta/deviceManagement/deviceEnrollmentConfigurations?$expand=assignments' $all = (Invoke-MgGraphRequest -Method GET -Uri $uri).value $all | Sort-Object deviceEnrollmentConfigurationType, priority | Format-Table priority, displayName, deviceEnrollmentConfigurationType -AutoSize # Healthy looks like: narrow profiles at the LOW numbers, broad ones at the HIGH # numbers, and each default* type sitting on its own as the fallback.

If you need to know why a specific profile lost, read its assignments and compare group membership. The assignments relationship returns enrollmentConfigurationAssignment objects, each with a target, a source of either direct or policySets, and a sourceId. A source of policySets means the assignment came from a Policy Set rather than from someone editing the profile. Worth knowing before you go hunting for who did it.

3. Read what actually arrived on the device

The portal shows intent. The device shows outcome. Microsoft documents that all ESP settings and tracking information are logged in the device registry. The supported way to collect them is the MDM diagnostics tool.

Command Prompt — on the device (Shift+F10 during OOBE, or elevated on the desktop)
mdmdiagnosticstool.exe -area Autopilot -cab C:\Temp\autopilot.cab # For self-deploying and pre-provisioned scenarios on physical hardware, # Microsoft documents: -area Autopilot;TPM # Inside the cab, MDMDiagReport_RegistryDump.Reg holds every MDM enrolment key, # including the ESP settings the device was actually handed. # Look for the FirstSync subkey under the enrolment GUID.

The two keys that matter carry long paths, so here they are once, on their own.

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Enrollments\{EnrollmentGUID}\FirstSync
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Autopilot\EnrollmentStatusTracking
REGISTRY EDITOR — ESP TRACKING TREE (ILLUSTRATIVE)
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Autopilot\EnrollmentStatusTracking
+-- Device
+-- DevicePreparation\PolicyProviders\Sidecar  InstallationState = 3 (Completed)
+-- Setup\Apps  Locked (present, so device use is blocked)
+-- PolicyProviders\Sidecar  TrackingPoliciesCreated = true
+-- Tracking\Sidecar\Win32App_aaaaaaaa-0b0b  InstallationState = 4 (Error)
+-- ESPTrackingInfo\Diagnostics\ExpectedMSIAppPackages
+-- S-1-5-21-REDACTED  (created in the account setup phase)

Those subkeys and values are documented in the Microsoft ESP troubleshooting guide. Here is the reference table for the tracking key above.

Subkey or valueWhat it holdsDocumented values
Device\DevicePreparationInstall state of the Intune Management Extension (SideCar) and the resource types it tracksInstallationState: 1 NotInstalled, 2 NotRequired, 3 Completed, 4 Error. The CSP also defines LastError and a Timeout that defaults to 15 minutes
Device\Setup\Apps, value LockedWhether device use is blocked until this stage completesReflects the Block device use setting in the winning profile
Device\Setup\Apps\PolicyProviders\SidecarStatus of the tracking policies created for the device setup phaseTrackingPoliciesCreated, a boolean that defaults to false
Device\Setup\Apps\Tracking\Sidecar\Win32App_{AppID}Install status of each device-context Win32 app that ESP is waiting onInstallationState: 1, 2 InProgress, 3, 4. A value of 4 stops further app installs
ESPTrackingInfo\Diagnostics\Expected*Timestamped status for MSI apps, network profiles, certificate profiles, policies and modern app packagesThe subkey name is the timestamp of the sample
{User_SID}Account setup phase state, including user-context Win32 appsOnly created if the device setup phase succeeded
...\Enrollments\{EnrollmentGUID}\FirstSyncThe ESP settings the device actually receivedSkipUserStatusPage or SkipDeviceStatusPage set to 0xffffffff when a phase is skipped by CSP
Context: there is no Event ID catalog for this topic, and I am not going to invent one. Microsoft does not document event IDs that name the winning enrolment configuration. The diagnostic surface is the registry plus Graph. The channels below are the ones the ESP troubleshooting guide names for related provisioning failures, and they are worth collecting alongside the cab file, but they will not tell you which profile won.
%windir%\System32\winevt\Logs\
Log fileEvent Viewer channelUse it for
Microsoft-Windows-DeviceManagement-Enterprise-Diagnostics-Provider%4Admin.evtxApplications and Services Logs > Microsoft > Windows > DeviceManagement-Enterprise-Diagnostics-Provider > AdminMDM policy delivery, and the RebootRequiredURI message that names the CSP URI which triggered a reboot
Microsoft-Windows-Provisioning-Diagnostics-Provider%4Admin.evtxthe same tree > Provisioning-Diagnostics-Provider > AdminRuntime provisioning failures during OOBE
Microsoft-Windows-AAD%4Operational.evtxthe same tree > AAD > OperationalMicrosoft Entra join and token failures ahead of enrolment

4. Audit the whole tenant for shadowed configurations

Reading one profile at a time does not scale. The interesting failure is a relationship between two profiles, not a property of either one. The companion script does the pairwise comparison for you.

It connects with DeviceManagementServiceConfig.Read.All, issues GET requests only, groups every configuration into its family, sorts by priority, and then flags three conditions. SHADOWED means a lower priority configuration's assigned groups are all also assigned to a higher priority one. BROAD-ABOVE means a higher priority configuration targets All users or All devices. NO-ASSIGN means a non-default configuration has no assignments at all and therefore never applies to anyone.

PowerShell — Get-EnrollmentConfigPriorityReport.ps1 (illustrative output, stubbed Graph responses)
--- Enrollment Status Page --- Priority Name Default Assign Finding Conf -------- ---- ------- ------ ------- ---- 0 All users and all devices yes 0 1 ESP - All corporate Autopilot 3 OK 2 ESP - Pilot ring 0 (120 min) 1 SHADOWED Likely 3 ESP - Kiosk (no blocking) 1 SHADOWED Possible 4 ESP - Old lab profile 0 NO-ASSIGN Certain [2] ESP - Pilot ring 0 (120 min) targets : 44444444-cccc-5555-dddd-666666666666 WARNING : SHADOWED (Likely) Every assigned group is also assigned to a higher-priority configuration: ESP - All corporate Autopilot (priority 1) # This is the bug. The pilot group is a subset of the broad profile's groups, # so priority 2 can never win for anybody. # Conf=Possible instead of Likely means a filter is present, which could still # let the lower profile through for some devices.
Tip: run the audit with -CsvPath and keep the output. The priority list is exactly the kind of thing that drifts quietly over years, as people add pilot profiles and never clean them up. A dated CSV in source control turns "who reordered this" from an argument into a diff. Add -ResolveGroupNames when you want readable group names, but note that it consents to the extra Group.Read.All read scope, which is why it is off by default.

The fix: reorder priority and tighten assignments

There are two levers. Reordering is the quick one. Fixing the assignment shape is the one that stops the problem coming back.

Reorder Enrollment Status Page profiles

  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. Hover over a profile in the list until three vertical dots appear.
  5. Drag the profile to the position you want. The narrowest, most specific profile belongs at the top, at priority 1.
  6. Confirm the new order in the Priority column before you leave the blade.

Reorder device platform restrictions

  1. Go to Devices > Device onboarding > Enrollment.
  2. Under Enrollment options, select Device platform restriction.
  3. Select the platform tab you are changing, for example Windows restrictions.
  4. In the Device type restrictions table, select and drag the restriction to reposition it.

The same drag pattern applies to enrolment device limit restrictions and to enrolment notifications. In Graph the equivalent is POST /deviceManagement/deviceEnrollmentConfigurations/{id}/setPriority with a body of { "priority": 8 }, which returns 204 No Content. That call needs DeviceManagementServiceConfig.ReadWrite.All or DeviceManagementConfiguration.ReadWrite.All, so it is deliberately outside the scope of the read-only audit script.

Then fix the assignment shape

Reordering alone leaves you one new profile away from the same incident. Four rules keep the list honest.

Watch out: reordering takes effect for enrolments that have not started yet, so a drag in the portal is a live change to your provisioning path. Two documented behaviours make it worse than it looks. Edits to enrolment restrictions apply only to new enrolments and do not affect devices that are already enrolled, so you cannot verify the change on existing hardware. And Microsoft lists it as a known issue that disabling an ESP profile does not remove ESP policy from devices that already have it, with users still getting the ESP when they sign in for the first time. Test with a spare device, in a change window, before you touch a production ordering.
Tip: if you need the broad baseline behaviour but also want a pilot ring carved out of it, prefer an exclusion group on the broad profile over relying on ordering. Two caveats from the docs. The exclude option is not available for enrolment notifications at all. And filters on enrolment policies support only the limited property set noted earlier. Where exclusions and filters both fall short, ordering is your only tool, so document the order.

There is no Group Policy equivalent

Context: enrolment configuration priority is a service-side Intune construct. It is evaluated by the Intune service when a device enrols, so there is no ADMX setting, no OMA-URI and no registry value that changes the ordering. There is nothing to configure on the client. A related note: Microsoft lists it as a known issue that the ESP does not apply to a Windows device enrolled with Group Policy at all. The one setting in this family that does have a Group Policy path is Windows Hello for Business, at Computer Configuration > Administrative Templates > Windows Components > Windows Hello for Business, but that path configures the client and has nothing to do with the enrolment-time priority list.
Gotcha: one documented setting cuts across the whole priority model. The Install Windows quality updates ESP setting does not support user-targeted ESP profiles. Microsoft states that the device uses the highest priority device-targeted profile, which is typically the default ESP profile. So you can have a correctly ordered, correctly assigned user-targeted profile with the setting enabled, and it still will not install monthly security update releases during OOBE. Also worth knowing: Windows Autopilot device preparation does not use the ESP at all, so none of this applies there.

Proof it worked: a clean shadow report

Proof for this class of problem has to be structural, not anecdotal. One successful pilot enrolment does not tell you the ordering is right, because the broad profile may simply have matched what you wanted this time. What you want is the audit coming back with nothing to say.

The fix applied to the example tenant was this. Move the pilot profile to priority 1. Move the kiosk profile to priority 2. Drop the pilot and kiosk groups from the broad profile so it targets only the corporate group. Push the broad profile to priority 3. Delete the unassigned lab profile.

PowerShell — the same audit after the fix (illustrative output, stubbed Graph responses)
--- Enrollment Status Page --- Priority Name Default Assign Finding Conf -------- ---- ------- ------ ------- ---- 0 All users and all devices yes 0 1 ESP - Pilot ring 0 (120 min) 1 OK 2 ESP - Kiosk (no blocking) 1 OK 3 ESP - All corporate Autopilot 1 OK ============================================================================== SUMMARY: 8 configuration(s) read, 0 flagged. ============================================================================== No shadowed or unassigned configurations found. # Narrow profiles at the low numbers, broad profile at the high number, # Default untouched at the bottom. Nothing can be silently discarded now. # Verify on hardware next: provision one pilot device and confirm the ESP # timeout in the FirstSync key matches the pilot profile, not the broad one. Done. This script made GET requests only. Nothing was changed.

Then confirm on hardware. Provision one device from the pilot group and collect the diagnostics cab with mdmdiagnosticstool.exe -area Autopilot. Then check that the settings under the FirstSync subkey match the pilot profile rather than the broad one. That is the only evidence that closes the loop, because it is the only place the device tells you what it was actually handed.

Two sizing limits are worth noting while you are in there, and both are documented. A tenant can hold a maximum of 51 ESP profiles, being the Default plus 50. It can hold up to 25 device platform restriction policies. If you are anywhere near either number, shadowed profiles are almost certainly part of the reason.

The mental model to keep is short. Device configuration profiles are a set union. Enrolment configurations are a race. Once you know which family a policy belongs to, the behaviour stops being surprising.

References

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-EnrollmentConfigPriorityReport.ps1 — Read-only report of every Intune device enrollment configuration in priority
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
Corporate or personal? How Autopilot devices get their ownership…
Intune stamps device ownership at enrolment time based purely on the enrolment route.…
Autopilot
Autopilot device preparation leaves a different footprint - and…
Your trusted Autopilot troubleshooting steps return blank values on a device preparation…
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,…