HomeNewsletterCommunityMVP FeedToolsArchiveBlogToday's NewsAboutServicesQuick Links Subscribe free
← Back to Blog
Autopilot AutopilotIntuneMicrosoft GraphAutopilotConfigurationFileOOBEConfiguration ManagerRegistryEvent ViewerWindows 11Troubleshooting

Reading AutopilotConfigurationFile.json: Every Documented Field Mapped Back to the Intune Switch

IA
Imran Awan
21 August 2026

A user-driven Windows Autopilot deployment goes sideways. The licence terms screen appears when the profile says to hide it, or the device gets the wrong name, or a user from the wrong tenant is told to start over. The portal shows a profile that looks correct. So you go to the device for ground truth, open AutopilotConfigurationFile.json, and find nine properties with names that appear nowhere in the Intune admin center. Then you check a second device and the file is not there at all. Neither of those things is a fault. Both are documented behaviour, and this post is the reference table that makes them make sense.

The short version

Microsoft documents exactly nine properties for AutopilotConfigurationFile.json, and that file only belongs to the Windows Autopilot for existing devices scenario. Most of what you set in the Intune profile blade never reaches that file, because the file is an offline hand-off for the out-of-box experience rather than a dump of the deployment profile. The Microsoft Graph resource is the real authoring surface, and Microsoft renamed half of its properties in May 2024, so a script written against the old names silently reads deprecated fields. This post maps every documented JSON property to its Graph property and its portal control, then lists the portal settings that are not in the JSON and says where they actually live.

The problem: nine field names that match no portal label

The Intune admin center gives you roughly a dozen switches when you build a Windows Autopilot deployment profile. Deployment mode. Join type. Microsoft Software License Terms. Privacy settings. Hide change account options. User account type. Allow pre-provisioned deployment. Language (Region). Automatically configure keyboard. Apply device name template. Plus a separate Enrollment Status Page, or ESP, profile that most people mentally file under the same feature.

Here is the path you took to set them.

intune.microsoft.comDevicesWindows › EnrollmentDeployment Profiles

Now here is what Microsoft documents inside the JSON file. Nine properties, and not one of them uses a portal label as its name.

PowerShell — on the device (run elevated)
$p = 'C:\Windows\Provisioning\Autopilot\AutopilotConfigurationFile.json' Test-Path $p # False on a normally registered, cloud-assigned device. That is expected, not a fault. Get-Content $p -Raw | ConvertFrom-Json | Format-List # On an "Autopilot for existing devices" build you get at most nine documented properties. Version : 2049 CloudAssignedTenantId : aaaaaaaa-0b0b-1c1c-2d2d-333333333333 CloudAssignedTenantDomain : contoso.onmicrosoft.com CloudAssignedOobeConfig : 28 CloudAssignedDomainJoinMethod : 0 CloudAssignedForcedEnrollment : 1 ZtdCorrelationId : aaaaaaaa-0b0b-1c1c-2d2d-333333333333 CloudAssignedAadServerData : {"ZeroTouchConfig":{...}} CloudAssignedDeviceName : CONTOSO-1234

Three things in that output cause most of the confusion. The first is that Test-Path returned False on your healthy device. The second is that a whole screen of portal switches has collapsed into a single number, 28. The third is that the two settings you cared about most, Language (Region) and Automatically configure keyboard, are simply absent. There is no property for them.

Gotcha: If a colleague tells you to check the Autopilot JSON on the device during a normal cloud-registered deployment, they are describing a file that is not supposed to be there. The documented ground truth in that scenario is the registry and the event log, not a JSON file. Looking for the file and not finding it proves nothing about profile health.

Why it happens: three surfaces, three vocabularies

An Autopilot deployment profile is expressed on three different surfaces. Each one was designed at a different time for a different consumer. They do not share a naming convention, because they were never meant to be read side by side.

Surface 1: the offline JSON

AutopilotConfigurationFile.json. A hand-off file that OOBE reads when no service-assigned profile is available. Nine documented properties, all using CloudAssigned naming.

Surface 2: Microsoft Graph

The windowsAutopilotDeploymentProfile resource. The real authoring surface, and what the portal blade writes to. camelCase naming.

Surface 3: the device registry

The Provisioning diagnostics key. What the operating system actually latched onto after the profile download. A mix of both vocabularies.

The JSON is a fallback, not an export

This is the point that unlocks everything else. Microsoft documents AutopilotConfigurationFile.json under Windows Autopilot for existing devices. That is the Configuration Manager task sequence scenario. You wipe an existing domain-joined machine, lay down a fresh Windows image, and inject a JSON file so the first OOBE run behaves like an Autopilot deployment without the hardware hash having been uploaded in advance.

Because it is a fallback, it only needs the fields required to bootstrap that one flow. It needs to know which tenant to talk to. It needs to know whether to Entra join or hybrid join. It needs to know which OOBE screens to suppress. It does not need to carry the Enrollment Status Page configuration, because that arrives later from Intune over the wire.

Context: Microsoft states the precedence rule plainly. If the device is already registered with the Windows Autopilot service and has a profile assigned, the assigned profile takes precedence, and the JSON file profile only applies if the online profile times out. So the file on disk is not necessarily the profile that ran.

Two limits on the JSON that admins get wrong

The first limit is scenario coverage. Microsoft documents that the JSON file only supports user-driven Microsoft Entra ID and user-driven hybrid Microsoft Entra profiles. Self-deploying and pre-provisioning profiles are not supported through a JSON file, because those scenarios require Trusted Platform Module attestation. If you have read elsewhere that the JSON is the pre-provisioning artefact, that is wrong. Pre-provisioning needs a registered device and a service-assigned profile.

The second limit is lifetime. Windows deletes the file when Sysprep.exe runs with the /Generalize parameter. The Prepare Windows for Capture task in a Configuration Manager task sequence does exactly that. This is why the documented workaround is to remove that task and run a plain sysprep /oobe /reboot instead.

Watch out: Do not treat this file as a safe place to stash tenant identity. It contains your tenant GUID, your tenant domain and a correlation ID in clear text, and it is enough to point a freshly imaged device at your tenant during OOBE. Autopilot was never designed as a security boundary. Protect enrolment with Conditional Access and enrollment restrictions, and treat any distribution point package containing this file as sensitive content.

Graph renamed half its properties in May 2024

The Graph surface has its own trap. Microsoft published a second generation of property names and marked the originals deprecated. Both still appear in the resource documentation, which makes it easy to write a script against the wrong one. The current name is the one to use.

Current Graph propertyDeprecated predecessorPortal control
localelanguageLanguage (Region)
outOfBoxExperienceSettingoutOfBoxExperienceSettingsThe OOBE page as a whole
hardwareHashExtractionEnabledextractHardwareHashConvert all targeted devices to Autopilot
preprovisioningAllowedenableWhiteGloveAllow pre-provisioned deployment
privacySettingsHiddenhidePrivacySettingsPrivacy settings
eulaHiddenhideEULAMicrosoft Software License Terms
keyboardSelectionPageSkippedskipKeyboardSelectionPageAutomatically configure keyboard
escapeLinkHiddenhideEscapeLinkHide change account options

The singular outOfBoxExperienceSetting is the current shape, and it exists in the Graph v1.0 endpoint rather than only in beta. The plural outOfBoxExperienceSettings is documented as read-only and deprecated. Notice the rename pattern: the old shape used verb-first names such as hideEULA, and the new shape uses noun-first names such as eulaHidden. Once you see the pattern you can predict the rest.

Tip: Microsoft's own description of keyboardSelectionPageSkipped contradicts itself. It says the page is hidden when the value is TRUE, then says the page is skipped when the value is FALSE. Trust the portal semantics instead: Automatically configure keyboard set to Yes is what skips the page, and that maps to TRUE. Verify on a test device rather than on the sentence.

How to verify: file, registry, event log and Graph

Check all the surfaces, in this order, because each answers a different question. The file tells you what was injected. The registry tells you what the operating system accepted. The event log tells you the sequence of how it got there. Graph tells you what you authored.

Step 1: the file, if the scenario calls for one

The current Microsoft articles are precise about the file name and encoding, but they do not spell out the on-device folder. The path used by the documented task sequence step, and shown in Microsoft's own archived engineering blog, is the Provisioning folder under the Windows directory.

C:\Windows\Provisioning\Autopilot\AutopilotConfigurationFile.json

Two file-level requirements matter more than any property inside it. The file name must be exactly AutopilotConfigurationFile.json, and the encoding must be ASCII or ANSI. Microsoft states that OOBE will not follow the Autopilot experience if the file is saved as Unicode, as UTF-8, or under any other name. That is why the documented command uses Set-Content -Encoding Ascii rather than Out-File, which defaults to Unicode and can also truncate long lines.

Step 2: the registry, which is the real ground truth

On any device that received a profile from the Windows Autopilot deployment service, the settings land in the registry. This is the surface to check on a normal cloud-registered device. Microsoft documents six values under one key.

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Provisioning\Diagnostics\Autopilot
ValueWhat Microsoft documents it asWhat it tells you
CloudAssignedTenantIdThe GUID of the Entra tenant the device registered with. Blank if the device is not registered with Autopilot.Blank here plus a missing JSON file means the device is not an Autopilot device at all.
CloudAssignedTenantDomainThe Entra tenant the device is registered with, for example contosomn.onmicrosoft.com. Blank if not registered.Confirms which tenant claimed the device. Mismatches here explain wrong-tenant sign-in errors.
AadTenantIdThe GUID of the Entra tenant the user signed into.Compare it against CloudAssignedTenantId. A difference produces the belongs-to-another-organization message.
TenantMatchedSet to 1 if the user tenant ID matches the tenant ID the device was registered with. If 0, the user is shown an error and forced to start over.The fastest yes-or-no answer for a failed user-driven sign-in.
IsAutopilotDisabledIf set to 1, the device is not registered with Autopilot. It can also mean the profile could not be downloaded because of connectivity, firewall or timeout.Deliberately ambiguous. Read it with the event log to tell not-registered from could-not-reach-the-service.
CloudAssignedOobeConfigA bitmap that shows which Autopilot settings were configured.The same number as in the JSON. Decode it rather than eyeballing it.
Registry Editor — HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Provisioning\Diagnostics\Autopilot
AadTenantIdREG_SZ  aaaaaaaa-0b0b-1c1c-2d2d-333333333333
CloudAssignedTenantIdREG_SZ  aaaaaaaa-0b0b-1c1c-2d2d-333333333333
CloudAssignedTenantDomainREG_SZ  contoso.onmicrosoft.com
CloudAssignedOobeConfigREG_DWORD  0x0000001c (28)
TenantMatchedREG_DWORD  0x00000001 (1)
IsAutopilotDisabledREG_DWORD  0x00000000 (0)
PowerShell — reading the diagnostics key (run elevated)
$k = 'HKLM:\SOFTWARE\Microsoft\Provisioning\Diagnostics\Autopilot' Get-ItemProperty -Path $k | Select-Object CloudAssignedTenantDomain, TenantMatched, IsAutopilotDisabled # Healthy user-driven device: domain populated, TenantMatched = 1, IsAutopilotDisabled = 0. # A blank domain with IsAutopilotDisabled = 1 means no profile was ever applied. CloudAssignedTenantDomain : contoso.onmicrosoft.com TenantMatched : 1 IsAutopilotDisabled : 0
Tip: Compare CloudAssignedOobeConfig in the registry against the value in the JSON file when both exist. If they differ, the service-assigned profile won the precedence contest and your task sequence JSON never took effect. That one comparison saves an hour of guessing.

Step 3: the event log, for the sequence

Autopilot writes its own channel. In Event Viewer, expand Applications and Services Logs.

Event Viewer › Applications and Services Logs › Microsoft › Windows › ModernDeployment-Diagnostics-Provider › Autopilot
Event Viewer — ModernDeployment-Diagnostics-Provider / Autopilot
Info160AutopilotRetrieveSettings beginning acquisition.
Warning100Autopilot policy [name] not found.
Info153State changed from ProfileState_Unknown to ProfileState_Available.
Info111AutopilotRetrieveSettings succeeded.
Error815ZtdDeviceHasNoAssignedProfile - no profile and no tenant default.

These are the documented IDs for that channel. Read them as a story rather than as isolated errors, because a single warning early in the sequence is normal.

Event IDTypeWhat it means for field mapping
100WarningAutopilot policy not found. Typically transient while the device waits for the profile download.
101InfoA numeric OOBE setting was retrieved and processed. This is where bitmask-derived values appear.
103InfoA string OOBE setting was retrieved, such as the Entra tenant name.
109InfoA state-related OOBE setting override was retrieved.
111InfoThe settings that control OOBE behaviour were retrieved successfully.
153InfoProfile state changed, usually to ProfileState_Available. The device is ready to deploy.
160InfoAutopilot is getting ready to download the profile settings.
161InfoThe Autopilot profile downloaded successfully.
163InfoDownload not required, the device is already provisioned. Sysprep /Generalize typically clears that state.
164InfoInternet is available, so a policy download will be attempted.
171ErrorFailed to set TPM identity confirmed. An attestation problem, needed for self-deploying mode.
172ErrorFailed to set the Autopilot profile as available. Usually the companion to 171.
807ErrorZtdDeviceIsNotRegistered. Check the hardware hash upload and the profile assignment.
809ErrorAssigned profile does not exist. The profile was deleted without cleanup.
815ErrorNo profile assigned to the device and no default profile in the tenant.
908ErrorSerialNumberMismatch or ProductKeyIdMismatch between the Autopilot record and the hardware.

Step 4: the Graph object, for what you actually authored

The portal blade is a view over the Graph resource, so reading Graph directly removes the label translation step entirely.

Microsoft Graph — read-only, DeviceManagementServiceConfig.Read.All
GET /v1.0/deviceManagement/windowsAutopilotDeploymentProfiles { "@odata.type": "#microsoft.graph.azureADWindowsAutopilotDeploymentProfile", "displayName": "UD - Entra join - EU", "locale": "os-default", "deviceNameTemplate": "CONTOSO-%SERIAL%", "deviceType": "windowsPc", "preprovisioningAllowed": true, "hardwareHashExtractionEnabled": false, "outOfBoxExperienceSetting": { "privacySettingsHidden": true, "eulaHidden": true, "userType": "standard", "deviceUsageType": "singleUser", "keyboardSelectionPageSkipped": true, "escapeLinkHidden": true } }

The @odata.type is doing real work here. An azureADWindowsAutopilotDeploymentProfile is an Entra join profile. An activeDirectoryWindowsAutopilotDeploymentProfile is a hybrid join profile, and it is the only one of the two that carries hybridAzureADJoinSkipConnectivityCheck and a domainJoinConfiguration relationship. That type distinction is what the JSON compresses into the single digit in CloudAssignedDomainJoinMethod.

The fix: the complete three-surface field map

This is the table to keep. Every documented JSON property, its Graph counterpart, the portal control that produces it, and what it actually does at OOBE time.

JSON propertyGraph equivalentPortal controlWhat it actually does
Version
Number, optional
NoneNoneIdentifies the format of the JSON file. Written by the conversion cmdlet, not by you.
CloudAssignedTenantId
GUID, required
Implied by the tenant, not a profile propertyNoneThe Entra tenant GUID to use. Documented as a GUID with no braces.
CloudAssignedTenantDomain
String, required
Implied by the tenantNoneThe Entra tenant name, for example tenant.onmicrosoft.com.
CloudAssignedOobeConfig
Number, required
The outOfBoxExperienceSetting BooleansMicrosoft Software License Terms, Privacy settings, User account typeA bitmap of which OOBE settings were configured. Three of its five documented bits correspond to portal switches. Two do not.
CloudAssignedDomainJoinMethod
Number, required
The resource subtype, azureAD... or activeDirectory...Join to Microsoft Entra ID as0 means Entra joined, 1 means Entra hybrid joined. The whole join decision in one digit.
CloudAssignedForcedEnrollment
Number, required
NoneNoneSpecifies that the device must Entra join and enrol in MDM. 0 is not required, 1 is required. No portal switch exposes it.
ZtdCorrelationId
GUID, required
NoneNonePassed to Intune during registration as OfflineAutopilotEnrollmentCorrelator. Present only for offline registration.
CloudAssignedAadServerData
Encoded JSON string, required
NoneEntra organization branding, not the Autopilot bladeAn embedded JSON string used for branding. Requires Entra organization branding to be enabled.
CloudAssignedDeviceName
String, optional
deviceNameTemplateApply device name templateThe name assigned to the computer. Follows the profile naming pattern, or an explicit name you set.
Context: The sample output in Microsoft's own article also shows a Comment_File key that does not appear in the documented property table. Treat it as descriptive metadata written by the conversion cmdlet. Do not build logic on it, because it is not part of the documented contract.

Where the bitmask fits, and where to stop

Microsoft documents five bits for CloudAssignedOobeConfig, and the same five appear in the registry documentation. Three map to portal controls. OobeUserNotLocalAdmin corresponds to User account type set to Standard. SkipExpressSettings corresponds to hiding Privacy settings. SkipEula corresponds to hiding Microsoft Software License Terms. The other two documented bits, SkipCortanaOptIn and SkipOemRegistration, have no portal switch at all. They are set by the service.

Rather than repeating the bit table here, decode the number using the dedicated walkthrough: CloudAssignedOobeConfig Decoded: Which OOBE Screens Your Profile Actually Skipped. The important point for field mapping is the direction of the relationship. Portal switches feed the bitmask. The bitmask does not enumerate portal switches, so you cannot reconstruct a profile from the number alone.

The settings that are not in the JSON at all

This is the list nobody writes down, and it is longer than the documented property table. Every row here is a portal control with no JSON representation.

Portal controlGraph propertyWhere it actually lives
Deployment mode, user-driven or self-deployingExpressed through userType and deviceUsageTypeService-side only. Self-deploying is not supported by a JSON file because it requires TPM attestation.
Language (Region)localeService-side only. Delivered with the downloaded profile, never in the JSON.
Automatically configure keyboardkeyboardSelectionPageSkippedService-side only. Also requires Ethernet, because language selection precedes the Wi-Fi connection.
Hide change account optionsescapeLinkHiddenService-side only, and dependent on Entra company branding being configured.
Allow pre-provisioned deploymentpreprovisioningAllowedService-side only. Pre-provisioning profiles cannot be delivered by JSON.
Convert all targeted devices to AutopilothardwareHashExtractionEnabledA registration behaviour on the Basics page, not an OOBE behaviour. Nothing on the device reads it.
Create Profile: Windows PC or HoloLensdeviceTypeService-side only. Documented values include windowsPc, holoLens and virtualMachine.
Enrollment Status Page settings, all of themenrollmentStatusScreenSettingsA separate blade under Windows Autopilot and a separate Graph complex type. Arrives from Intune after enrolment.
Scope tagsroleScopeTagIdsAn Intune role-based access control construct. It never reaches the device.
Assignments, include and exclude groupsThe assignments relationshipService-side. The JSON has no concept of targeting, which is exactly why it works on unregistered hardware.
Skip Active Directory connectivity check, hybrid onlyhybridAzureADJoinSkipConnectivityCheckOnly on the hybrid profile subtype. Domain and organizational unit come from a separate Domain Join device configuration profile.
Name and DescriptiondisplayName and descriptionPortal metadata. On the offline path the device profile name becomes OffilineAutoPilotProfile-<ZtdCorrelationId> instead, spelled exactly that way in the documentation.
Watch out: Because the Enrollment Status Page configuration is not in the JSON, an Autopilot for existing devices build reaches the desktop with whatever ESP profile Intune hands it after enrolment. Your task sequence controlled none of it. If your ESP blocks on required apps, the JSON gives you no lever over that phase. Test ESP behaviour separately from JSON behaviour.

The console walkthrough that produces each surface

To set the portal controls that feed the profile:

intune.microsoft.comDevicesBy platform: WindowsDevice onboarding: Enrollment
  1. Sign in to the Microsoft Intune admin center.
  2. Select Devices in the left hand pane.
  3. Under By platform, select Windows.
  4. Under Device onboarding, select Enrollment.
  5. Under Windows Autopilot, select Deployment Profiles.
  6. Select Create Profile, then select Windows PC.
  7. On the Basics page, enter a Name and optional Description, then set Convert all targeted devices to Autopilot.
  8. On the Out-of-box experience (OOBE) page, set Deployment mode, then Join to Microsoft Entra ID as.
  9. Set Microsoft Software License Terms, Privacy settings, Hide change account options, User account type, Allow pre-provisioned deployment, Language (Region), Automatically configure keyboard and Apply device name template.
  10. On the Assignments page, choose Selected groups and pick the groups to include or exclude.
  11. On the Review + Create page, select Create.
Create profile — Out-of-box experience (OOBE)
Deployment modeUser-driven
Join to Microsoft Entra ID asMicrosoft Entra joined
Microsoft Software License TermsHide
Privacy settingsHide
Hide change account optionsHide
User account typeStandard
Allow pre-provisioned deploymentYes
Apply device name templateYes

To produce the JSON file for the existing-devices scenario, Microsoft documents the conversion through the WindowsAutopilotIntune module. Two details in that command are load-bearing. The profile is written into a per-profile subfolder, and the encoding is forced to ASCII.

PowerShell — generating the documented JSON (admin workstation)
Get-AutopilotProfile | ConvertTo-AutopilotConfigurationJSON # Prints every profile in the tenant in the nine-property JSON shape. $AutopilotProfile = Get-AutopilotProfile $targetDirectory = "C:\Autopilot" $AutopilotProfile | ForEach-Object { New-Item -ItemType Directory -Path "$targetDirectory\$($_.displayName)" $_ | ConvertTo-AutopilotConfigurationJSON | Set-Content -Encoding Ascii "$targetDirectory\$($_.displayName)\AutopilotConfigurationFile.json" } # Set-Content -Encoding Ascii, never Out-File. Out-File writes Unicode and OOBE ignores the file.
Gotcha: The Autopilot deployment profile is a cloud service object. There is no Group Policy path and no configuration service provider or OMA-URI that sets these fields. The only three documented ways in are the Intune admin center, the Microsoft 365 admin center and Microsoft Graph. Any advice offering you a Group Policy Object for Autopilot profile settings is describing something else, most likely an OOBE policy that conflicts with Autopilot rather than configures it.
Tip: If you edit a profile and nothing changes on an already-enrolled device, that is documented behaviour. An updated profile is not applied until the device is reset and enrolled again. There is also a client-side cache involved, covered in Your Autopilot Profile Edit Didn't Apply: The Cache Nobody Checks.

Proof it worked: a clean read of all three surfaces

The companion script reads all three surfaces on the local device and prints each documented field with a plain-English explanation. It is read-only, it never writes, and it redacts tenant identifiers unless you explicitly ask for them.

PowerShell — Get-AutopilotProfileFieldReport.ps1 (illustrative output, not a real run)
PS C:\> .\Get-AutopilotProfileFieldReport.ps1 === Autopilot profile field report === Tenant identifiers are REDACTED. Use -ShowTenantIdentifiers to reveal them. --- Surface 1: AutopilotConfigurationFile.json --- Path : C:\Windows\Provisioning\Autopilot\AutopilotConfigurationFile.json Status : NOT PRESENT Note : Expected on "Autopilot for existing devices" builds only. Absence on a cloud-registered device is normal and is not a fault. --- Surface 2: Provisioning diagnostics registry --- Key : HKLM:\SOFTWARE\Microsoft\Provisioning\Diagnostics\Autopilot CloudAssignedTenantDomain = [REDACTED] The Entra tenant this device is registered with. Blank means not registered. CloudAssignedTenantId = [REDACTED] GUID of the tenant that claimed the device. AadTenantId = [REDACTED] GUID of the tenant the signing-in user belongs to. TenantMatched = 1 1 means the user tenant matched the device tenant. 0 forces the user to start over. IsAutopilotDisabled = 0 1 means not registered, OR the profile download failed. Check the event log too. CloudAssignedOobeConfig = 28 Bitmap of configured OOBE settings. Decode the bits, do not eyeball the number. --- Values present but NOT documented by Microsoft --- CloudAssignedLanguage, CloudAssignedRegion, CloudAssignedTenantUpn, CloudAssignedForcedEnrollment, CloudAssignedMdmId, CloudAssignedTelemetryLevel, DeploymentProfileName, HybridJoinSkipDCConnectivityCheck, IsDevicePersonalized, DisableEnrollmentStatusPageForceSyncing, EnrollmentStatusPageSyncIntervalMinutes Real devices carry more values here than Microsoft documents. They are informational only. Do not build detection or remediation logic on them. --- Coverage summary --- Documented JSON properties found in file : 0 of 9 (file absent) Documented registry values found : 4 of 6 Verdict: cloud-assigned device, profile applied.

Read the verdict line first, then work upward. If the documented registry count is below six on a device you believe is Autopilot-registered, the profile download is the thing to investigate, and event IDs 100, 160 and 815 will tell you which part failed.

Gotcha: The diagnostics key on a real device carries considerably more than the six documented values, and the event channel emits IDs that are not in the documented catalog either. That is not a documentation error you can work around. It means those extra values are implementation detail, subject to change without notice, and unsafe to build a compliance check or a Proactive Remediation detection script on. Report them, do not depend on them.

Two of those undocumented values are worth naming because they explain a common false conclusion. CloudAssignedLanguage and CloudAssignedRegion exist in the registry even though there is no matching JSON property, which is why people assume the JSON must carry language settings somewhere. It does not. The service delivered those values over the wire.

PowerShell — correlating the event log with the registry
$log = 'Microsoft-Windows-ModernDeployment-Diagnostics-Provider/Autopilot' Get-WinEvent -LogName $log -MaxEvents 25 | Select-Object TimeCreated, Id, LevelDisplayName | Format-Table -AutoSize # Look for 160 then 161 then 153 in sequence. That is a clean profile acquisition. # A 163 on its own means the device was already provisioned and skipped the download.

One last framing makes the whole mapping easier to remember. The JSON file answers how to make an unregistered machine behave like an Autopilot device once. The Graph object answers what every device in a group should experience. The registry answers what this specific device actually got. Nine properties, roughly twenty Graph properties and six registry values are not three views of one thing. They are three answers to three different questions, and choosing the right surface first is most of the troubleshooting.

References

Microsoft official documentation:

Community deep-dives, each fetched and verified as on topic:

AuthorArticleWhy it is worth reading
Maurice Daly and Sandy Zeng, MSEndpointMgrAutopilot and the perceived tenant security riskWalks through what the offline JSON actually enables, field by field, and argues correctly that Autopilot is not a security boundary.
Rudy Ooms, call4cloud.nlStep by step: how Windows retrieves the Autopilot profileThe clearest account of the online path, including how the profile is fetched during OOBE and where it is cached. That is the surface the JSON file stands in for.

Related posts on this site:

The companion script Get-AutopilotProfileFieldReport.ps1 is read-only, ASCII-only, and runs on both Windows PowerShell 5.1 and PowerShell 7. It redacts tenant identifiers by default.

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-AutopilotProfileFieldReport.ps1 — Read-only field report for the local Windows Autopilot profile surfaces.
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 Autopilot Conditional Access deadlock: requiring a compliant…
A brand-new Autopilot device cannot be compliant before it is enrolled, so a Conditional…
Autopilot
Autopilot Language, Region and Keyboard: The Profile Skips a…
You set Language (Region) in the Autopilot profile, the OOBE screens disappear, and the…
Autopilot
Autopilot device preparation leaves a different footprint - and…
Your trusted Autopilot troubleshooting steps return blank values on a device preparation…