Two separate Intune features quietly attack the same complaint — "devices take too long after enrollment to actually be usable, and compliance status lags behind reality" — and neither has had a proper explainer on this site. Enrollment Time Grouping (ETG) puts a device into its target Entra security group during enrollment instead of after, so apps and policies are already waiting the moment it reaches the desktop. Client-driven compliance evaluation (new, still in preview) lets a Windows device notice its own BitLocker, firewall or Defender state change and ask for a compliance re-check immediately, instead of waiting for the next scheduled cycle.
Both are genuinely documented by Microsoft — this isn't speculative. ETG has existed since 2024 for Autopilot and has since grown to cover six platform categories; client-driven compliance evaluation shipped to preview in September 2026. This post explains both properly, with the real registry keys, the real Graph calls, and the real limitations.
If you've never heard of either of these, you're not behind — Microsoft's own documentation for both sits several clicks deep, and neither has had the kind of plain explanation that tells you what problem it actually solves. This post gives you both: enough concept that a helpdesk analyst could follow along, and enough depth (registry keys, log markers, Graph verification calls) that an engineer can confirm it's actually working.
Enrollment Time Grouping binds a device to a static Entra security group at the moment of enrollment, not after — so Intune already knows what to deliver the instant the device appears, instead of waiting up to 8 hours for the old group-after-enrollment model to catch up. It covers Windows Autopilot device preparation, Apple automated enrollment, and Android Enterprise. Client-driven compliance evaluation is a different, newer mechanism: a supported Windows device with an up-to-date Intune Management Extension (IME) watches 14 specific security signals locally — BitLocker, firewall, Secure Boot, Defender status and more — and triggers its own compliance check-in within about a minute of a real change, instead of waiting for the scheduled cycle. Both require specific setup (ETG needs a security group owned by a particular service principal; compliance evaluation needs Defender as the active antivirus and a current IME build), and both are verifiable with nothing more than a registry read and a Graph call.
Who needs to read this
| If you are… | What this means for you |
|---|---|
| Autopilot / enrollment engineer | ETG is the fix for "the new laptop sat there for hours before apps showed up" — and it needs one specific group-ownership step most admins never do. |
| Compliance / security admin | Client-driven compliance evaluation shrinks the gap between "user fixed the problem" and "Conditional Access notices" from hours to about a minute — but only for 14 specific signals, and only with Defender active. |
| Service desk / 1st line | Fewer "I fixed it but it still says non-compliant" tickets once this is live — know the Defender requirement so you can explain why a third-party AV device doesn't get the fast path. |
| Consultant / architect | Both are configuration you do once per enrollment profile or tenant-wide, not something you build. Worth a line in every new Autopilot and compliance rollout plan from here on. |
The problem: two kinds of lag that look unrelated but aren't
Here are two tickets that land on different desks but have the same root cause: Intune finding out about something later than it should.
Ticket one. A new starter's laptop finishes Autopilot, reaches the desktop, and the required line-of-business apps aren't there. Nothing failed — the apps just haven't arrived yet. The device shows as enrolled and healthy. Ask again in a few hours and everything is installed. The user's first morning on a new laptop was spent waiting.
Ticket two. A device fails a compliance check for a disabled firewall rule. The user (or an admin) re-enables it immediately. The device is now, in reality, compliant. But Conditional Access still blocks it, Intune still reports it as non-compliant, and nobody did anything wrong — the system just hasn't been told yet. The fix happened in real time; the system found out on its next scheduled check.
Why it happens: group-after-enrollment, and compliance-on-a-timer
ETG: why apps used to take up to 8 hours to show up
Without enrollment time grouping, Intune groups a device the ordinary way: by its inventory properties and group tag, after it has already enrolled. Only once the device is in the right group does Intune know which apps and policies belong to it. Microsoft's own documentation is direct about the consequence: devices grouped this way "often aren't ready for immediate use," and it "can take up to 8 hours post enrollment for devices to receive all apps and policies."
That 8-hour figure isn't a bug — it's a side effect of the ordering. Group membership, then targeting, then delivery, each with their own evaluation cycle. Enrollment Time Grouping collapses the first step by letting you tell Intune the group before the device even exists in your tenant, bound to the enrollment profile itself rather than discovered afterwards.
Client-driven compliance evaluation: why "I fixed it" doesn't mean "it's compliant" yet
The older compliance model is schedule-driven: the device checks in on a timer, Intune evaluates whatever it reported at that check-in, and the result stands until the next cycle. A user who fixes a problem between check-ins is, for all practical purposes, still non-compliant until the clock comes back round.
Client-driven compliance evaluation adds a second trigger that runs independently of the schedule. A small monitor inside the Intune Management Extension watches a defined list of security-relevant values on the device. The moment one of those values changes — BitLocker gets turned back on, a firewall rule is restored, a Defender signature updates — the monitor requests an MDM check-in right then, rather than waiting.
How to verify: a Graph call and a registry read, no guessing
ETG: confirm a policy is actually using it
An enrollment policy with ETG configured can be checked directly through Graph, without opening the admin center at all.
GET https://graph.microsoft.com/beta/deviceManagement/configurationPolicies('{PolicyID}')/retrieveJustInTimeConfiguration
# ---------------- what a configured policy returns ----------------
{
"targetGroupId": "11111111-2222-3333-4444-555555555555",
"targetGroupDisplayName": "Shared inventory devices",
"justInTimeConfigurationEnabled": true
}
# An unconfigured policy returns an empty or null targetGroupId instead.If you'd rather check the group side, confirm the Intune Provisioning Client is actually an owner — this is the single most common reason ETG silently fails, because the group looks correctly configured in every other respect.
GET https://graph.microsoft.com/v1.0/groups/{GroupID}/owners
# Look for an owner with appId f1346770-5b25-470b-88bd-d5744ab7952c
# displayName is usually "Intune Provisioning Client", occasionally
# "Intune Autopilot ConfidentialClient" on some tenants - same AppId,
# same thing. If neither appears in the owners list, ETG cannot write
# to this group and will fail silently.Client-driven compliance evaluation: read the monitor's own state
Everything the monitor is doing lives in the registry on the device itself, under the IME's own key. This is read-only — nothing below changes anything.
$base = 'HKLM:\SOFTWARE\Microsoft\IntuneManagementExtension'
$config = Get-ItemProperty -Path "$base\SessionSettings" -Name ComplianceMonitorConfigJson -ErrorAction SilentlyContinue
if (-not $config) {
Write-Host "No ComplianceMonitorConfigJson found - this device has not received the feature configuration."
}
else {
$json = $config.ComplianceMonitorConfigJson | ConvertFrom-Json
[pscustomobject]@{
Enabled = $json.Enabled
PollIntervalSecs = $json.PollIntervalSeconds
MaxChecksPerHour = $json.DciMaxCheckInsPerHourPerDevice
WatchedSettings = ($json.Settings -join ', ')
}
}
# ---------------- output on a device with the feature active ----------------
Enabled : True
PollIntervalSecs : 300
MaxChecksPerHour : 2
WatchedSettings : ActiveFirewallRequired, BitLockerEnabled, SecureBootEnabled, OsBuildVersionThe IME's own log confirms the monitor is actually running, not just configured. Search for these markers:
| Log marker | What it means |
|---|---|
[ComplianceMonitor] Start entered | The monitor has started on this device and is actively watching the configured signals. |
decision=Invoked | A watched value changed and the monitor triggered a real MDM check-in. |
decision=Simulated | Microsoft has the monitor and drift detection active but the final trigger is deliberately held in simulation mode — the value change is detected and logged, but no check-in actually fires. Treat this as "watching, not yet acting." |
decision=DeviceCapReachedDeferred | The device already used its hourly allowance of fast-path check-ins (default: 2) and this trigger is deferred to the normal schedule instead. |
decision=Simulated in the log does not mean the feature is broken on that device. Microsoft stages this rollout deliberately — a device can be fully configured, correctly detecting every change, and still not fire a real check-in yet because the tenant or device is in the simulation phase. Don't raise a support case on this log line alone.The fix: setting up both, step by step
Setting up Enrollment Time Grouping
- Sign in to the Microsoft Intune admin center.
- Go to Groups › All groups › New group.
- Set Group type to Security, give it a clear name, and set Membership type to Assigned — not Dynamic. ETG does not work with dynamic membership rules.
- Under Owners, add the service principal with AppId
f1346770-5b25-470b-88bd-d5744ab7952c. It usually appears as Intune Provisioning Client; search by that AppId if you see a different name or nothing at all. - Select Create. You don't need to add any devices or users to this group yet.
- Go to Devices › Device onboarding › Enrollment, and open (or create) the enrollment policy for your platform — Windows Autopilot device preparation, Apple automated device enrollment, or Android Enterprise.
- In the policy, add the security group you just created as its enrollment time group. You can add exactly one static group per policy.
- Save the policy. The setting applies to devices enrolling from this point forward only — it has no effect on devices already enrolled.
DELETE https://graph.microsoft.com/beta/deviceManagement/configurationPolicies('{policyId}')/clearEnrollmentTimeDeviceMembershipTarget.Checking whether client-driven compliance evaluation applies to you
This feature isn't something you switch on yourself yet — it's a Microsoft-controlled preview rollout to supported Windows devices. There's no admin center toggle to find. What you can do is confirm whether your devices qualify and are receiving it:
- Confirm Microsoft Defender is the active antivirus provider on the device. Any other antivirus, even a fully supported one, disqualifies the device from the fast path entirely.
- Confirm the Intune Management Extension is at version 1.103.101.0 or later — run the version check in the quick reference table below.
- Run the read-only registry check from the previous section to see whether the device has actually received a
ComplianceMonitorConfigJsonconfiguration yet. - Check the IME log for
[ComplianceMonitor] Start enteredto confirm the monitor is live, and watch fordecision=Invokedafter deliberately toggling a watched setting (for example, briefly disabling then re-enabling a firewall rule on a test device) to see the fast path actually fire.
decision=Invoked entry within about a minute. That one test tells you more than any amount of reading.Proof it worked: what success looks like for each
ETG: the device is in the group before it finishes setup
Check the security group's membership while the device is still mid-Autopilot — on the Please wait screen, before the user ever reaches the desktop. If ETG is working, the device already appears as a member at that point, not minutes or hours after.
Also worth checking the failure report, which exists specifically to catch the cases where this doesn't happen:
Client-driven compliance evaluation: a real-time fix clears in about a minute
On a pilot device with the monitor confirmed active, deliberately disable a watched setting, fix it, and time how long it takes to clear.
# Firewall rule disabled at 10:14:02, re-enabled at 10:14:40 [ComplianceMonitor] detected change: ActiveFirewallRequired False -> True [ComplianceMonitor] decision=Invoked, reason=SettingChanged, setting=ActiveFirewallRequired [ComplianceMonitor] MDM check-in requested # Compliance status in the Intune admin center updated to Compliant # at 10:15:31 - 89 seconds after the fix, not the next scheduled cycle.
Quick reference: every registry key, signal and requirement
Enrollment Time Grouping
| Item | Value |
|---|---|
| Supported enrollment methods | Windows Autopilot device preparation, Apple ADE (iOS/iPadOS, tvOS, visionOS, macOS), Android Enterprise (fully managed, corporate-owned work profile, dedicated) |
| Supported Windows platform | Windows 11 |
| Required group settings | Security group, Assigned membership (not Dynamic) |
| Required owner | Service principal AppId f1346770-5b25-470b-88bd-d5744ab7952c (Intune Provisioning Client / Intune Autopilot ConfidentialClient) |
| Groups per policy | One static group per enrollment policy |
| Verify a policy | GET .../configurationPolicies('{id}')/retrieveJustInTimeConfiguration |
| Remove ETG from an Apple ADE policy (workaround) | DELETE .../configurationPolicies('{id}')/clearEnrollmentTimeDeviceMembershipTarget |
| Failure reporting | Devices › Monitor › Enrollment time grouping failures (failures only, up to 20 min delay) |
| Not compatible with | The staging token (use the corporate-owned fully managed or corporate-owned work profile default token instead) |
| Without ETG | Up to 8 hours post-enrollment before all apps/policies arrive (Microsoft's own figure) |
Client-driven compliance evaluation
| Item | Value |
|---|---|
| Status | Preview, Windows devices only, rolling out from September 2026 |
| Antivirus requirement | Microsoft Defender must be the active provider |
| Minimum IME version | 1.103.101.0 |
| Default poll interval | 300 seconds (configurable 60–3,600) |
| Default rate cap | 2 fast-path check-ins per hour (configurable 0–10) |
| Detection window | ~60 seconds from change to detection, plus normal MDM round-trip |
| Key / value | Holds |
|---|---|
SessionSettings\ComplianceMonitorConfigJson | The full configuration pushed from the service — enabled state, poll interval, rate cap, and the list of watched settings |
ComplianceMonitor\Config | The monitor's own cached copy of that configuration |
ComplianceMonitor\Settings\<SettingName>\LastValue | The last known value for each watched signal, one subkey per setting, used to detect a change |
ComplianceMonitor\Config\RateWindow | WindowStartTicks and Count — the rolling hourly cap that throttles fast-path check-ins |
| Watched signal | Read from |
|---|---|
ActiveFirewallRequired | MDM Bridge WMI (root\cimv2\mdm\dmmap) |
BitLockerEnabled | |
SecureBootEnabled | |
DefenderEnabled, RtpEnabled, DefenderVersion, SignatureOutOfDate, AntivirusRequired, AntivirusRequireCurrentSignature, AntiSpywareRequired, AntiSpywareRequireCurrentSignature | Defender WMI providers |
CodeIntegrityEnabled | Win32_DeviceGuard |
TpmRequired | Win32_Tpm |
OsBuildVersion | Registry CurrentBuild and UBR, combined |
Glossary
| Term | What it means here |
|---|---|
| Enrollment Time Grouping (ETG) | Binding a device to a static Entra security group at the point of enrollment, rather than afterwards, so targeted apps and policies are already resolved when the device appears. |
| Intune Provisioning Client | The Microsoft first-party service principal (AppId f1346770-5b25-470b-88bd-d5744ab7952c) that actually writes the device into the ETG group during enrollment. Must be an owner of the group, or ETG fails silently. |
| Client-driven compliance evaluation | A Windows-only preview feature where the device itself detects a change in a watched security setting and requests an immediate compliance check-in, instead of waiting for the scheduled cycle. |
| Fast path | The immediate, event-triggered check-in client-driven compliance evaluation uses, as distinct from the normal scheduled compliance cycle. |
| Simulation mode | A staged rollout state where the monitor detects and logs a qualifying change but deliberately does not trigger a real check-in — visible in the log as decision=Simulated. |
Frequently asked questions
Do I need to buy anything extra for either of these?
No. Both are part of standard Intune licensing — there's no separate add-on. Client-driven compliance evaluation additionally requires Microsoft Defender as the active antivirus, which most Intune-managed Windows fleets already run.
Does ETG work with a dynamic device group?
No. The group must have Assigned membership. A dynamic group's membership is calculated by a rule engine after the fact, which is exactly the delay ETG exists to remove — Intune needs to write a device into the group directly and immediately, which only an assigned group allows.
My device is on Defender but I'm still not seeing fast compliance updates. Why?
Check three things in order: the IME version (must be 1.103.101.0 or later), whether ComplianceMonitorConfigJson exists yet under SessionSettings (the service may not have pushed it to this device yet), and the log for decision=Simulated entries, which mean the monitor is working but the tenant or device is still in the staged rollout and not yet triggering real check-ins.
Can a user spam compliance check-ins by toggling a setting repeatedly?
No — that's exactly what the rate cap is for. The default allows 2 fast-path check-ins per hour per device; anything beyond that falls back to the normal scheduled cycle until the hourly window resets, logged as decision=DeviceCapReachedDeferred.
Is there a Group Policy equivalent for either of these?
No. Both are cloud-side Intune/Entra mechanisms with no on-premises Group Policy or local CSP equivalent to configure directly — ETG is set on the enrollment policy in the Intune admin center, and client-driven compliance evaluation is a service-controlled rollout to the IME, not something you toggle via policy.
References
- Set up enrollment time grouping — Microsoft Learn. The primary source for ETG: requirements, the exact console steps, the Graph workaround for the Apple ADE removal gap, and the failure report.
- Windows Autopilot device preparation — create a device group — Microsoft Learn. The Windows-specific walkthrough this post's setup steps are based on, including the Intune Provisioning Client service principal detail.
- Device compliance policies in Microsoft Intune — Microsoft Learn. The umbrella documentation client-driven compliance evaluation sits under.
Microsoft MVP community deep-dives
| Author | Post | What it adds |
|---|---|---|
| Rudy Ooms (MVP) | Device Preparation: Enrollment Time Grouping | The service-side mechanics of when and how the device is actually written into the group during the Autopilot "please wait" screen, and the Graph call used to verify a policy's configuration in this post. |
| Peter van der Woude (MVP) | Understanding enrollment time grouping | The service principal naming variation between tenants (Intune Provisioning Client vs. Intune Autopilot ConfidentialClient) and current platform constraints. |
| Rudy Ooms (MVP) | Inside Intune Client-Driven Compliance Evaluation for Windows Devices | The full reverse-engineered mechanism this post's registry table and log markers are drawn from — every registry key, the JSON configuration shape, the rate-limiting logic, and the WMI sources behind each watched signal. |
Related reading on EndpointWeekly
- Autopilot Device Preparation Needs an Assigned Group, Not a Dynamic One — the deeper dive on the group-ownership gotcha referenced in this post's verification section.
- Intune 2609: Faster Win32 App Delivery — a different mechanism attacking a related but distinct problem: push-triggered IME check-ins after assignment, rather than group membership at enrollment time.