HomeNewsletterCommunityMVP FeedToolsArchiveBlogToday's NewsAboutServicesQuick Links Subscribe free
← Back to Blog

Your Intune Portal Shows What Was Assigned. This Script Shows What Actually Landed.

IA
Imran Awan
29 July 2026

A device shows "Succeeded" against every policy in the Intune admin center. The user still isn't getting the behaviour the policy is supposed to enforce. Before you touch the assignment, the conflict-resolution engine, or open a support ticket, there's a question worth answering first: has that policy actually landed on this device, in this registry, right now? The admin center reports deployment status from the last check-in. It does not show you the live, local, currently-in-effect value sitting on the machine in front of the user.

That gap is where a lot of wasted troubleshooting time goes. This post covers where MDM policy actually lives on a Windows device, why "Succeeded" in the portal and "in effect" on the device aren't the same claim, and a script that reads all six real local sources in one pass so you don't have to open Registry Editor six times.

The problem — six different places, one incomplete picture from any single one

When Intune deploys a policy to a device, the actual mechanism is the Windows Policy CSP. Microsoft's own troubleshooting documentation states this plainly for Update rings, and the same mechanism applies to every other MDM policy category:

Microsoft Learn, on how deployment actually works: "Windows Update ring policies created in Intune use the Windows Policy CSP for updating Windows devices. Once Intune deploys the Windows Update ring policy to an assigned device, the Policy configuration services provider (CSP) writes the appropriate values to the Windows registry to make the policy take effect."

Writes the appropriate values to the registry — not to a cache, not to a config file the portal can query remotely on demand. The registry is the actual, physical destination. Everything the Intune console shows you about "applied" status is a report generated from telemetry the device sent back on its last check-in cycle. It's accurate as of that check-in. It is not a live read of the device's current state.

The same Learn article is explicit that this local verification step is a distinct, necessary stage of troubleshooting, separate from the admin center:

Microsoft Learn: "If the previous options didn't provide the results needed to identify the issue... Confirm that the correct registry keys have been updated. If Intune successfully deploys the Windows Update ring policies to the target device, those settings appear in the Registry Editor under HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PolicyManager\current\device\Update."

Generalise that one policy area to the whole device and you get the six sources that actually matter when you need ground truth:

No single one of those six tells the whole story. A policy can be present and correct in PolicyManager\current\device while the device is actually failing to apply it because dsregcmd shows a broken PRT. A GPO sitting in SOFTWARE\Policies\Microsoft can be silently overriding what MDM just wrote to the CSP-backed key next to it. You only see the real picture by reading all six together.

Why it happens — the portal reports check-in telemetry, not live device state

This isn't a bug in Intune — it's an inherent property of how any cloud-managed fleet has to work. The admin center can't hold an open connection to every enrolled device and query its registry on demand; it relies on the device phoning home on its regular check-in cycle and reporting what it applied. Between check-ins, or if the device has any delivery, connectivity, or conflict issue that a person hasn't yet investigated, the portal's "Succeeded" reflects the last known-good report, not necessarily the device's current reality.

Gotcha: a policy conflict between an MDM-delivered value and a leftover on-prem Group Policy value doesn't always surface as a portal error. Microsoft's own troubleshooting guide for Update rings calls this out directly for that policy area, noting that mixed MDM/GPO deployments can silently produce "unexpected" results — "many group policies are old and cached, and you won't know they still exist" — and recommends checking gpresult and the registry directly rather than trusting the console status alone.

The PolicyManager\providers and SOFTWARE\Microsoft\Enrollments hives matter for a related but different reason: they're where you confirm the device is actually enrolled the way you think it is, with the provider you expect, rather than assuming enrollment health from the fact that policies are merely present. Microsoft's guidance on diagnosing enrollment failures notes that enrollment information is written into the registry and can occasionally persist even after unenrollment — another reason a registry read beats an assumption based on portal status alone.

How to verify — read the real sources before you file a ticket or start reassigning

You can check every one of these manually. It's slow, but knowing where to look by hand is what makes the automated version trustworthy rather than a black box.

AreaPolicy NameValue
BitlockerRequireDeviceEncryption1
DeviceLockMinDevicePasswordLength6
UpdateActiveHoursStart8
UpdateActiveHoursEnd18
ADMX_TPMClearTPMIfNotReady_Name_ProviderSetCFC160FB-...

Each subkey under current\device is a policy area; each value inside it is a policy name and its currently-applied value. Repeat the same read against current\user for user-scope policies, and against SOFTWARE\Policies\Microsoft to see anything landing via the classic Policies hive instead — including some ADMX-backed CSP policies and any surviving Group Policy values.

Manual cross-check before automating
  1. Run dsregcmd /status and confirm AzureAdJoined/DomainJoined and AzureAdPrt are the values you expect for this device's enrollment type
  2. Open PolicyManager\providers and confirm the provider entry matches your actual MDM authority — a stale or duplicate provider entry is a real, if uncommon, cause of policies silently not applying
  3. Check SOFTWARE\Microsoft\Enrollments for a stale enrollment ID left behind from a previous unenrollment, per Microsoft's own enrollment-diagnostics guidance
  4. Only after those three come back clean, compare individual policy values in current\device/current\user against what the admin center says was assigned
Don't stop at the portal: if the Intune admin center reports "Succeeded" but the behaviour on the device still doesn't match, treat that as inconclusive, not resolved. "Succeeded" is a statement about the last successful check-in report, not a live guarantee about the device's registry right now.

The fix — pull all six sources in one pass instead of six manual trips

  1. Run the companion script below directly on the affected device. It needs no admin rights beyond standard read access to HKEY_LOCAL_MACHINE, no internet connection, and no Graph or Intune console access at all.
  2. It produces one self-contained HTML report with all six sources laid out side by side, plus a plain-text summary and a timestamped log — genuinely useful evidence to attach to a support ticket or hand to a colleague, rather than six separate screenshots.
  3. Cross-reference the report's Applied Policies section (the SOFTWARE\Policies\Microsoft hive) against the MDM Device/User Policies sections. If the same setting appears in both with different values, or appears only in the Policies hive when you expected it to be MDM-delivered, that's a real conflict worth investigating with gpresult next — exactly the escalation path Microsoft's own troubleshooting guide recommends.
  4. Check the Device Join State section before assuming a policy delivery problem — if dsregcmd shows a broken PRT or unexpected join state, no policy will reliably deliver regardless of what's configured in Intune.
Tip: run this once on a known-healthy reference device first, and keep that report. Diffing a problem device's report against a healthy baseline from the same policy set is usually faster than reading either report cold.

Proof it worked — Export-LocalIntunePolicies.ps1

This script reads all six local sources described above and builds a single self-contained HTML report — dark header, sticky section nav, per-source badge counts — plus a plain-text summary and a timestamped log file. It performs registry reads and one call to dsregcmd.exe /status only. It makes no changes of any kind.

Download the script — GitHub

Export-LocalIntunePolicies.ps1 is free and open source. It's a genuinely read-only local check — no registry writes, no network calls, no tenant connection of any kind.

Export-LocalIntunePolicies.ps1 View full repo →
Example output below is a real run. These are genuine screenshots from a live Intune-enrolled device this script was tested against — not illustrative fictional output.
PowerShell — running the export
.\Export-LocalIntunePolicies.ps1 # === Starting local Intune policy export === # Output folder: C:\IntuneLocalExport\20260729_091832 # [OK] Device policies: 1372 values found # [OK] User policies: 214 values found # [OK] Provider info: 38 values found # [OK] Enrollment info: 46 values found # [OK] Applied policies: 22 values found # [OK] Device state: 1650 values found # === Export complete === # HTML report : C:\IntuneLocalExport\20260729_091832\LocalIntunePolicies_Report.html Opening report in browser...
The generated report — header and stats bar
Local Intune Policies — ESL-28437961
User: awan imranExported: 2026-07-29 09:18:32
6
Data Sources
1692
Total Values
AreaPolicy NameValue
AboveLockAllowToasts1
ADMX_RemovableStorageWPDDevices_DenyRead_Access_2_LastWrite1
ADMX_TPMClearTPMIfNotReady_Name_WinningProviderCFC160FB-1616-460F-9B6C-DCDB91DFEC83
ApplicationManagementAllowGameDVR1
AuditAccountLogon_AuditCredentialValidation_LastWrite1

Every value shown above is exactly what's in the report's MDM Device Policies section — the same 1,372-row table the script pulled straight from PolicyManager\current\device on a real device, with the section's nav link, badge count, and area/name/value columns all generated automatically by the script's own HTML builder.

Gotcha: a nonzero value count in a section doesn't mean every policy you expected is present — it means the registry key existed and had that many name/value pairs under it. A policy that failed to deploy at all simply won't appear anywhere in the report. Cross-reference against what the admin center says was assigned to spot a policy that's missing entirely, not just one with a wrong value.

References

Share this post
LinkedIn X / Twitter Reddit Bluesky

More from EndpointWeekly

Intune
Intune Enrollment Status Page (ESP) Configuration & Troubleshooting
The other half of "is this device actually enrolled the way I think it is."
Security
LAPS Rotation Compliance Audit
Another audit that reads local/tenant ground truth instead of trusting a portal status.
Security
Local Administrators Group Membership Drift Audit
Same pattern: a device-side script filling a gap no tenant-wide API covers.