← Back to articles Intune

Diagnosing & Fixing Slow or Failed App/Script Installs During macOS ADE Enrollment in Intune

Diagnosing & Fixing Slow or Failed App/Script Installs During macOS ADE Enrollment in Intune

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.

Critical Assumption Error macOS ADE has no native Enrollment Status Page gate. There is no mechanism that blocks the user at the login screen until Required apps finish installing. Apps and scripts install silently in the background after Setup Assistant completes. If your build process depends on apps being present before first login, you need a Company Portal-driven or script-based blocking mechanism — Intune will not do this for you out of the box on macOS.

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.

PHASE 1 — SETUP ASSISTANT & CHECK-IN TRIGGER Setup Assistant ABM token → MDM enroll APNs Push 17.0.0.0/8 :443 / :5223 wake-and-checkin signal MDM Check-in mdmclient → manage.microsoft.com policy + app manifest pull Fallback ~8hr polling interval if APNs blocked firewall blocks APNs range → no push, silent multi-hour delay PHASE 2 — APP ASSIGNMENT EVALUATION (SCOPING DECISION) Required App / Script Assignment target? Device Group installs pre-login, no user needed ✓ ADE-safe User Group waits for identity bind at login ✗ stuck pre-auth PHASE 3 — SCRIPT EXECUTION & STATUS TELEMETRY Shell Script Queue serial, order not guaranteed Local Execution /Library/Intune/Scripts Graph Telemetry deviceRunStates (beta) dependency ordering bottleneck
Three-phase flow: APNs push triggers check-in (Phase 1), assignment scope decides pre-login eligibility (Phase 2), scripts execute serially and report back via Graph (Phase 3). Red paths mark the two most common failure points.

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."

Field Note Corporate SSL-inspecting proxies are the #1 cause I see in regulated enterprises (finance, healthcare). Apple push traffic cannot be decrypted or proxied — it must be allowed as a direct passthrough. If your network team put Macs behind the same forward proxy policy as Windows devices, APNs is broken and nobody will see an explicit error for it.

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).

BEFORE — USER GROUP ASSIGNMENT Setup Assistant No user context group not evaluable App: Pending waits for login + AAD sync AFTER — DEVICE GROUP ASSIGNMENT Setup Assistant Device Object exists at first check-in App: Installed pre-login, background silent
Before/after: apps assigned to Entra user groups cannot install pre-login because no user identity exists yet. Re-scoping to a device group (dynamic on serial number, OS type, or enrollment profile) makes them available at the very first check-in.

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.

Pattern That Works Build a single orchestrator shell script that handles sequencing internally (checks for prerequisite files/binaries with retry loops, installs Rosetta via 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

  1. 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).
  2. 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.
  3. 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.
  4. 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.
  5. 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).
  6. 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.

Beta Endpoint Notice 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

Was this article helpful?

🎯
MSEndpoint Academy

Évaluez vos compétences Microsoft 365 & Intune (MD-102)

100% Gratuit • 5 Min

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.

💡 Mini-Challenge Express Question 1 sur 10

Quel outil est obligatoire pour convertir une application Win32 (.exe) au format requis (.intunewin) pour son déploiement via Microsoft Intune ?

🔒 0€ Débité 📊 Scorecard instantanée 🤖 Explications IA
Passer le Test Diagnostic Complet (10 Questions)
🎁 Free Community Automation Hub

Functional Automation & Blueprints

Production-ready scripts, GitHub repositories, and architectural blueprints created for this technical guide.

PowerShell, Microsoft Graph API, PHP, Bash
AUTOMATION TOOLKIT

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.

Star on GitHub Download .ps1
💡 Enterprise Blueprint
HIGH IMPACT

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.

🤝 Custom Build

🎓 Ready to go deeper?

Practice real MD-102 exam questions, get AI feedback on your weak areas, and fast-track your Intune certification.

Start Free Practice → Book a Session
Souhaiel Morhag
Souhaiel Morhag
Microsoft Endpoint & Modern Workplace Engineer

Souhaiel Morhag is a Microsoft Intune and endpoint management specialist with hands-on experience deploying and securing enterprise environments across Microsoft 365. He founded MSEndpoint.com to share practical, real-world guides for IT admins navigating Microsoft technologies — and built the MSEndpoint Academy at app.msendpoint.com/academy, a dedicated learning platform for professionals preparing for the MD-102 (Microsoft 365 Endpoint Administrator) certification. Through in-depth articles and AI-powered practice exams, Souhaiel helps IT teams move faster and certify with confidence.

Related Articles

Popular on MSEndpoint