HomeNewsletterCommunityMVP FeedToolsArchiveBlogToday's NewsAboutServicesQuick Links Subscribe free
← Back to Blog
Autopilot AutopilotDevice PreparationMicrosoft Entra IDIntuneMicrosoft GraphEnrollment Time GroupingSecurity Groups

Autopilot Device Preparation Needs an Assigned Group, Not a Dynamic One

IA
Imran Awan
21 August 2026

Windows Autopilot device preparation inverts a habit that most Intune teams have spent years building. Classic Autopilot rewards dynamic device groups driven by group tag or ZTDID. Device preparation refuses them, and it also requires a permission grant that almost nobody writes into their runbook. Miss it and the policy will not save the device group at all, with an error message that never names the cause.

The short version

The device group in an Autopilot device preparation policy must be an assigned security group. Microsoft states that device preparation "only uses assigned groups" and "doesn't use dynamic groups". On top of that, the service principal Intune Provisioning Client, with AppId f1346770-5b25-470b-88bd-d5744ab7952c, must be an owner of that group, or saving the policy fails with a message about the group not meeting the requirements. Verify both facts, plus the "Microsoft Entra roles can be assigned to the group" flag, before deployment day rather than during it.

The problem: the group you already have will not work

You have built Autopilot at scale before. Your muscle memory says the following. Create a dynamic device group. Write a membership rule against the ZTDID or the group tag. Assign your profile, your apps and your policies to that group. Let Microsoft Entra ID evaluate the rule after the device registers.

Device preparation breaks that pattern in two places at once.

The first break is the group type. The device preparation policy has a single Device group field. If you point it at one of your existing dynamic groups, the save fails. Microsoft documents the requirement in an Important block with no ambiguity. The device group specified in the Windows Autopilot device preparation policy needs to be an assigned security device group.

The second break is quieter and much more expensive. Even a perfectly correct assigned security group will be rejected unless a specific Microsoft first-party service principal has been added as an owner of that group. This is not a tenant-wide consent step you did once years ago. It is a per-group grant, on every group, that a human has to perform.

When the grant is missing, here is what the Intune admin center actually shows you. Microsoft documents two possible error strings on save.

Microsoft Intune admin center — Device preparation policy
There was a problem with the device security group for AP-DevicePrep-UserDriven. Check the group meets the requirements.
Failed to update security group device preparation setting: Updating security group for device preparation setting AP-DevicePrep-UserDriven failed. Something went wrong.
Device group0 groups assigned

Read those two messages again. Neither one contains the word "owner". Neither one names the service principal. The second one ends with "Something went wrong", which is the least actionable sentence in cloud management. The tell is the 0 groups assigned counter on the Device group row, which Microsoft explicitly calls out as an additional symptom of the same root cause.

Gotcha: the same error text appears whether the owner is missing, the group is dynamic, or the group is role-assignable. One message, three possible causes. That is why you verify all three properties rather than guessing which one bit you.

There is a worse variant of this failure. Suppose the policy did save, months ago, because somebody added the owner correctly at the time. Then a cleanup exercise removes service principal owners from groups, or somebody converts the group from static to dynamic to modernise it. Provisioning does not fail loudly. Microsoft documents the outcome under a known issue titled "Security group membership update failures might lead to non-compliant devices", and lists owner removal and static-to-dynamic conversion as two of the causes. Devices reach the desktop. Group membership never lands. Everything assigned to that group is silently absent.

intune.microsoft.comDevicesDevice onboarding › EnrollmentDevice preparation policies

Why it happens: Intune writes to the group, it does not read a rule

The reason becomes obvious once you look at the direction the data flows.

A dynamic group is a pull model. You write a rule. Microsoft Entra ID evaluates that rule against object attributes and computes the membership itself. Nothing outside Entra ID ever writes a member into the group. That is exactly why a dynamic group is convenient for classic Autopilot, where the device object already carries a ZTDID and a group tag by the time the rule runs.

Device preparation is a push model, and it pushes early. The whole point of the feature is that the device joins the group during enrollment rather than after it. Microsoft calls this enrollment time grouping, and describes the benefit as preknowledge of the security group that the device will become a member of after enrollment. That preknowledge is what lets Intune deliver apps and policy during the out-of-box experience, instead of trickling them in over the following hours.

Two consequences fall out of that design.

First, there is nothing to write a rule against. At the moment membership needs to exist, the device object is brand new. It has no group tag, no inventory properties, and no meaningful attributes for a membership rule to match. A dynamic group would compute an empty membership, then maybe fix it later, which defeats the entire purpose. Hence the documented statement that device preparation only uses assigned groups.

Second, something outside Entra ID now has to write group membership. In the Microsoft Entra permission model, the standard way to grant an identity rights over one specific group is to make it an owner of that group. Graph documents owners as the set of users or service principals who are allowed to modify the group object. Intune's writer identity for this operation is a first-party service principal, and that is the object you have to grant.

AttributeValueWhy it matters
Primary display nameIntune Provisioning ClientWhat you search for in the Add owners blade
Alternate display nameIntune Autopilot ConfidentialClientSome tenants show this instead; same object
AppIdf1346770-5b25-470b-88bd-d5744ab7952cThe only reliable identifier. Match on this, not the name
Role required on the groupOwnerNot a member, not a directory role. Owner of that specific group
Scope of the grantPer groupEvery device preparation device group needs its own grant
Context: this is the opposite of the classic Autopilot habit, and it is worth saying out loud to your team. In classic Autopilot you give Entra ID a rule and it fills the group. In device preparation you give Intune write access to an empty static group and it fills the group. Same visible outcome, completely different plumbing, completely different prerequisite.

Microsoft is careful about the naming here, and so should you be. The documentation says that in some tenants the service principal might have the name of Intune Autopilot ConfidentialClient instead of Intune Provisioning Client, and that as long as the AppID is f1346770-5b25-470b-88bd-d5744ab7952c it is the correct service principal. Do not build a script or a runbook check that matches on display name.

Gotcha: in some tenants the service principal does not exist at all. If neither name appears when you search the Add owners blade, the object is genuinely absent and has to be created before you can grant anything. Microsoft documents that path, and it needs the Application.ReadWrite.All scope plus an administrator who can consent on behalf of the organisation.

How to verify: three read-only checks before deployment day

There are exactly three group properties to confirm, plus one identity to confirm exists. Every one of them is readable with a GET request, so this belongs in your pre-deployment checklist rather than in your incident channel.

Start in the portal if you only have one or two groups. The group Overview blade shows Membership type, and the Owners blade shows the owner list.

intune.microsoft.comGroupsAll groups › your device groupOwners

For anything above a handful of groups, read it from Microsoft Graph. These are the calls that answer each question, with the least privileged delegated scope Microsoft documents for each one.

GET callWhat it answersLeast-privilege scope
/beta/deviceManagement/configurationPoliciesWhich policies exist with the enrollment technologyDeviceManagementConfiguration.Read.All
/v1.0/servicePrincipals(appId='...')Does the Intune Provisioning Client exist in this tenantApplication.Read.All
/v1.0/servicePrincipals(appId='...')/ownedObjectsWhich groups that service principal already ownsApplication.Read.All
/v1.0/groups/{id}groupTypes, securityEnabled and isAssignableToRoleGroup.Read.All
/beta/groups/{id}/ownersIs the service principal an owner of this groupGroupMember.Read.All

The ownedObjects call is the one worth knowing about, because it reads the same relationship from the other end. Instead of asking each group who owns it, you ask the service principal what it owns. One call, one answer, and the resulting list is precisely the set of groups in your tenant that can currently be used by device preparation.

https://graph.microsoft.com/v1.0/servicePrincipals(appId='f1346770-5b25-470b-88bd-d5744ab7952c')/ownedObjects
PowerShell — read-only Graph checks
Connect-MgGraph -Scopes 'Group.Read.All','GroupMember.Read.All','Application.Read.All' # All three are .Read.All. Nothing here can modify a group. $appId = 'f1346770-5b25-470b-88bd-d5744ab7952c' $sp = Invoke-MgGraphRequest -Method GET -Uri "https://graph.microsoft.com/v1.0/servicePrincipals(appId='$appId')" # Healthy: returns an object. A 404 here means the service principal is absent # from the tenant, and NO group can satisfy the owner prerequisite yet. $owned = Invoke-MgGraphRequest -Method GET -Uri "https://graph.microsoft.com/v1.0/servicePrincipals(appId='$appId')/ownedObjects" # Healthy: one entry per device preparation device group you have granted. # An empty value array, with device prep policies in place, is the smoking gun. $g = Invoke-MgGraphRequest -Method GET -Uri 'https://graph.microsoft.com/v1.0/groups/aaaaaaaa-0b0b-1c1c-2d2d-333333333333' # Healthy: groupTypes empty, securityEnabled True, isAssignableToRole False. # groupTypes containing DynamicMembership means the group is dynamic. Rebuild it.

The properties map cleanly onto what the portal shows you. Microsoft Graph documents that if the groupTypes collection includes DynamicMembership the group has dynamic membership, and otherwise membership is static. securityEnabled tells you it is a security group. isAssignableToRole is the Graph name for the "Microsoft Entra roles can be assigned to the group" toggle that the documented setup steps set to No.

Gotcha: read the owners from the beta endpoint, not v1.0. The v1.0 reference for List group owners carries an explicit note that service principals are currently not listed as group owners, because of the staged rollout of service principals to the v1.0 endpoint. Query v1.0 and a correctly configured group can come back with the service principal missing from the owner list. That is a false alarm that will send you chasing a problem you do not have.

There is one more read that costs nothing and catches drift after the fact. Intune ships a failures-only report for enrollment time grouping.

intune.microsoft.comDevicesMonitorEnrollment time grouping failures
Tip: put that report on a schedule. It shows only devices that failed to become members of their static device group, and Microsoft recommends monitoring it continuously, because a failed group join can cause configuration to change or be removed after enrollment. Reading it needs the Microsoft.Intune/ManagedDevices/Read permission, and recently updated data can take up to 20 minutes to appear.

One honest limitation is worth stating. Reading which group a given device preparation policy is bound to is done through the Graph action retrieveEnrollmentTimeDeviceMembershipTarget, which is an HTTP POST, not a GET. A strictly read-only audit therefore cannot follow that link. The practical workaround is the one above. Enumerate what the service principal owns, then check the policy's Device group field in the portal to confirm the names line up.

The fix: an assigned security group with the right owner

Here is the full documented creation path. Follow it exactly, because every field on this list is load bearing.

  1. Sign in to the Microsoft Intune admin center.
  2. Select Groups in the left hand pane.
  3. On Groups | All groups, make sure All groups is selected, then select New group.
  4. For Group type, select Security.
  5. For Group name, enter a name for the device group.
  6. For Group description, enter a description.
  7. For Microsoft Entra roles can be assigned to the group, select No.
  8. For Membership type, select Assigned.
  9. For Owners, select the No owners selected link.
  10. In the Add owners blade, search for and select the service principal Intune Provisioning Client with AppId f1346770-5b25-470b-88bd-d5744ab7952c. Accept Intune Autopilot ConfidentialClient if that is the name your tenant shows for the same AppId.
  11. Select Select, then select Create.
intune.microsoft.comGroups › All groupsNew groupOwners › Add owners

Do not add devices to the group by hand. Microsoft states that devices are automatically added to this device group during the deployment, that manually adding devices is not necessary, and that doing so has no impact on the process either way.

Context: there is no Group Policy path and no registry key for any of this. The prerequisite lives entirely in Microsoft Entra ID and the Intune service. Nothing is written to the client, so there is no CSP, no OMA-URI, no ADMX setting and no local registry value to inspect. Anybody who hands you a registry path for this is guessing. It also means there is no client-side Event ID catalog to trace, because the failure happens service side, in the policy save or in the group membership update. That is exactly why the enrollment time grouping failures report exists.

This is the prerequisite matrix in one place. Print it, or paste it into your build runbook.

Group settingRequired valueSymptom if wrong
Group typeSecurityPolicy will not accept the group
Membership typeAssigned (static)Documented as unsupported; device prep does not use dynamic groups
Entra roles can be assignedNoListed in the troubleshooting FAQ as a cause of devices not joining the group
OwnersIncludes AppId f1346770-5b25-470b-88bd-d5744ab7952cSave fails, Device group shows 0 groups assigned
MembersLeave emptyNone. Manual members are harmless but pointless
Reuse across policiesAllowed, but one group per policy is recommendedHarder to tell which policy owns which devices

The user group in the same policy plays by different rules, and mixing the two up is a common source of wasted hours.

AspectDevice groupUser group
Group typeSecuritySecurity
Membership typeAssigned onlyAssigned or dynamic, both supported
Service principal ownerRequiredNot required
Who populates itIntune, during enrollmentYou, or an Entra membership rule
What it controlsWhere apps, scripts and policy are targetedWhich users get the device preparation experience

If the service principal is missing from the tenant entirely, this is the documented way to create it. Run it as an administrator who can consent on behalf of the organisation.

Windows PowerShell — elevated, Entra administrator
Install-Module Microsoft.Graph.Authentication Install-Module Microsoft.Graph.Applications # Accept the NuGet and untrusted PSGallery prompts if they appear. Connect-MgGraph -Scopes "Application.ReadWrite.All" # Tick "Consent on behalf of your organization" in the consent window. New-MgServicePrincipal -AppID f1346770-5b25-470b-88bd-d5744ab7952c # 409 Request_MultipleObjectsWithSameKeyValue means it already existed. Good news. # 403 Authorization_RequestDenied means the scope or the consent was missing.

Two access requirements sit around all of this and are easy to overlook. To add the Intune first-party app as a security group owner you need to be a Microsoft Entra Group Administrator, or hold the microsoft.directory/groups/owners/update permission, or already be an owner of that group. Separately, the group must be configured as a scope group for the admin who will use it in the enrollment policy.

On the Intune side, the administrator who creates the policy needs a specific permission that is not in the default roles. Create the custom role like this.

  1. Sign in to the Microsoft Intune admin center.
  2. Select Tenant administration, then Roles.
  3. With All roles selected, choose Create, then Intune role.
  4. Name the role, for example Windows Autopilot device preparation administrator, and add a description.
  5. On the Permissions page set Device configurations to Read, Delete, Assign, Create and Update.
  6. Set Enrollment programs to Enrollment time device membership assignment.
  7. Set Managed apps to Read, Mobile apps to Read, and Organization to Read.
  8. Select Next through Scope tags, then Review + create.
  9. Assign the new role to whoever administers device preparation.
intune.microsoft.comTenant administrationRoles › All rolesCreate › Intune role

That "Enrollment time device membership assignment" permission is the one people forget. Without it, the troubleshooting FAQ lists a missing device group membership as one of the outcomes.

Watch out: once a device preparation policy is live, never remove the Intune Provisioning Client as an owner of its group, never convert the group from static to dynamic, and never delete the group. Microsoft documents all three as causes of security group membership update failures, and the known issue is explicit that if security groups are not properly configured, devices might lose compliance and be left in an unsecured state. This failure mode is silent at the device. Users reach the desktop, the group membership never lands, and everything targeted at that group is simply absent.
Tip: create a separate assigned device group for each device preparation policy, which is what Microsoft recommends, even though one group can technically serve several. A user-driven Entra join policy and a Windows 365 automatic mode policy should not share a group. When something goes wrong you want to know which policy owns which devices without cross-referencing anything.

Proof it worked: what a clean readiness audit looks like

The companion script for this post is read-only. It performs GET requests only, requests four .Read.All scopes, and refuses to report a clean result if any query fails. It lists device preparation policies, resolves the Intune Provisioning Client by AppId, enumerates the groups that service principal owns, then checks each candidate group against the documented prerequisites.

Get-DevicePrepGroupReadiness.ps1 — illustrative output, not a real tenant
== Intune Provisioning Client service principal ==================== Display name : Intune Provisioning Client AppId : f1346770-5b25-470b-88bd-d5744ab7952c Object id : aaaaaaaa-0b0b-1c1c-2d2d-333333333333 Enabled : True == Group prerequisite audit ======================================== [PASS] AP-DevicePrep-UserDriven membership : Assigned security group : True role assignable: False (documented value: False) owner granted : True (Intune Provisioning Client) [FAIL] AP-Devices-ByGroupTag membership : Dynamic owner granted : False WARN : membership rule present FAIL : membership type is Dynamic - device preparation does not use dynamic groups FAIL : Intune Provisioning Client is NOT an owner # The dynamic group is the classic Autopilot one, reused by mistake. # A dynamic group cannot be converted. Build a new assigned group instead. Groups audited : 2 Pass : 1 Fail : 1 Exit code 2 - at least one group fails the documented prerequisites.

The output above is illustrative. It is what the script prints, with fictional group names, not a capture from a live tenant.

Note the exit codes, because they matter if you wire this into a pipeline. Zero means every audited group meets the prerequisites. Two means the queries all succeeded and at least one group failed. One means something prevented the audit from completing, such as a missing scope or an absent service principal, in which case the script aborts rather than printing a reassuring zero-findings result.

Finally, the symptom-to-cause table. This is the lookup you want when someone pings you mid-deployment.

SymptomDocumented cause to check firstAction
"Check the group meets the requirements" on saveService principal is not an owner of the device groupAdd AppId f1346770-5b25-470b-88bd-d5744ab7952c as owner
Device group shows 0 groups assignedThe same owner grant is missingAdd the owner, then reselect the group
Device is not being added to the device groupOwner missing, wrong group selected, roles-assignable set to Yes, or the admin lacks Enrollment time device membership assignmentCheck all four, in that order
Cannot find Intune Provisioning Client in Add ownersDisplayed as Intune Autopilot ConfidentialClient, or absent from the tenantSearch by AppId; create the service principal if genuinely absent
Devices provisioned but non-compliant afterwardsOwner removed, group converted static to dynamic, or group deletedRestore the configuration, then add affected devices to the group by hand
Device preparation never launches during OOBEUser not in the policy's user group, or no device group selected at allA policy can be saved with no device group; confirm one is selected

None of this is exotic. It is one group property and one owner grant. But it is a prerequisite that lives in Entra ID rather than in Intune, it is invisible from the policy blade until the save fails, and the error text points nowhere useful. Check it on a Tuesday, not on the morning of a hardware refresh.

References

Community deep dive, fetched and confirmed on topic:

AuthorPostWhy it is worth reading
Rudy Ooms (call4cloud.nl)Autopilot Device Preparation and the Enrollment Time GroupingWalks the enrollment time group mechanism end to end, and is blunt about the owner requirement: configure the wrong owner and saving the profile errors out
PowerShell — companion script

Download it from Imran76Awan/Windows-Autopilot-Scripts — no sign-in required. It is read-only: it reports and never changes a device or anything in Intune. Validate it in your own environment before relying on the output.

Get-DevicePrepGroupReadiness.ps1 — Read-only readiness audit for the Microsoft Entra groups used by Windows Autopilot
View all scripts on GitHub
Was this post helpful?
React below — no account needed
Share this post
LinkedIn X / Twitter Reddit Bluesky

More from EndpointWeekly

Autopilot
The ZTDID: The One Attribute That Proves a Device Is Really…
A device enrols, reports compliant, and still never joins your all-Autopilot dynamic…
Autopilot
The Autopilot Conditional Access deadlock: requiring a compliant…
A brand-new Autopilot device cannot be compliant before it is enrolled, so a Conditional…
Autopilot
Enrollment Configuration Priority: Why Your Second ESP Profile…
Device configuration profiles merge. Device enrollment configurations do not. Exactly one…