A brand-new laptop from a reputable OEM, TPM 2.0 present, Secure Boot on, Windows 11 Pro out of the box - everything on the spec sheet says this device qualifies for Windows Autopilot. You run Get-WindowsAutopilotInfo -Online, sign in, and get back an import error instead of a hardware hash upload. Nothing in the hardware is actually broken. The device is Autopilot-capable in every sense that matters to a spec sheet, and Autopilot doesn't care, because "capable" and "registered" check two completely different things.
This post breaks down what Microsoft actually documents as the Autopilot hardware and firmware guidelines, why those guidelines are best practices rather than enforced gates, and the specific data-quality gap that causes a real, eligible device to fail hash capture or profile assignment anyway. It ends with a read-only PowerShell script that audits every Autopilot-registered device in your tenant against the red flags this article covers.
Before any of that, it's worth being precise about three terms people use interchangeably, because the whole problem in this post lives in the gaps between them:
| Term | What it actually means |
|---|---|
| Autopilot-capable | The physical hardware meets Windows' minimum requirements and the guideline-level firmware best practices (TPM 2.0, Secure Boot). Nothing has been uploaded to Microsoft anywhere. |
| Autopilot-registered | A hardware hash tied to that specific device's SMBIOS identity has been successfully uploaded and now exists as a windowsAutopilotDeviceIdentity object in your tenant. |
| Autopilot-enrolled | The registered device has actually booted, joined Microsoft Entra ID, and completed MDM enrollment into Intune (or another MDM). |
A device can be capable and never registered. It can be registered and never enrolled. Every failure in this article happens at the first gap - capable, but the registration attempt itself fails - which is the gap almost nobody checks for, because it's easy to assume that if the hardware is good enough, the paperwork will take care of itself.
The problem — the hardware hash upload fails, but the hardware is fine
Windows Autopilot registration depends on two pieces of information travelling together without corruption: a hardware hash (the device's unique cryptographic identity) and a small set of SMBIOS-sourced identity fields - manufacturer, product name, and serial number. Microsoft Learn's own Windows Autopilot device guidelines are explicit about where these fields come from:
Notice the word "should," not "must." Autopilot device guidelines describes hardware and firmware best practices - TPM 2.0 enabled and not in Reduced Functionality Mode, SMBIOS fields properly provisioned, OEM hash uploads completed within a defined window - but nothing in Windows Setup, in the retail sales process, or in most refurbishment/leasing pipelines actually enforces them before a device reaches your loading dock. A device can boot, activate Windows, pass every visible eligibility check, and still carry a SMBIOS serial number field that reads System Serial Number, To Be Filled By O.E.M., or simply blank.
When that device's hash gets uploaded - whether by the OEM's own Channel Balance Report (CBR) process, by a CSV import into Intune, or via Get-WindowsAutopilotInfo - Microsoft's own troubleshooting documentation for add-devices names the exact resulting error:
That is the single most common reason a genuinely eligible device fails hardware hash capture: not the TPM, not Secure Boot, not the network - it's a missing or placeholder identity field that was never Autopilot's problem to catch, because Autopilot only validates what it receives.
Why it happens — three different failure paths that all look identical from the portal
There isn't one root cause here; there are at least three, and the Intune admin center reports all of them the same unhelpful way (an import error, or a device that simply never appears). Knowing which one you're looking at changes what you do next.
1. SMBIOS was never properly provisioned
This is most common on white-box builds, some VM templates used for Autopilot testing, and lower-tier OEM lines where the CBR/OA3 hash-upload step described in the device guidelines either wasn't run, or was run against firmware that hadn't set the SMBIOS Type 1 fields correctly in the first place. The device works perfectly as a Windows PC. It just has no trustworthy manufacturer/serial identity for Autopilot to anchor a hash to.
2. The hash itself got corrupted in transit
Microsoft's troubleshooting FAQ documents a second, completely different failure mode: a hardware hash that is valid at capture time but gets mangled before import. The hash is Base64-encoded; the device encodes it unpadded, but the Autopilot import API expects padded Base64. Usually the payload happens to align and nothing goes wrong. When it doesn't:
Cannot convert the literal '[DEVICEHASH]' to the expected type 'Edm.Binary'. This is a padding problem, not a bad hash - Microsoft's fix is to test-decode the hash with PowerShell's Base64 decoder and add/replace trailing = characters until it decodes without error.3. The device is already registered - just not to you
Refurbished, leased, and previously-decommissioned fleets carry hardware hashes that were already uploaded once, sometimes to a different tenant entirely. Microsoft names this exact scenario as ZtdDeviceAssignedToAnotherTenant - the uploaded hash matches a device already registered elsewhere. The hardware is completely fine. The registration attempt fails because Autopilot correctly refuses to double-assign a hash it has already seen.
All three of these produce the same experience for whoever is standing at the loading dock: a device that looks Autopilot-ready and isn't Autopilot-registered, for reasons that have nothing to do with what's actually wrong (or not wrong) with the hardware.
It's also worth understanding where the "should" in Microsoft's guidance is supposed to be enforced upstream, because it explains why so many devices slip through anyway. The device guidelines describe an OEM-side process: before shipping, the OEM uploads 4K hardware hashes to Microsoft using a Channel Balance Report (CBR), with hashes collected by the OA3 Tool running in audit mode on the full OS. Microsoft then requires OEM shipping drivers to be published to Windows Update within 30 days of that CBR submission, and firmware/driver updates within 14 days. That's a supply-chain process happening before the device ever reaches you - and like any supply-chain process, it's only as reliable as the weakest OEM, reseller, or refurbishment step in the chain. A channel partner reselling stock that skipped the CBR step, or a refurbisher that reimaged a device without re-running hash collection, produces exactly the same symptom as a genuine firmware defect: a device that's physically capable and administratively invisible to Autopilot.
How to verify — check the actual identity data before you assume the hardware is at fault
Before escalating a "won't register" device to a support ticket, confirm what data the device is actually presenting. Three checks, in order of usefulness.
1. Confirm the SMBIOS identity fields on the device itself. Microsoft's own troubleshooting guidance for InvalidZtdHardwareHash points straight at this command:
If either field is blank, or reads a value from the placeholder list Microsoft's docs implicitly reference (things like System Serial Number or To Be Filled By O.E.M.), you've found your root cause before opening a single ticket.
2. Confirm the TPM is actually in a healthy state. This one matters specifically for self-deploying mode, and it is not something the Intune admin center, or the Autopilot Graph resource, surfaces for you:
TpmPresent as true and will still fail self-deploying mode. If self-deploying registration fails specifically, check the Autopilot event log first (below) for Event ID 171 - "AutopilotManager failed to set TPM identity confirmed" - before assuming a clean TPM read means the TPM is actually fine for Autopilot's purposes.While you're on the device, it's worth a second, separate check for Secure Boot, since a device can have a perfectly healthy TPM and still have Secure Boot disabled in firmware after a manual BIOS reset or a technician-installed alternate OS during testing:
Neither the TPM state nor the Secure Boot state is visible from the Intune admin center or from the Autopilot Graph resource once the device is registered - both checks only make sense run locally, on the device, before or during an active troubleshooting session.
3. Check the Autopilot event log on a device that already attempted registration. This is the deepest diagnostic layer, and it's the one most admins never open:
This exact event is Microsoft's documented signature for a device whose registered identity no longer matches its physical identity - motherboard replacements are the classic cause, but a device that was hashed once with placeholder SMBIOS data and later had that data corrected by a firmware update shows the same symptom.
The fix — re-establish a clean identity, then re-register
The fix depends on which of the three failure paths from earlier you're dealing with, but all three end at the same place: getting a hash tied to real, unique SMBIOS identity fields into Autopilot.
Step 1 — re-capture the hash with a script that uploads directly, rather than a stale CSV
- Sign in to the device and open an elevated PowerShell prompt.
- Run
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12. - Run
Install-Script -Name Get-WindowsAutopilotInfo -Force. - Run
Get-WindowsAutopilotInfo -Onlineand sign in with an Intune Administrator account when prompted. - Watch for the immediate result: a successful upload confirms the SMBIOS fields were valid; an
InvalidZtdHardwareHashor import error confirms they weren't.
-Online instead of saving to CSV and importing later removes the manual CSV round-trip entirely - and the manual round-trip is exactly where the unpadded-Base64 corruption from earlier tends to get introduced, since it usually happens when a hash is hand-edited or passed through a tool that doesn't preserve the original encoding.Step 2 — if the SMBIOS fields are genuinely blank or placeholder, this is a firmware/OEM problem, not an Autopilot problem
No Intune setting fixes a serial number field the firmware never set correctly. At that point the options are: a firmware update from the OEM that corrects SMBIOS provisioning, an RMA if the OEM confirms it's a manufacturing defect, or (for internal-only test/VM fleets) manually setting the SMBIOS fields in the hypervisor's VM configuration before first boot.
Step 3 — if it's a tenant-assignment conflict, don't re-import - find where it already lives
- Sign in to the Microsoft Intune admin center.
- Select Devices in the left pane, then under By platform select Windows.
- Under Device onboarding, select Enrollment.
- Under Windows Autopilot, select Devices.
- Search for the serial number from the failed CSV row.
- If it's not present in your tenant's list at all, the device is registered to a different tenant - typically the previous owner, lessor, or reseller. That registration has to be removed at the source; it can't be forcibly reassigned from your side.
ZtdDeviceAssignedToAnotherTenant or ZtdDeviceDuplicated error will clear itself. Both errors mean the specific row was not processed - retrying with unchanged data returns the same result every time. Fix the source data or the source tenant assignment first.Proof it worked — confirm at the tenant level, not just for the one device you were chasing
Fixing one device's hash doesn't tell you whether the same SMBIOS or duplication problem exists elsewhere in the fleet you haven't looked at yet. The companion script below queries every windowsAutopilotDeviceIdentity record already registered in your tenant via Microsoft Graph and flags the same red flags this article covers: missing or placeholder serial number/manufacturer/model values, duplicate serial numbers, and devices that registered but have never actually contacted the Autopilot service since.
Get-AutopilotHardwareEligibilityAudit.ps1 is free and open source. It's a genuinely read-only script — no writes to Autopilot, Intune, or Entra ID.
Get-MgDeviceManagementWindowsAutopilotDeviceIdentity. It makes no write, update, or delete calls to Microsoft Graph, Intune, or Entra ID. It also cannot see live TPM or Secure Boot state - the Graph windowsAutopilotDeviceIdentity resource does not expose either property - so those two checks still require the on-device commands from the "How to verify" section above.References
- Windows Autopilot device guidelines — Microsoft Learn
- Manually register devices with Windows Autopilot — Microsoft Learn
- Windows Autopilot troubleshooting FAQ — Microsoft Learn
- windowsAutopilotDeviceIdentity resource type — Microsoft Graph v1.0
- Windows Autopilot registration overview — Microsoft Learn