HomeNewsletterCommunityMVP FeedToolsArchiveBlogToday's NewsAboutServicesQuick Links Subscribe free
← Back to Blog
Autopilot AutopilotEnrollment Status PageIntuneWin32 appsESPEnrollmentStatusTrackingDMClient CSPIntune Management ExtensionApp deploymentRegistry

Which apps actually block the Enrollment Status Page (and why yours did not)

IA
Imran Awan
21 August 2026

You set the Enrollment Status Page to block. You picked a sixty minute timeout because your image ships fourteen required applications and some of them are big. You handed the laptop to a new starter, watched the spinner, and it cleared in four minutes flat. Then the new starter asked where the VPN client was.

Nothing failed. No error appeared. The Enrollment Status Page did exactly what Microsoft documents it to do. The gap is between what you assigned and what the ESP agreed to wait for, and those are two different lists. This post is about that second list: how Windows builds it, which of your apps never make it in, and how to read the answer off a real device instead of guessing.

The short version

The ESP does not wait for every app you assigned. It waits for a tracked set that Windows computes once per phase, and membership depends on the assignment intent, the assignment target, the app type and the install context. Required device-targeted Win32, WinGet, per-machine LOB MSI and device-context store apps are tracked during Device Setup; user-targeted apps are only tracked during Account Setup, which many tenants have switched off. Everything assigned as Available, everything left out of a Selected blocking list, and every blocking list defined on a user-targeted ESP profile is invisible to the ESP. You can prove which apps it actually waited on from two registry hives and the Intune Management Extension logs.

The problem: a blocking ESP that blocks on nothing

The setting is called Block device use until all apps and profiles are installed. The name is the source of the confusion. Read literally it promises that no user reaches a desktop until every assigned application has landed. That is not what it means.

Underneath it sits a second setting: Block device use until these required apps are installed if they are assigned to the user/device, with the options All and Selected. Notice the conditional in that sentence. It says "if they are assigned to the user/device". It does not say "everything you assigned". Microsoft's own wording is doing careful work there, and the whole failure mode lives inside it.

Here is what the fast-pass looks like from a support engineer's chair. The device provisioned. The ESP reported success. Company Portal later shows most apps installed and a couple still pending. The user was productive on day one for everything except the two applications that mattered.

Windows PowerShell (admin) - post-provisioning triage
PS C:\> $ent = Get-ChildItem 'HKLM:\SOFTWARE\Microsoft\Enrollments' | >> Where-Object { Test-Path (Join-Path $_.PSPath 'FirstSync') } PS C:\> Get-ItemProperty (Join-Path $ent.PSPath 'FirstSync') | >> Select-Object BlockInStatusPage, SkipDeviceStatusPage, SkipUserStatusPage, IsSyncDone BlockInStatusPage : 7 SkipDeviceStatusPage : 0 SkipUserStatusPage : 4294967295 IsSyncDone : 1

That output is the whole story in four values. BlockInStatusPage is non-zero, so the ESP genuinely was configured to block. SkipDeviceStatusPage is 0, so the Device Setup phase ran. And SkipUserStatusPage is 0xffffffff, so the Account Setup phase was skipped outright. Every app targeted at the user was therefore never a candidate for tracking on this device. The ESP blocked on the device-targeted list only, that list was short, and it finished in four minutes.

Context: The ESP runs three phases in order: Device preparation, Device setup, and Account setup. Device preparation covers securing the hardware, joining the network and registering for management. Device setup covers device-targeted policies, certificates, network profiles and apps. Account setup covers the same categories targeted at the user who is signing in. App tracking happens in the last two, and each keeps its own separate list.

Why it happens: the tracked set is not your assignment list

Two configuration service providers share the job. The EnrollmentStatusTracking CSP tracks Win32 app installations. The DMClient CSP tracks MSI and Universal Windows Platform app installations through its FirstSyncStatus/ExpectedMSIAppPackages and FirstSyncStatus/ExpectedModernAppPackages nodes. Neither of them reads your Intune assignment list directly. An agent has to register itself as a policy provider and then declare which apps it intends to install.

For Win32 apps that agent is the Intune Management Extension, which appears in the CSP under the provider name Sidecar. Before installation begins, the device creates a tracking policy and calculates all apps and policies that need to be tracked. While that calculation runs, the ESP shows its subtasks in an Identifying state. When the calculation finishes, the provider sets TrackingPoliciesCreated to true and the ESP starts displaying counts.

That is the critical mechanic. The tracked set is a snapshot, taken once per phase, of what the agent believed it had to install at that moment. Anything that was not in scope when the snapshot was taken is not in the set, and nothing adds to the set later. During ESP, Sidecar tracks only Win32 apps and no PowerShell scripts at all.

Which app types each phase tracks

Microsoft publishes the tracked types per phase, and they are not the same list. This is the table to keep on a sticky note.

App typeDevice setup phaseAccount setup phase
Win32 app (Intune Win32 / IME)Tracked when targeted to the deviceTracked when assigned to the user, Windows 10 1903 and later
WinGet appTrackedNot listed as tracked
Per-machine LOB MSITrackedTracked
Per-user LOB MSINot listed as trackedTracked
LOB store appTracked only where installation context = deviceTracked, along with online and offline store apps
PowerShell script or remediationNever trackedNever tracked
Security policy, for example device restrictionsNot tracked, installs in backgroundNot tracked, installs in background
Microsoft Edge, Assigned Access, Kiosk Browser policyTrackedTracked

Read the WinGet row and the per-user MSI row together and the asymmetry becomes obvious. The two phases were built at different times for different agents, and they do not mirror each other. A WinGet app assigned to a user group is in nobody's tracked set.

Six reasons your blocking app did not block

Each of these is documented behaviour, not a bug you can escalate.

1. It was assigned as Available, not Required. Microsoft's troubleshooting guidance is explicit: to guarantee that applications are installed and tracked by the ESP, the apps must be assigned to a group containing the device or the user by using a required assignment. Available assignments never enter a tracked set. Worth knowing that for almost all app types, Available assignments are only valid against user groups anyway, with Win32 apps as the notable exception since they can be Available to device groups too. So a Win32 app sitting Available on a device group looks device-targeted in the console and is still invisible to the ESP.

2. It was targeted at the user while only the device phase was blocking. Device-targeted apps are tracked during the device setup phase and user-targeted apps during the user setup phase. If Account Setup is skipped, or if the user reaches the desktop before it matters, user-targeted apps were never going to hold the door.

3. It was not on your Selected list. This is the one that catches careful admins, because the list does not mean what its position in the UI implies.

Gotcha: The Selected blocking-app list is a filter, not an instruction. Microsoft states it plainly: the apps in this list are used by Intune to filter the list that should be considered blocking, and it does not specify what apps should be installed. If your list contains App 1, App 2 and App 3, while App 3 and App 4 are the apps actually targeted at the device or user, then the ESP tracks only App 3. App 4 is still installed during pre-provisioning flows but the ESP does not wait for it. In user-driven and self-deploying mode, when App 4 is a Win32, Microsoft Store or Enterprise App Catalog app, it does not get installed until after the ESP completes.

Adding an app to the Selected list does nothing to make it install. Removing one does not stop it installing. The list only decides which of the already-assigned apps are allowed to block. You can select up to 100 apps.

4. Your blocking list is on a user-targeted ESP profile. Microsoft records this as a known issue: blocking apps specified in a user-targeted Enrollment Status Page profile are ignored during device ESP, because the services that decide which apps should be blocking cannot determine the correct profile without knowing the user identity. The documented guidance is to target the ESP profile to device groups, or to put the blocking list on the default profile which targets all users and all devices.

5. The install context does not match the phase. The device setup phase tracks apps deployed in a device context. Microsoft's checklist adds a second condition that is easy to miss: the apps install in device context and they have no user-context applicability rules. For Microsoft Store app (new) deployments the install behaviour is an explicit choice of System or User, and for Store Win32 apps the installer definition in the store decides which contexts are even available. A Store app that only supports User context cannot be tracked in Device Setup, no matter which group you assign it to. On Microsoft Entra hybrid joined devices there is a further documented carve-out: Win32 and UWP apps assigned to the device with user installation context are not tracked during provisioning at all.

6. The device was Autopilot Reset. Another documented known issue: when a Windows Autopilot Reset happens, the required apps are not installed on the ESP before the user reaches the desktop. The apps are not tracked on the ESP, though they do install once the user signs in.

Device preparation

Waits for every registered policy provider to report InstallationState 2 (NotRequired) or 3 (Completed). This is where the IME itself gets installed. Default provider timeout is 15 minutes when none is specified.

Device setup

Tracked set computed from device-targeted required apps. Locked under the Apps key records whether device use is actually blocked until this phase finishes.

Account setup

A separate tracked set under the signing-in user's SID. Microsoft notes this subkey is not created at all if the device setup phase fails.

The mixing hazard that turns a slow ESP into a failed one

Watch out: Do not mix LOB and Win32 apps in an ESP deployment. Both LOB (MSI) and Win32 installers use TrustedInstaller, which does not allow simultaneous installations. If the OMA DM agent starts an MSI installation while the Intune Management Extension starts a Win32 app installation through the same TrustedInstaller, the Win32 install fails with Another installation is in progress, please try again later and the ESP fails with it. The same collision is documented for the Teams Machine-Wide Installer MSI bundled inside the Microsoft 365 Click-to-Run app type, which the ESP does not track and therefore cannot serialise. If you need to mix the two, Microsoft's recommendation is Windows Autopilot device preparation, which does not use the ESP at all and therefore supports mixing.

On timing, and what is not documented

A popular piece of folklore says an app must be assigned some fixed number of minutes before enrolment or the ESP will not see it. Microsoft documents the mechanism but not a number. What is published is that after enrolment the device calculates the policies and apps required to track in the next phase, and that the ESP shows subtasks as Identifying while that calculation runs. So the snapshot is real and its timing matters. The propagation window between saving an assignment in Intune and that assignment appearing in the device's calculation is not a documented value, and I am not going to invent one. Treat "assign it well before you provision" as sound operational hygiene rather than a spec.

How to verify: read the tracked set off the device

All ESP settings and tracking information are logged in the device registry, which means you can answer "which apps did the ESP actually wait for" without guessing. There are two hives, and they are not near each other.

Hive one: the ESP profile the device received

Shared parent key, one per MDM enrolment GUID:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Enrollments\{aaaaaaaa-0b0b-1c1c-2d2d-333333333333}\FirstSync
Tip: This is SOFTWARE\Microsoft\Enrollments, not SOFTWARE\Microsoft\Windows\CurrentVersion\Enrollments. The second path gets quoted constantly and does not exist. If a script of yours reads it and returns nothing, you will conclude the ESP was not configured when in fact you looked in the wrong place.
ValueType and meaningWhat to read from it
BlockInStatusPageInteger flag set. 0x0 lets the user exit before provisioning completes. 0x1 shows Reset PC on failure, 0x2 shows Try Again, 0x4 shows Continue Anyway.Zero means nothing ever blocked. Non-zero means it did, so an instant pass points at an empty tracked set.
SkipDeviceStatusPageBoolean. Skips the device progress page.0xffffffff here means the whole device phase, and its app list, was bypassed.
SkipUserStatusPageBoolean. Skips the user progress page.0xffffffff means every user-targeted app is untracked by design.
AllowCollectLogsButtonBoolean. Controls the Collect logs button on the ESP.Confirms whether the end user could have captured diagnostics.
TimeOutUntilSyncFailureInteger, 1 to 1440 minutes, default 60.The documented timeout node. Compare against how long the ESP actually took.
IsSyncDoneBoolean set when first syncs are done and the device is fully provisioned.1 with a short elapsed time is the fingerprint of this whole problem.
ExpectedMSIAppPackagesDelimited string of EnterpriseDesktopAppManagement LocURIs, each followed by a semicolon and a count.The MSI apps the service declared. Empty means no MSI was ever expected.
ExpectedModernAppPackagesDelimited string of EnterpriseModernAppManagement LocURIs with counts.The UWP and store apps the service declared.

Hive two: the per-phase tracked app list

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Autopilot\EnrollmentStatusTracking

This hive is created by the EnrollmentStatusTracking CSP, which arrived in Windows 10 version 1903. It holds a Device subkey, an ESPTrackingInfo subkey, and one subkey per logged-in user security identifier. That SID subkey is created during the account setup phase and is not created if the device setup phase fails, so its absence is itself a finding.

Registry Editor
...\EnrollmentStatusTracking\Device\DevicePreparation\PolicyProviders\SidecarInstallationState = 3
...\EnrollmentStatusTracking\Device\DevicePreparation\PolicyProviders\Sidecar\TrackedResourceTypesApps = 1
...\EnrollmentStatusTracking\Device\Setup\AppsLocked = 1
...\EnrollmentStatusTracking\Device\Setup\Apps\PolicyProviders\SidecarTrackingPoliciesCreated = 1
...\Device\Setup\Apps\Tracking\Sidecar\Win32App_app-guid-1InstallationState = 3
...\Device\Setup\Apps\Tracking\Sidecar\Win32App_app-guid-2InstallationState = 4
Node under the parent keyValueDocumented meaning
Device\DevicePreparation\PolicyProviders\{Provider}InstallationState1 NotInstalled, 2 NotRequired, 3 Completed, 4 Error. The ESP holds in device preparation until every provider reaches 2 or 3.
Device\DevicePreparation\PolicyProviders\{Provider}LastErrorOptional HRESULT the provider sets, read by the ESP only when InstallationState is 4.
Device\DevicePreparation\PolicyProviders\{Provider}TimeoutMinutes the provider may run. Default 15 when unspecified.
Device\DevicePreparation\PolicyProviders\{Provider}\TrackedResourceTypesAppsBoolean. Only providers registered for apps contribute app counts to the ESP message.
Device\Setup\AppsLockedWhether device usage is blocked until this stage completes.
Device\Setup\Apps\PolicyProviders\{Provider}TrackingPoliciesCreatedWhether the provider finished creating tracking policies. A device stuck on Identifying is stuck here.
Device\Setup\Apps\Tracking\{Provider}\{AppName}InstallationState1 NotInstalled, 2 InProgress, 3 Completed, 4 Error. Any app at 4 stops the ESP installing further applications.
Device\Setup\Apps\Tracking\{Provider}\{AppName}RebootRequired1 NotRequired, 2 SoftReboot, 3 HardReboot. If the provider never sets it, the ESP will not reboot for that app.
Device\Setup\HasProvisioningCompleted(boolean)Set by the ESP when it finishes, so providers can tell whether the ESP is still displayed.
{User_SID}\Setup\Apps\Tracking\{Provider}\{AppName}InstallationStateThe same structure for the account setup phase, per signing-in user.
ESPTrackingInfo\Diagnostics\ExpectedMSIAppPackagestimestamped subkeysOne subkey per logging timestamp recording each LOB MSI app's status.
ESPTrackingInfo\Diagnostics\ExpectedModernAppPackagestimestamped subkeysStore app status per timestamp, 0 not installed and 1 installed. Under a {User_SID} subkey when deployed in user context.
ESPTrackingInfo\Diagnostics\ExpectedNetworkProfilestimestamped subkeysWi-Fi profile installation status.
ESPTrackingInfo\Diagnostics\ExpectedCertificateProfilestimestamped subkeysSCEP certificate profile installation status.
ESPTrackingInfo\Diagnostics\ExpectedPoliciesEntDMIDBecause the ESP does not track security policies, only this placeholder policy appears.
Tip: The provider name is not always Sidecar. On a co-managed device you will see ConfigMgr registered as the policy provider instead. Enumerate whatever provider subkeys exist rather than hard-coding a name, or your script will report zero tracked apps on exactly the fleet where the answer matters most.

The log trail for Win32 apps

Intune Management Extension logs live at C:\ProgramData\Microsoft\IntuneManagementExtension\Logs and are best read in CMTrace. IntuneManagementExtension.log is the main log holding check-ins, policy requests and policy processing. AppWorkload.log is the one that carries Win32 app deployment activity, and it is where the ESP phase decisions surface.

AppWorkload.log - CMTrace
[Win32App][EspHelper][CheckEspPhase] Checking ESP status and phase for sessionId: 0 [Win32App][EspHelper][CheckEspPhase] ESP Checking SidecarCspProvider status [Win32App] Got InstanceID: Sidecar, installationStateString: 3 [Win32App] The EspPhase: DeviceSetup. [Win32App][DetectionActionHandler] Detection for policy with id: app-guid-1 resulted in action status: Success and detection state: Detected. [Win32App][DetectionActionHandler] Detection for policy with id: app-guid-9 resulted in action status: Success and detection state: NotDetected. [Win32App] The EspPhase: NotInEsp.

Two things to take from that. The EspPhase: tells you whether the IME believed it was inside the ESP at all, and NotInEsp means anything it installed at that moment was never blocking. The detection lines give you the policy GUID of every Win32 app the IME evaluated. Diff those GUIDs against the Win32App_{id} subkeys in the tracking hive and the apps that appear in the log but not in the hive are precisely the ones the ESP ignored.

Collecting the evidence in one shot

From OOBE press Shift+F10 on a non-S-mode device and run the documented collection command. The resulting cab contains MDMDiagReport_RegistryDump.Reg, which holds every MDM enrolment registry key including the ESP settings and the apps being installed.

Command Prompt - OOBE (Shift+F10)
C:\> mdmdiagnosticstool.exe -area Autopilot -cab C:\Temp\esp.cab C:\> rem self-deploying, pre-provisioning and any physical-device scenario: C:\> mdmdiagnosticstool.exe -area Autopilot;TPM -cab C:\Temp\esp.cab

The Autopilot event log surface

Windows Autopilot logs to Event Viewer under Applications and Services LogsMicrosoftWindowsModernDeployment-Diagnostics-ProviderAutopilot. These events cover profile acquisition and the OOBE flow rather than per-app tracking, so use them to rule the profile in or out before you go hunting for apps.

Channel: Microsoft-Windows-ModernDeployment-Diagnostics-Provider/Autopilot
Event Viewer
Warning100Autopilot policy [name] not found
Info160AutopilotRetrieveSettings beginning acquisition
Info161AutopilotManager retrieve settings succeeded
Info153AutopilotManager reported the state changed from ProfileState_Unknown to ProfileState_Available
Error815ZtdDeviceHasNoAssignedProfile - no profile assigned and no default profile in tenant
Event IDTypeDocumented meaning
100WarningAutopilot policy not found. Usually temporary while the device waits for a profile download.
101InfoAutopilotGetPolicyDwordByName succeeded. Numeric OOBE setting retrieved.
103InfoAutopilotGetPolicyStringByName succeeded. String OOBE setting such as the tenant name.
109InfoAutopilotGetOobeSettingsOverride succeeded. State-related OOBE setting.
111InfoAutopilotRetrieveSettings succeeded. Profile settings controlling OOBE behaviour were retrieved.
153InfoState change reported, normally ProfileState_Unknown to ProfileState_Available.
160InfoAutopilotRetrieveSettings beginning acquisition.
161InfoAutopilotManager retrieve settings succeeded. Profile downloaded.
163InfoDownload not required, device already provisioned. Sysprep /Generalize normally clears this.
164InfoInternet determined available for policy download.
171ErrorFailed to set TPM identity confirmed. TPM attestation problem.
172ErrorFailed to set Autopilot profile as available. Typically follows 171.
807ErrorZtdDeviceIsNotRegistered. Check the hardware hash upload and profile assignment.
809ErrorZtdDeviceHasNoAssignedProfile. The assigned profile was deleted without cleanup.
815ErrorZtdDeviceHasNoAssignedProfile. No profile assigned and no default profile in the tenant.
908ErrorSerialNumberMismatch or ProductKeyIdMismatch between the Autopilot record and the hardware.

One more event worth knowing lives on a different channel. Unexpected reboots during the ESP can be traced through the RebootRequiredURI event on MDM_DIAGNOSTICS_ADMIN_CHANNEL, which names the exact CSP URI that triggered the reboot.

The fix: make the apps you care about trackable

The fix is not a setting. It is making your assignments match the shape the ESP can see.

Step one: build or correct the ESP profile

  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, then select Next.
  5. Set Show app and profile configuration progress to Yes. Nothing below this appears until you do.
  6. Set Show an error when installation takes longer than specified number of minutes. The default is 60. Raise it if you are tracking large apps.
  7. Set Turn on log collection and diagnostics page for end users to Yes. On Windows 11 this also enables the Autopilot diagnostics page, reachable with CTRL+SHIFT+D.
  8. Set Block device use until all apps and profiles are installed to Yes.
  9. For Block device use until these required apps are installed if they are assigned to the user/device, choose All or Selected. If Selected, choose Select apps and pick up to 100.
  10. Select Next, then on Assignments assign to device groups. Only a limited set of assignment filters is available here because of operating system restrictions: the picker shows only filters with rules on model, manufacturer, osVersion, operatingSystemSKU, deviceOwnership and enrollmentProfileName.
  11. Optionally set scope tags, then Review + create.

If you assign more than one profile, the highest priority wins, with 1 being highest. Intune applies the highest-priority device-targeted profile first, falls back to the highest-priority user-targeted profile only where a user exists, and uses the default profile when nothing is assigned. You can hold a maximum of 51 profiles in a tenant, the default plus 50.

Context: There is no Group Policy path for the Enrollment Status Page. It is delivered exclusively through the DMClient and EnrollmentStatusTracking CSPs, configured either from the Intune ESP profile or by a custom OMA-URI. The nearest thing to a manual override is a custom setting such as ./Vendor/MSFT/DMClient/Provider/MS DM Server/FirstSyncStatus/SkipUserStatusPage as a Boolean, which is the documented way to disable the user portion of the ESP once policy is already on a device. Note also that the ESP does not apply to a Windows device that was enrolled with Group Policy.

Step two: fix the assignments themselves

  1. Move every must-have app to Required. Available is invisible to the ESP. If it has to be there on day one, it is Required.
  2. Target must-have apps at device groups, in device or system install context. That puts them in the Device Setup tracked set, which is the phase that runs in every Autopilot scenario including self-deploying and pre-provisioning.
  3. Remove user-context applicability rules from anything you expect the device phase to track. Microsoft's checklist requires device context and no user-context applicability rules.
  4. Check the install behaviour on Store apps. In AppsAll Apps, open each Microsoft Store app (new) and confirm Install behavior is System. Where the option is greyed out, that app only supports the shown context and cannot be moved.
  5. Put the blocking list on a device-targeted profile, or on the default profile, so the documented user-targeted-profile issue cannot bite.
  6. Standardise on the Win32 app type. Microsoft recommends using the Win32 app type exclusively for Windows desktop apps, particularly multi-file installers, and specifically recommends deploying Microsoft 365 Apps as Win32 rather than the Microsoft 365 Apps type to stop the ESP hanging during installation.
  7. For pre-provisioning, decide what a non-blocking failure means. The setting Only fail selected blocking apps in technician phase appears once blocking apps are added. Set to Yes, all required apps are attempted, only blocking apps can fail the deployment, and non-blocking failures are retried at first user sign-in. Set to No, only blocking apps are attempted in the technician phase and non-blocking apps wait for the end user.
  8. Then verify on a real device rather than trusting the console. That is what the companion script is for.

Proof it worked: a tracked set that matches intent

The companion script reads both documented registry hives, enumerates the tracked set per phase, decodes every state value against the CSP documentation, then parses the IME logs and cross-references the Win32 policy GUIDs it finds against the tracked set. It is strictly read-only, refuses to report a clean result after a failed read, and runs on both Windows PowerShell 5.1 and PowerShell 7.

Get-EspTrackedAppReport.ps1 - illustrative output from a real run, identifiers replaced
============================================================================== 2. ESP profile settings received by the device (FirstSync) ============================================================================== -- Enrollment {aaaaaaaa-0b0b-1c1c-2d2d-333333333333} BlockInStatusPage 7 (blocking; Show Reset PC button on failure; Show Try Again button on failure; Show Continue Anyway ...) SkipDeviceStatusPage 0 [Device Setup phase skipped when 0xffffffff] SkipUserStatusPage 4294967295 [Account Setup phase skipped when 0xffffffff] IsSyncDone 1 [ESP reported provisioning finished] WARN: SkipUserStatusPage is 0xffffffff: the Account Setup phase was skipped entirely. NOTE: Every user-assigned app is therefore untracked by design on this device. ============================================================================== 4a. Device Setup phase: apps the ESP tracked ============================================================================== Apps\Locked 1 TrackingPoliciesCreated [Sidecar] 1 Apps tracked in this phase 3 ============================================================================== 4b. Account Setup phase: apps the ESP tracked (per user SID) ============================================================================== WARN: No user SID subkey exists under EnrollmentStatusTracking. ============================================================================== 6. Intune Management Extension log evidence ============================================================================== Distinct Win32 app policy IDs in logs 11 Distinct app IDs in ESP tracked set 3 WARN: 8 Win32 app policy IDs were handled by the IME but never appear in the ESP tracked set. NOTE: These are apps the ESP did not wait for. app-guid-4 detection: Detected app-guid-5 detection: NotDetected ...

That is the failure, quantified: eleven Win32 apps handled, three of them blocking, eight shipped on trust. After moving the must-have apps to Required on a device group, targeting the ESP profile at devices, and re-provisioning, the same script should read very differently.

Get-EspTrackedAppReport.ps1 - illustrative output after remediation
============================================================================== 4a. Device Setup phase: apps the ESP tracked ============================================================================== Apps\Locked 1 TrackingPoliciesCreated [Sidecar] 1 Apps tracked in this phase 9 ============================================================================== 6. Intune Management Extension log evidence ============================================================================== Distinct Win32 app policy IDs in logs 9 Distinct app IDs in ESP tracked set 9 Every Win32 app policy seen in the logs also appears in the ESP tracked set. ============================================================================== 8. Combined ESP tracked-app table ============================================================================== Phase Provider App InstallationState RebootRequired ----- -------- --- ----------------- -------------- DeviceSetup Sidecar VPN client 3 (Completed) 1 (NotRequired) DeviceSetup Sidecar Endpoint agent 3 (Completed) 1 (NotRequired) DeviceSetup Sidecar Line-of-business client 3 (Completed) 2 (SoftReboot) ============================================================================== Warnings collected during this run ============================================================================== None. Every key and log the report touched was readable. Report complete. This script made no changes to the device.

The number to watch is the second one in section 6. When the count of Win32 policy GUIDs in the logs equals the count in the tracked set, your assignment list and the ESP's list have converged, and "the ESP passed" finally means what you wanted it to mean. Run the script against one device from every deployment profile you own. Fleets tend to have exactly one ESP profile and four different assignment habits.

Gotcha: A short ESP is not automatically a broken ESP. Watch the elapsed time against TimeOutUntilSyncFailure and against the tracked count. Three tracked apps completing in four minutes is fine if three apps are genuinely all you require. The alarm is a tracked count that is smaller than your must-have list, and only reading the device tells you that.

References

Microsoft official

Community deep-dives

AuthorArticleWhy it is worth reading
Michael NiehausBlocking for app installation using Enrollment Status PageThe original announcement of the All versus Selected blocking-app choice, from the engineer who shipped it.
Peter van der WoudeBlock access to a device until specific apps are installedWalks the blocking-app configuration and the end-user experience, and is explicit about which app categories can be selected.
Rudy OomsAutopilot stuck on Identifying AppsTraces a stuck Identifying phase to an untracked PowerShell script, and shows the tracking hive being written only after that script times out.
Rudy OomsAutopilot, Only fail selected blocking appsPulls apart the best-effort behaviour behind the technician-phase setting, including how the IME reports non-blocking apps.

Companion script

Get-EspTrackedAppReport.ps1 reports which apps the ESP actually tracked on a device, cross-referenced against the Intune Management Extension logs. Read-only, no Graph write scopes, and it aborts rather than showing you a clean report built on a failed read.

PowerShell Scripts — ESP App Tracking

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-EspTrackedAppReport.ps1 — reports which apps the ESP actually tracked on this device
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
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
The ESP device phase and user phase are two different machines:…
The Enrollment Status Page runs its device preparation and device setup phases in device…
Autopilot
Intune Platform Scripts Have No Guaranteed Order - and Autopilot…
Microsoft documents that Intune platform scripts run before Win32 apps, and documents the…