HomeNewsletterCommunityMVP FeedToolsArchiveBlogToday's NewsAboutServicesQuick Links Subscribe free
← Back to Blog
Autopilot AutopilotAutopilot device preparationEnrollment Status PageIntuneRegistryEnrollment time groupingDiagnosticsWindows 11Microsoft GraphAPv2

Autopilot device preparation leaves a different footprint - and your diagnostics scripts cannot read it

IA
Imran Awan
21 August 2026

A new starter's laptop finishes provisioning. It reaches the desktop, it is Microsoft Entra joined, and it is enrolled in Intune. But two of the six applications you expected are missing. So you do what you have done for years. You open an elevated PowerShell prompt and you read the Autopilot registry keys.

They are empty. The tenant domain value is blank. The value that means "this device is not registered with Windows Autopilot" is set to 1. The Enrollment Status Page tracking hive does not exist at all. The Autopilot event log has warnings in it and no profile events. Every diagnostic you trust is telling you the same thing: this device was never provisioned by Autopilot.

And yet it provisioned perfectly. It went through Windows Autopilot device preparation, and device preparation writes none of those things.

The short version

Windows Autopilot device preparation is a re-architecture, not a new interface over the old flow. It assigns a policy to a user group instead of a deployment profile to a registered device, it requires that the device is not registered as an Autopilot device, and Microsoft documents that it does not use the Enrollment Status Page. That combination means the two client-side surfaces a decade of community diagnostics read - the cached Autopilot profile under Provisioning\Diagnostics\Autopilot and the ESP tracking tree under Windows\Autopilot\EnrollmentStatusTracking - are legitimately blank or absent on a healthy device preparation deployment. Microsoft documents no client-side registry or event log replacement for them, because the authoritative status now lives in the Intune deployment report. Rewrite your detection logic to return three states, not two.

The problem: diagnostics that report failure on a healthy device

Autopilot troubleshooting has a well-worn muscle memory. You press Shift+F10 during the out-of-box experience, or you open an elevated prompt after the fact, and you check three things in order.

First, did the device get an Autopilot profile? You read the cached profile values that Microsoft documents under the Provisioning hive. Second, did the Enrollment Status Page run, and what did it wait for? You read the tracking hive that the Enrollment Status Page populates. Third, what does the Autopilot event log say? You open Event Viewer and walk down to the Autopilot channel.

Every published community script, every internal runbook, and every support escalation template in this space is built on those three surfaces. They are documented by Microsoft, they are stable, and for classic Windows Autopilot they are correct.

Run the same three checks against a device provisioned by Windows Autopilot device preparation and you get this.

PowerShell — on the device (run elevated)
Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Provisioning\Diagnostics\Autopilot' # On classic Autopilot, CloudAssignedTenantDomain is populated and IsAutopilotDisabled is 0. CloudAssignedTenantDomain : CloudAssignedTenantId : IsAutopilotDisabled : 1 TenantMatched : 0 Test-Path 'HKLM:\SOFTWARE\Microsoft\Windows\Autopilot\EnrollmentStatusTracking' # On classic Autopilot with a blocking ESP, this hive is full of tracked apps. False dsregcmd /status | Select-String 'AzureAdJoined|TenantName' # The device really is joined and really is managed. Nothing failed. AzureAdJoined : YES TenantName : CONTOSO

Read literally, that output says the device is not registered with Autopilot, never received a profile, and never ran an Enrollment Status Page. Every one of those readings is true. None of them means the deployment failed.

This is the most expensive misdiagnosis available in Autopilot device preparation today. An engineer sees blank profile values, concludes the provisioning never happened, wipes the device, and reruns it. The rebuild produces exactly the same blank values. Now there is a second ticket about a looping Autopilot failure that was never an Autopilot failure at all.

Gotcha: the Enrollment Status Page has its own internal phase called device preparation, and it writes a registry subkey literally named DevicePreparation. That subkey has nothing to do with Windows Autopilot device preparation. It is the ESP phase that waits for policy providers such as the Intune Management Extension before the device setup phase starts. Search your codebase for "device preparation" and you will hit both concepts. Confusing them sends you hunting for an ESP hive that device preparation deliberately never creates.

Why it happens: a different assignment model and no Enrollment Status Page

Microsoft is blunt about this in the device preparation FAQ. Device preparation is described as a re-architecture of Windows Autopilot, where the experience for original equipment manufacturers, administrators and users is similar but the underlying architecture is different. Two of those architectural differences directly destroy the classic client-side footprint.

Difference one: nothing is assigned to the device, so nothing is cached on the device

In classic Windows Autopilot the hardware is registered with the Windows Autopilot deployment service first. A deployment profile is assigned to that registered device object, usually through a dynamic device group. When the device boots and reaches a network, it contacts the deployment service and downloads the profile. Microsoft documents that the downloaded profile settings are stored in the device's registry, and lists the values you can read there.

That download is the reason the registry keys exist. The keys are a local cache of a service-assigned artefact.

Device preparation removes the artefact. The device preparation policy is assigned to a user group, not to a device. Microsoft states plainly that devices do not need to be pre-staged, because the policy is deployed to a user group and the deployment begins once a user in that group signs in during the out-of-box experience. There is no hardware hash upload, no device registration, and no per-device profile for the client to fetch and cache.

The device group in a device preparation policy works in the opposite direction from a classic dynamic group. It is an assigned Microsoft Entra security group, and the device is added to it during enrollment. Microsoft calls this Enrollment Time Grouping. The point is that Intune knows the group membership before the device is grouped, so apps and policies deploy immediately rather than waiting for a dynamic group query to catch up.

Context: device preparation goes further than "does not need registration". The requirements state the device should not be registered or added as a Windows Autopilot device at all, because if it is, the Windows Autopilot profile takes precedence over the device preparation policy. So on a correctly configured device preparation deployment, the device is guaranteed not to be Autopilot-registered. The documented meaning of IsAutopilotDisabled = 1 is exactly that: the device is not registered with Windows Autopilot. The value is not reporting a fault. It is reporting a prerequisite being met.

Difference two: no Enrollment Status Page, so no ESP tracking hive

The second surface is even more clear cut. The Enrollment Status Page tracking hive is not written by Autopilot. It is written by the Enrollment Status Page.

Microsoft documents that the EnrollmentStatusTracking configuration service provider (CSP) was added in Windows 10, version 1903. It is used by Intune's agents, such as SideCar, to configure the Enrollment Status Page to block device use until required Win32 applications are installed. The CSP writes its state into the registry, and the Intune support documentation names the hive and walks its subkeys.

Windows Autopilot device preparation does not use the Enrollment Status Page. That is stated in three separate Microsoft articles: the device preparation FAQ, the device preparation troubleshooting FAQ, and the classic Autopilot troubleshooting FAQ. The troubleshooting FAQ even inverts the test for you. If the Enrollment Status Page appears during what you believe is a device preparation deployment, then the device is not running a device preparation deployment, and you should check whether it is Autopilot-registered or has an Autopilot profile assigned.

Instead of the ESP, the user sees a Setting up for work or school window with a round progress bar, followed by a completion page telling them setup is finished. No Enrollment Status Page means no EnrollmentStatusTracking CSP activity for the flow, which means no hive for your script to read.

Where the state actually lives now

The state moved to the service. Device preparation ships near real-time reporting: a per-device deployment report carrying a deployment status, a deployment phase, a policy name and version, per-application status and per-script status. Diagnostic logs are collected automatically when a deployment fails and can be downloaded from the report.

That is a genuine improvement in observability. It is also a hard break in tooling, because a report in the Intune admin center is not something a detection script running in SYSTEM context on the device can read.

Watch out: do not "fix" a device preparation deployment by registering the device with Windows Autopilot so your diagnostics start returning data. Registering the device makes the Autopilot profile take precedence, which stops device preparation running at all. You will have converted a working deployment into a different one. Equally, do not deregister devices in bulk to force device preparation without reading the deregistration guidance first. Removing a device from the Windows Autopilot deployment service is a destructive service-side operation, and Microsoft documents that deleting the associated Microsoft Entra device object can leave the device unable to join.

Is there a documented client-side surface for device preparation?

No. This is worth stating plainly rather than dressing up.

Across the device preparation overview, requirements, FAQ, troubleshooting FAQ, known issues, what's new and reporting articles, Microsoft documents no registry path and no event log channel for Windows Autopilot device preparation. The documented troubleshooting surfaces are the deployment report, the automatically collected diagnostics, and the end-user Export logs option during the out-of-box experience. There is no published equivalent of the classic profile cache.

Community researchers have reverse-engineered undocumented values under the Provisioning\AutopilotSettings area of the registry, and that work is genuinely useful for understanding the flow. It is not a supported contract. An undocumented value can change name, meaning or existence in any cumulative update without a release note, and a confidently wrong registry path in a detection script produces confidently wrong remediation at scale. Treat those findings as reading material, not as an interface.

Tip: there is one supported, queryable signal that names the policy which provisioned a device, and it is server-side. Since the Intune 2409 release the enrollmentProfileName property on the Intune and Microsoft Entra device objects is populated with the name of the device preparation policy applied during provisioning. Microsoft calls this out specifically so you can build assignment filters and dynamic groups on it after enrollment. Name your device preparation policies as though they will appear in a filter expression, because they will.

How to verify: read the classic surfaces and interpret their absence

The technique changes from "read the key" to "read the key and state explicitly whether it was present". A script that returns nothing tells you nothing. A script that returns "this documented value exists and is blank" tells you which flow ran.

Classic surface one: the cached Autopilot profile

Microsoft documents that Windows Autopilot profile settings received from the deployment service are stored under this key.

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Provisioning\Diagnostics\Autopilot
ValueWhat Microsoft documentsOn a device preparation device
CloudAssignedTenantDomainThe Microsoft Entra tenant the device is registered with. Blank if the device is not registered with Windows Autopilot.Expected blank - the device must not be Autopilot-registered
CloudAssignedTenantIdThe tenant GUID matching the domain above. Blank if the device is not registered with Windows Autopilot.Expected blank
IsAutopilotDisabledSet to 1 when the device is not registered with Windows Autopilot, or when the profile could not be downloaded.Expected 1, and it is not an error
AadTenantIdThe tenant GUID the signed-in user belongs to. A mismatch against registration produces an error for the user.May be present from sign-in, but proves nothing about the flow
TenantMatched1 if the user's tenant matches the tenant the device was registered with. 0 shows the user an error and forces a restart.Meaningless without a registration to match
CloudAssignedOobeConfigBitmap of configured Autopilot OOBE settings. SkipCortanaOptIn = 1, OobeUserNotLocalAdmin = 2, SkipExpressSettings = 4, SkipOemRegistration = 8, SkipEula = 16.Not written - device preparation OOBE settings are not this profile

Read that table the right way round and the diagnostic value flips. A blank CloudAssignedTenantDomain plus IsAutopilotDisabled = 1 on an Entra-joined, Intune-enrolled Windows 11 device is a positive indicator that classic Autopilot did not provision it. Combined with a device that clearly did provision, it is consistent with device preparation.

Registry Editor — Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Provisioning\Diagnostics\Autopilot
AadTenantId{aaaaaaaa-0b0b-1c1c-2d2d-333333333333}
CloudAssignedTenantDomain(value not set)
CloudAssignedTenantId(value not set)
IsAutopilotDisabled0x00000001 (1)
TenantMatched0x00000000 (0)
Illustrative. This is what a healthy Autopilot device preparation deployment looks like in the classic Autopilot key.

Classic surface two: the Enrollment Status Page tracking hive

This is the surface that is simply not there. Microsoft documents the hive and its structure for ESP troubleshooting, so its absence is meaningful rather than mysterious.

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Autopilot\EnrollmentStatusTracking
Subkey or valueWhat it recordsDocumented values
DeviceLast step of the ESP device preparation phase, plus Win32 app deployment in the device setup phaseContainer
Device\DevicePreparation\PolicyProviders\<Provider>\InstallationStateInstall state of a registered ESP policy provider, for example the Intune Management Extension (SideCar)1 NotInstalled, 2 NotRequired, 3 Completed, 4 Error
Device\DevicePreparation\PolicyProviders\<Provider>\LastErrorThe HRESULT the provider set. ESP reads it only when InstallationState is 4Integer HRESULT
Device\DevicePreparation\PolicyProviders\<Provider>\TimeoutMinutes the provider may run before ESP shows an errorInteger. Default 15 minutes
Device\DevicePreparation\PolicyProviders\<Provider>\TrackedResourceTypes\AppsWhether the provider is registered for app provisioningBoolean. Default false
Device\Setup\Apps\PolicyProviders\<Provider>\TrackingPoliciesCreatedWhether the provider created the tracking policies ESP needsBoolean. Default false
Device\Setup\Apps\Tracking\<Provider>\<AppName>\InstallationStatePer-app install state during the device setup phase1 NotInstalled, 2 InProgress, 3 Completed, 4 Error
Device\Setup\Apps\Tracking\<Provider>\<AppName>\RebootRequiredWhether the app install requires ESP to reboot1 NotRequired, 2 SoftReboot, 3 HardReboot
Setup\HasProvisioningCompletedSet by ESP when it finishes, so providers know to stop reportingBoolean
ESPTrackingInfo\Diagnostics\Expected*Timestamped status snapshots for MSI app packages, network profiles, certificate profiles, policies and modern app packagesPer-item subkeys named by timestamp
<User_SID>Account setup phase tracking. Created only if the device setup phase completedContainer

On a device preparation deployment there is no Enrollment Status Page, so there is no reason for any of this to exist. Absence of the hive is a strong positive signal, but only if your script distinguishes three outcomes: hive absent, hive present but empty, and query failed.

Classic surface three: the Autopilot event log

Microsoft documents that Windows Autopilot writes to the event log, and gives the Event Viewer location as Applications and Services LogsMicrosoftWindowsModernDeployment-Diagnostics-ProviderAutopilot. Enumerate that channel rather than hard-coding a name string, so your script survives a rename.

Event Viewer › Applications and Services Logs › Microsoft › Windows › ModernDeployment-Diagnostics-Provider › Autopilot
Event IDType and documented messageWhat it tells you
100Warning - Autopilot policy [name] not foundUsually transient while waiting for a profile download. Persistent on a device that has no profile to get.
101Info - AutopilotGetPolicyDwordByName succeededNumeric OOBE settings being retrieved from the profile
103Info - AutopilotGetPolicyStringByName succeededString OOBE settings, such as the Microsoft Entra tenant name
109Info - AutopilotGetOobeSettingsOverride succeededState-related OOBE settings being applied
111Info - AutopilotRetrieveSettings succeededThe profile settings controlling OOBE behaviour were retrieved
153Info - AutopilotManager reported the state changedNormally ProfileState_Unknown to ProfileState_Available. A profile was downloaded.
160Info - AutopilotRetrieveSettings beginning acquisitionProfile download is starting
161Info - AutopilotManager retrieve settings succeededThe profile downloaded successfully
163Info - Download is not required, device already provisionedA profile is already cached. Sysprep /Generalize normally clears it.
164Info - Internet is available to attempt policy downloadThe connectivity check passed
171Error - Failed to set TPM identity confirmedTrusted Platform Module attestation problem, needed for self-deploying mode
172Error - Failed to set Autopilot profile as availableTypically follows event 171
807Error - ZtdDeviceIsNotRegisteredHardware hash not uploaded, or no profile assigned
809Error - ZtdDeviceHasNoAssignedProfile, assigned profile does not existThe assigned profile was deleted without cleanup
815Error - ZtdDeviceHasNoAssignedProfile, no profile and no tenant defaultNo profile is assigned to the device
908Error - SerialNumberMismatch or ProductKeyIdMismatchRecorded hardware does not match the physical device

Notice what happens here. A device preparation device with no Autopilot registration can legitimately log 100, and can legitimately log 807 or 815 as the client asks for a profile that does not exist. Those are error-level events in a channel your runbook treats as authoritative. If your alerting pipeline scrapes this channel, device preparation will generate false failures at fleet scale.

Event Viewer — ModernDeployment-Diagnostics-Provider › Autopilot
Warning100Autopilot policy not found
Info164AutopilotManager determined Internet is available to attempt policy download
Info160AutopilotRetrieveSettings beginning acquisition
Error815ZtdDeviceHasNoAssignedProfile - no profile assigned and no default profile in tenant
Warning100Autopilot policy not found
Illustrative. An error-level 815 here is the expected consequence of a device that is deliberately not Autopilot-registered.

The fourth surface: ESP settings under the enrollment key

One more classic surface is worth knowing, because it is the one people most often misquote. Intune support documentation locates the Enrollment Status Page settings received by the device here.

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

Note the path carefully. It is SOFTWARE\Microsoft\Enrollments, not SOFTWARE\Microsoft\Windows\CurrentVersion\Enrollments. The same documentation notes that when the device or user status page is skipped through the DMClient CSP, SkipDeviceStatusPage or SkipUserStatusPage is set to 0xffffffff under that key. Since device preparation never delivers ESP settings, this subkey will not carry them.

Putting the three-state test together

SignalClassic Windows AutopilotAutopilot device preparation
Cached profile values populatedYes. Tenant domain and tenant ID are setNo. Documented as blank when not Autopilot-registered
IsAutopilotDisabled0 on a healthy registered device1, as a consequence of the prerequisite
ESP tracking hivePresent when an ESP profile appliedAbsent. Device preparation does not use the ESP
Autopilot event channelProfile lifecycle events including 111, 153 and 161May show 100, 807 or 815 with no profile events
Documented per-flow status surfaceThe Enrollment Status Page, plus the Windows 11 diagnostics pageThe device preparation deployment report in Intune
Client-side status contractDocumented registry values and event IDsNone documented by Microsoft

That honest third column is the deliverable. Your diagnostics were never wrong. They were answering a question about classic Autopilot on a device that did not run classic Autopilot.

The fix: move the source of truth to the service

There are three pieces of work. Point your people at the reports, teach your scripts to return three states, and stop alerting on the classic channel for device preparation fleets.

Step 1: read the device preparation deployment report

This is the documented source of truth for a device preparation deployment.

intune.microsoft.comDevicesMonitorWindows Autopilot device preparation deployments
  1. Sign in to the Microsoft Intune admin center.
  2. On the Home screen, select Devices in the left hand pane.
  3. In the Devices | Overview screen, select Monitor.
  4. Under Report name, select Windows Autopilot device preparation deployments.
  5. In the Device enrollment - Autopilot deployments screen, read the per-device rows: Device name, Enrollment date, Deployment status, Phase, Serial number, Deployment time and UPN.
  6. Select a device name to open Device deployment details, which carries the Device, Apps and Scripts sections.
  7. For a failed deployment, download the automatically collected diagnostics from the Device tab.

The same report is reachable from a second path, added in August 2024: DevicesDevice onboarding | Enrollment, then the Monitor tab.

The Phase column is the closest equivalent to the ESP phases you know. Microsoft documents three: Policy installation for initial setup and line-of-business app installation, Script installation for scripts, and App installation for Win32 and Microsoft Store apps. Application and script statuses are Installed, In progress, Skipped and Failed.

Microsoft Intune admin center — Device deployment details
CONTOSO-WKS-01
Deployment policy: APDP-UserDriven-Standard  |  Policy Version: 4  |  OS version: 10.0.26100
Deployment status: Success
Apps  —  4 Installed, 1 Skipped
Scripts  —  2 Installed
Phase  —  App installation  ·  Deployment time 00:21:40
Illustrative. A Skipped app usually means it was chosen in the policy but not assigned to the policy's device group.
Context: deployment records are cleaned up automatically every 28 days, and the automatically collected diagnostics are retained for 28 days before removal. For diagnostics to upload, the URL lgmsapeweu.blob.core.windows.net must not be blocked on your network. If you learned Autopilot troubleshooting on devices you could inspect weeks later, budget for a much shorter evidence window.

Step 2: check the enrollment time grouping failures report

This report has no classic equivalent, and it covers the failure mode unique to device preparation. The device did not join the assigned device group, so apps and policies targeted at that group never applied.

intune.microsoft.comDevicesMonitorEnrollment time grouping failures
  1. In the Microsoft Intune admin center, go to Devices.
  2. Select Monitor.
  3. Select Enrollment time grouping failures. The report shows failures only.
  4. Expect up to 20 minutes of latency before recent information appears.
  5. Confirm your role carries the Microsoft.Intune/ManagedDevices/Read permission, which is required to view it.

Microsoft recommends monitoring this report continuously, because a device that fails to join the group can have configuration changed or removed after enrollment. If group membership fails, verify that the Intune Provisioning Client service principal with AppID f1346770-5b25-470b-88bd-d5744ab7952c is still an owner of the device group, and that Microsoft Entra roles can be assigned to the group is set to No. In some tenants that service principal appears as Intune Autopilot ConfidentialClient. The AppID is what matters.

Step 3: review the policy settings that shape what you will see

intune.microsoft.comDevices › Windows › EnrollmentDevice preparation policies
  1. Sign in to the Microsoft Intune admin center and select Devices.
  2. Under By platform, select Windows.
  3. Under Device onboarding, select Enrollment.
  4. Under Windows Autopilot device preparation, select Device preparation policies.
  5. Open a policy and review Configuration settings. Under Out-of-box experience settings, check Minutes allowed before showing installation error. It applies to the whole deployment rather than to individual apps, and the accepted value is an integer between 15 and 720.
  6. Set Show link to diagnostics to Yes so a failing deployment offers the end user a log retrieval link.
  7. Note the Priority column on the policy list. Where several policies target one user, the smallest number wins.
Gotcha: there is no Group Policy path and no configuration service provider you can set locally to configure Windows Autopilot device preparation. The policy exists only as an Intune enrollment object, so this setting is portal and Graph only. Microsoft also states that device preparation supports Microsoft Entra join only, with no Microsoft Entra hybrid join, and that pre-provisioning and self-deploying mode are not part of the release. If your build process depends on any of those, classic Autopilot is still the flow you need. Microsoft expects both to run in parallel for some time.

Step 4: query the policies from Graph, read only

Device preparation policies surface in the Microsoft Graph beta endpoint for configuration policies, distinguished by the enrollment member of the deviceManagementConfigurationTechnologies enumeration. Microsoft's own enrollment time grouping documentation references the policy under that path when describing how to clear an enrollment time grouping target.

PowerShell 7 — read-only Graph queries
Connect-MgGraph -Scopes 'DeviceManagementConfiguration.Read.All','DeviceManagementServiceConfig.Read.All' # Least privilege. Both scopes are Read.All - nothing here writes. $uri = 'https://graph.microsoft.com/beta/deviceManagement/configurationPolicies' $all = (Invoke-MgGraphRequest -Method GET -Uri $uri).value $all | Where-Object { "$($_.technologies)" -match 'enrollment' } | Select-Object name, id, technologies # Device preparation policies carry the documented 'enrollment' technology. $uri = 'https://graph.microsoft.com/v1.0/deviceManagement/windowsAutopilotDeviceIdentities' (Invoke-MgGraphRequest -Method GET -Uri $uri).value.Count # If this device serial appears here, classic Autopilot takes precedence over device prep. 0

That second query is the decisive tenant-side check. Device preparation requires that the device is not registered as a Windows Autopilot device. If the serial number appears in windowsAutopilotDeviceIdentities, the classic profile wins, and you should expect classic behaviour including the Enrollment Status Page.

Step 5: rewrite the detection logic

Change every Autopilot detection script from a boolean to a tri-state. The three outcomes are evidence of classic Autopilot, evidence consistent with device preparation, and no evidence either way. That third state is the one that saves the reimage. Report the presence or absence of each documented surface separately, and never collapse "key missing" into "device unhealthy".

For the deep dive case, the documented log collection command still works and still produces the cab that the community diagnostics parser reads.

mdmdiagnosticstool.exe -area Autopilot -cab <pathToOutputCabFile>

For self-deploying, pre-provisioning and other physical-device scenarios, Microsoft documents -area Autopilot;TPM instead. The cab's MDMDiagReport_RegistryDump.Reg file contains the MDM enrollment keys, Autopilot profile settings, policies and app install state. That is exactly the set you now want to read as three-state evidence.

Proof it worked: a three-state footprint report

The companion script reads the documented classic surfaces and reports each as present, blank or absent, then names the flow the evidence supports. It never writes, it never guesses at an undocumented device preparation key, and it refuses to report a clean result when a query fails.

PowerShell — Get-ProvisioningFlowFootprint.ps1 (illustrative output)
PS C:\> .\Get-ProvisioningFlowFootprint.ps1 === Provisioning flow footprint === Computer : CONTOSO-WKS-01 OS build : 10.0.26100 Entra joined : YES [Surface 1] HKLM:\SOFTWARE\Microsoft\Provisioning\Diagnostics\Autopilot Key present : YES CloudAssignedTenantDomain : (empty) CloudAssignedTenantId : (empty) IsAutopilotDisabled : 1 TenantMatched : 0 CloudAssignedOobeConfig : (absent) # Documented: blank tenant values mean the device is not Autopilot-registered. [Surface 2] HKLM:\SOFTWARE\Microsoft\Windows\Autopilot\EnrollmentStatusTracking Key present : NO Device subkey : n/a Tracked app entries found : n/a # Absent, not empty. Device preparation does not use the Enrollment Status Page. [Surface 3] ModernDeployment-Diagnostics-Provider Autopilot channel Channel found : YES Profile events (111/153/161) : 0 No-profile events (100/807/815) : 4 # Error-level 815 with zero profile events is expected on a device prep device. [Surface 4] HKLM:\SOFTWARE\Microsoft\Enrollments\{GUID}\FirstSync Enrollments with FirstSync : 1 ESP skip values present : NO === Verdict === FLOW : Consistent with Autopilot device preparation BASIS : classic profile cache blank, ESP tracking hive absent, no profile events NOTE : Microsoft documents no client-side registry or event surface for device preparation. Confirm in Intune under Devices > Monitor > Windows Autopilot device preparation deployments.

Compare that with the same script on a classic Autopilot device, where surface one is populated, surface two exists and carries tracked apps, and surface three shows 111, 153 and 161. The two footprints are unmistakable once you print both the presence and the absence.

The script lives here:

Windows-Autopilot-Scripts\autopilot-device-prep-vs-classic-esp-registry-differences\Get-ProvisioningFlowFootprint.ps1
Tip: run the footprint script as a proactive remediation detection script across the fleet before you migrate anything to device preparation. You get a baseline of which devices carry a classic footprint, so you know exactly which serial numbers need deregistering, and you will not be surprised when your monitoring lights up with event 815 afterwards.

References

Microsoft official documentation:

Community deep dives, each fetched and confirmed on topic:

AuthorArticleWhy it is worth reading
Rudy OomsAutopilot Device Preparation - Technical Flow - APv2Reverse-engineers the device preparation flow, including undocumented state values. Read it to understand the mechanism, not to build a supported check.
Rudy OomsAutopilot Device Preparation - Autopilot Version 2 - APv2Contrasts device preparation with classic Autopilot: no hardware hash, user targeting, corporate identifiers, enrollment time grouping.
MSEndpointMgrOnboarding modern with Autopilot: Magic trick revealedThe best available walk-through of the classic Autopilot and ESP internals your existing scripts were written against.

One closing point. The absence of a documented client-side surface for device preparation is not an oversight to work around with an undocumented registry read. It is a design decision. Status is a service concern now, and the report is the contract. Build your tooling against the contract, and use the classic keys for what they remain genuinely good at: proving, definitively, that classic Autopilot was not involved.

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-ProvisioningFlowFootprint.ps1 — Reports which Windows provisioning flow a device shows evidence of: classic
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
Enrollment Configuration Priority: Why Your Second ESP Profile…
Device configuration profiles merge. Device enrollment configurations do not. Exactly one…
Autopilot
Reading AutopilotConfigurationFile.json: Every Documented Field…
Microsoft documents exactly nine properties for AutopilotConfigurationFile.json, and none…
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,…