Skip to content
Microsoft IntuneDraft placeholder content

How to structure a new Microsoft Intune environment

Most Intune tenants do not become difficult to manage because of a single bad decision. They become difficult because dozens of small, undocumented decisions accumulate. This guide describes a structure I keep returning to when setting up a new tenant.

By Simon Hoque

Publication date
Not yet published
Estimated reading time
9 min read

Start with the group model

Almost every policy in Intune is delivered through a group assignment, so the group model is the real foundation. Decide early which groups are dynamic and which are assigned, and write the rule down next to the group name.

  • Device groups for platform, ownership, and deployment ring.
  • User groups for licensing, app entitlement, and Autopilot user-driven scenarios.
  • One exclusion group per policy family, created up front rather than during an incident.

A naming convention you can read at 2 a.m.

Names should say what the object is, what it targets, and which ring it belongs to. Avoid abbreviations that only make sense to the person who created the object.

ObjectPatternExample
Configuration profileWIN-CFG-<area>-<ring>WIN-CFG-BitLocker-Pilot
Compliance policyWIN-CMP-<area>-<ring>WIN-CMP-Baseline-Prod
Device groupGRP-DEV-WIN-<ring>GRP-DEV-WIN-Pilot
Exclusion groupGRP-EXC-<policy>GRP-EXC-BitLocker
Example naming pattern for policies and groups.

Deployment rings

Three rings are usually enough: a small pilot for the IT team, a broader early adopter ring, and production. The important part is that every assignment explicitly names its ring, so nothing lands everywhere by accident.

# Illustrative example - review before running in any tenantConnect-MgGraph -Scopes "DeviceManagementConfiguration.Read.All" $profiles = Get-MgDeviceManagementDeviceConfiguration -Allforeach ($p in $profiles) {    $assignments = Get-MgDeviceManagementDeviceConfigurationAssignment -DeviceConfigurationId $p.Id    [pscustomobject]@{        Name        = $p.DisplayName        Assignments = $assignments.Count    }}
Illustrative example: list configuration profiles and their assignment count.

Documentation that survives

A short README in a repository beats a long document nobody opens. Record the purpose of each policy family, who owns it, and the intended ring progression.

Screenshot placeholder — add your own tenant diagram here.

Found an error or have a better approach? Report it or suggest an improvement

TroubleshootingDraft placeholder

Troubleshooting Win32 app deployments

A repeatable order of investigation for Win32 apps that report failure, stay stuck at pending, or install without appearing installed.

Publication date
Not yet published
Estimated reading time
7 min read
Read article