If you run a macOS fleet through Automated Device Enrollment (ADE) at any real scale, you've seen this ticket: a MacBook comes out of Setup Assistant, the user logs in, and then… nothing. Required apps sit in "Pending" for two hours. Sometimes twelve. Sometimes the shell script that's supposed to rename the machine and join it to the right Entra group never runs at all. This is not a bug you patch — it's a symptom of four or five architectural decisions colliding, and almost every case I've triaged in production traces back to one of a small set of root causes: APNs reachability, assignment scoping against the wrong principal, or check-in interval mechanics that admins assume behave like Windows Autopilot ESP. They don't.
The Three-Phase Enrollment Reality
Every "slow install" incident on macOS ADE decomposes into three distinct phases, each with its own failure modes. Diagnosing the wrong phase is the single biggest time-waster in support escalations — engineers spend hours staring at app assignment blades when the actual problem is that the device never received an APNs wake signal in the first place.
Root Cause #1 — APNs Is the Single Point of Failure You're Not Watching
macOS doesn't use a persistent WNS-style channel the way Windows does. Every "go check in now" nudge from Intune to a Mac rides on Apple Push Notification service. If your egress firewall or proxy is doing TLS inspection or blocking the 17.0.0.0/8 range on ports 443, 2195, 2196, and 5223, the push simply never arrives. The device doesn't error — it just silently falls back to its default MDM check-in interval, which on macOS can be several hours. This is functionally indistinguishable from "app install is slow" to the end user, but it's actually "the device has no idea it has new work to do."
Root Cause #2 — Assignment Scoped to User Group Instead of Device Group
This is the most common misconfiguration, full stop. During Setup Assistant, there is no signed-in user context yet — Entra ID user-group membership cannot be evaluated until the user authenticates post-enrollment (or, in some ADE flows, until account-driven enrollment binds identity). If your Required app or platform script is assigned to a user group, it will not install during the pre-login window, and depending on your build sequence, it may not install for a long time afterward either, since group membership evaluation itself has propagation latency in Entra ID (typically under an hour, but combined with the next MDM check-in cycle it compounds).
Root Cause #3 — Serial Script Execution & No Native Dependency Chaining
Intune's macOS platform scripts and shell script policies do not have Win32-style detection rules, supersedence, or dependency graphs. They run in whatever order the client processes the assigned policy set, which is not guaranteed to match your intended sequence. If Script B assumes Script A already installed Rosetta or a helper binary, and B runs first, it fails — often silently, since exit codes aren't always surfaced clearly to the admin without explicit Graph queries.
softwareupdate --install-rosetta --agree-to-license before anything Intel-only, then chains subsequent actions) rather than relying on Intune to sequence multiple independent script policies. Treat every additional script assignment as an independent, unordered execution unit.
Diagnostic Walkthrough
- Check device-level app status. Intune admin center → Devices → All devices → filter OS macOS → select device → Managed apps. Look for install state Pending vs Failed vs Not applicable. "Not applicable" almost always means an assignment scope mismatch (wrong OS filter or wrong group type).
- Confirm assignment group type on the app itself. Apps → All apps → select app → Properties → Assignments → click into the Required group and verify in Entra ID whether it's a Security group with Device members or User members. This is the #1 five-minute check that resolves half of these tickets.
- Pull platform script run state. Devices → Scripts and remediations → Platform scripts → select script → Device status. Cross-reference "Last check-in" against "Script run time" — a large gap confirms an APNs/check-in delay, not a script execution failure.
- Validate the APNs certificate hasn't lapsed. Devices → Enrollment → Apple MDM Push certificate → check expiration. An expired cert doesn't cause slow installs — it causes total enrollment failure for every device attempting ADE that day. Rule it out immediately, then move to network-level checks.
- Validate egress reachability from the actual network segment the device enrolls on (VLAN matters — many orgs have a clean corporate VLAN but a locked-down "onboarding" VLAN for new devices that hasn't been updated with the same firewall exceptions).
- Correlate with local device logs if you have physical or remote-hands access:
sudo log stream --predicate 'subsystem == "com.apple.ManagedClient"' --info sudo log show --predicate 'subsystem == "com.apple.mdmclient"' --last 1h sudo profiles status -type enrollment
Graph API Reference Calls
Device-level app install status and shell script run-state reporting are exposed primarily on the beta Graph endpoint. There is no v1.0 equivalent for per-device granularity as of this writing — plan your automation accordingly and don't ship beta dependencies into change-controlled production runbooks without a documented exception.
deviceAppManagement/mobileApps/{id}/deviceStatuses and deviceManagement/deviceShellScripts/{id}/deviceRunStates are beta-only. Beta endpoints can change shape without a deprecation notice. Wrap all beta calls in try/catch and never assume schema stability across tenant
Évaluez vos compétences Microsoft 365 & Intune (MD-102)
Vous appliquez ce guide en production ? Testez votre niveau technique face aux questions réelles de l'examen Microsoft 365 Certified: Endpoint Administrator (MD-102). Découvrez vos points forts et vos faiblesses immédiatement.
Quel outil est obligatoire pour convertir une application Win32 (.exe) au format requis (.intunewin) pour son déploiement via Microsoft Intune ?
Functional Automation & Blueprints
Production-ready scripts, GitHub repositories, and architectural blueprints created for this technical guide.
macOS ADE Enrollment Diagnostics Toolkit - Intune App/Script Install Troubleshooter
A diagnostic toolkit and SaaS dashboard for identifying and resolving slow or failed app/script installs during macOS ADE enrollment in Intune, covering APNs reachability, assignment scoping, and script execution telemetry.
ADE Enrollment Watchtower
Gives MSPs and IT admins real-time visibility into stalled macOS ADE app/script installs so they catch failures before users file tickets.
🎓 Ready to go deeper?
Practice real MD-102 exam questions, get AI feedback on your weak areas, and fast-track your Intune certification.
Related Articles
Enterprise Microsoft Edge Governance in Intune: Eliminating SSL Warnings, Trusted Locations & Policy Conflicts
A definitive enterprise guide to configuring Microsoft Edge via Intune Settings Catalog, deploying corporate Root CAs, eliminating internal SSL warning bypass prompts, managing Trusted Sites, and resolving Edge Security Baseline policy conflicts.
IntuneCompany Portal Disappearing on Windows 24H2: Root Causes, AppX Re-registration & Intune Remediation
Diagnose and fix Company Portal disappearing after Windows 24H2 upgrades. Root causes include AppX de-provisioning, IME sync gaps, and Store for Business deprecation. Step-by-step remediation with PowerShell & Graph API.
IntuneMicrosoft Copilot Pages: Streamlined Access via Slash Commands & Library Tab—September 2026 Rollout
Starting September 2026, access existing Copilot Pages via the '/' menu in chat or the Library tab. 'Edit in Pages' now focuses on creation only. No admin controls required—change management guidance included.