Skip to main content

VN-09 · macOS Endpoint & Intune Posture

Status: Delivered (macOS enrollment/posture + Intune read-only posture). Native mobile agents are out of scope by design. Roles needed: Tenant admin

What the client asked for

"macOS 13+ agent support is Phase 1. Mobile device posture is Phase 1 through Microsoft Intune / Endpoint Manager API rather than native mobile agents."

What this proves

A macOS endpoint can enroll and report posture just like other endpoints, and mobile/managed-device posture is pulled (read-only) from Microsoft Intune rather than by installing a mobile agent.

How it works (at a glance)

Validate via Swagger (Try it out)

Open /api/docs, click Authorize, paste a tenant-admin token. Use the request schema shown in Swagger for each body. (A portal form also exists under Settings → Intune posture.)

#ActionWhat you should see
1POST /api/v1/integrations/intune/connections (display name, tenant authority, client ID, secret reference)200; connection created with the secret reference redacted
2POST /api/v1/integrations/intune/connections/{connection_id}/syncA bounded sync runs (cannot loop unbounded on a cyclic/oversized Graph response)
3GET /api/v1/integrations/intune/devicesRead-only device posture, tenant-scoped
4GET /api/v1/integrations/intune/connectionsConnection listed; no device-control actions exist (read-only posture)

Contract & tests: /api/v1/integrations/intune/* in the OpenAPI deliverable; Intune connector tests. The macOS agent enrollment itself is a portal journey (VN-01). Native mobile agents and device-control actions are out of scope by design.

Where to look in the portal

  • Assets (for the macOS endpoint)
  • Settings then Intune posture
  • Audit

Validation walkthrough

Exact labels match the portal. The connection fields are your real Microsoft Entra/Intune values; substitute <azure-tenant-id> and <azure-app-client-id> with your tenant's actual identifiers.

#ActionWhat you should see
1Sign in as tenant admin. Open Assets.The enrolled macOS endpoint appears with platform macOS/darwin and an OS version.
2Open the macOS asset detail.macOS posture/inventory fields are populated from heartbeat.
3Open Settings and scroll to the Intune posture card.A Create Intune connection form is shown (tenant-admin only).
4Fill Connection display name = Contoso Intune, Tenant authority = https://login.microsoftonline.com/<azure-tenant-id>, Client ID = <azure-app-client-id>, Secret reference = opk://tenant/<your-tenant>/intune/client-secret, leave Enable sync checked. Click Create Intune connection.The form shows Intune connection created.; the connection appears in the list with its status and sync enabled, and the secret reference is redacted in the row.
5Review the connection row and any synced device posture.Posture data is read-only; provider secrets are redacted.
6Confirm there is no device-control action.No remote-wipe / push-config controls exist (read-only posture only).
7Sign in as an operator; open Settings → Intune posture.The Create Intune connection form is not shown; posture remains viewable.
8Open Audit.macOS enrollment and Intune connection/posture activity are recorded for your tenant.

Pass / fail checklist

  • A macOS 13+ endpoint enrolls and appears as a managed asset (platform = macOS/darwin)
  • Tenant admin creates an Intune connection from Settings → Intune posture → Create Intune connection and it appears with the secret reference redacted
  • Operators do not see the create form; posture is read-only
  • No device-control actions are exposed
  • macOS and Intune data are scoped to the owning tenant
  • Intune device sync is bounded (a cyclic/oversized Graph response cannot cause an unbounded fetch loop)

Intentionally not in Phase 1

  • Native mobile (iOS/Android) agents. Mobile posture is via the Intune API by design.
  • Device-control actions (remote wipe, push config). Phase 1 is read-only posture.

Evidence to capture

  • Screenshot of the macOS endpoint in Assets.
  • Screenshot of the Intune posture snapshot.