HomeNewsletterCommunityToolsArchiveBlogToday's NewsAboutServicesQuick Links Subscribe free
← Back to Blog
Entra ID Entra IDRBACPrivileged RolesPIMLeast PrivilegeMicrosoft GraphPowerShellIdentity Security

Find Every Privileged Role, Permission & Assignment in Entra ID

IA
Imran Awan
21 July 2026

Quick question: how many of your Entra role assignments can quietly turn into a Global Administrator? If you can't answer that in under a minute, you're not alone — and Microsoft has just shipped the tool that finally answers it. There's a new PRIVILEGED label (in preview) on Entra roles, permissions, and assignments, backed by a machine-readable isPrivileged property. This post explains exactly what it means, how to find every privileged object in your tenant with PowerShell and Graph, and how to bring the numbers back under control.

Preview status: The PRIVILEGED label and the isPrivileged property are currently in preview. The property lives in the Microsoft Graph beta endpoint only — it is not in v1.0 yet. Behaviour and the exact set of flagged roles can change before general availability.

The problem: privilege sprawl you can't measure

Let's start with what you're actually seeing. You open Roles and administrators in the Entra admin center and there are 100+ built-in roles. Some are obviously dangerous (Global Administrator). Some sound harmless (Helpdesk Administrator). Over the years, people were granted roles for a project, a migration, a "just make it work" moment — and those assignments never got cleaned up.

The hard part has never been listing roles. It's answering the security question underneath: which of these can be used to escalate privilege? A role that can reset another admin's password. A role that can add credentials to an application. A role that can rewrite Conditional Access policy. Those are the ones an attacker wants — and until now there was no authoritative flag that said "this one is dangerous."

That's the gap the PRIVILEGED label fills. Microsoft has gone through every built-in role and every permission and marked the ones that can lead to elevation of privilege. Your job is to find them, count them, and cut the list down.

What "privileged" actually means

Before you go hunting, you need to know precisely what you're hunting for. Microsoft defines a privileged permission as one that can do any of the following:

Anything that can do one of those can be abused to gain more access than it was meant to. Here is the terminology Microsoft uses, because the rest of this post depends on it:

TermWhat it means
actionA single activity a security principal can perform on an object type (sometimes called an operation).
permissionA definition of the activity a principal can perform. One permission contains one or more actions.
privileged permissionA permission that can delegate management, modify credentials, change auth policy, or access restricted data.
privileged roleA built-in or custom role that contains one or more privileged permissions.
privileged role assignmentA role assignment that uses a privileged role. This is the object you actually audit.
elevation of privilegeWhen a principal gets more permissions than their role gave them — usually by acting on a higher-privileged principal.

How to read a permission string

Every Entra permission follows a REST-like schema. Once you can read it, the whole model clicks into place:

Permission schema
<namespace>/<entity>/<propertySet>/<action> microsoft.directory/applications/credentials/update # namespace = the product (microsoft.directory = Entra ID) # entity = the object type (applications) # propertySet = which properties (credentials) # action = what you can do (update)

The propertySet is where the privilege usually hides. Watch for these three keywords:

KeywordMeaning
allPropertiesEvery property of the entity, including privileged ones. This is the one to be suspicious of.
standardCommon properties for read, excluding privileged ones (e.g. read a user's public phone number but not their MFA secondary number).
basicCommon properties for update, excluding privileged ones. Read and update sets differ, which is why there are two words.

The special allTasks action keyword means create + read + update + delete, and allEntities means every entity in the namespace. So microsoft.directory/allEntities/allProperties/allTasks is, roughly, "do anything to anything" — that's the Global Administrator permission in a nutshell.

Note — privileged permission ≠ protected action. These two features look similar but do different jobs. A privileged permission simply identifies a permission that should be used carefully (the PRIVILEGED label). A protected action attaches a Conditional Access policy — such as requiring MFA — that is enforced when the action runs. Use the label to find risk; use protected actions to add a control on top of it.

How to verify: find every privileged object in your tenant

There are three ways to surface privileged objects. Start with whichever fits your workflow — but the PowerShell and Graph methods are the ones you can automate and schedule.

Method 1 — the admin center (eyeball check)

Sign in to the Entra admin center as someone who holds a privileged role (a plain user can't see the labels), then follow this path:

Entra admin centerRoles & adminsRoles & administratorsPrivileged filter

On the Roles and administrators page you'll see a Privileged column and an Assignments column. Filter on Privileged = Yes and sort by assignment count. Here is what that view looks like:

Entra admin center Roles and administrators page showing the Privileged and Assignments columns, with a warning that there are 12 privileged role assignments and the recommendation not to exceed 10
Roles and administrators — filtered to Privileged. Notice the banner: "There are currently 12 privileged role assignments. It is recommended to not exceed 10." That warning is generated automatically once your tenant crosses the limit. Source: Microsoft Learn.

Click into any privileged role and you can see exactly which of its permissions carry the label — this is the same "Application Administrator" role referenced earlier in this post:

Application Administrator role Description page in the Entra admin center showing the PRIVILEGED badge next to the role name and per-permission PRIVILEGED tags on individual role permissions
Application Administrator role detail. The role itself is tagged PRIVILEGED, and only some of its individual permissions are — here, customAuthenticationExtensions/allProperties/allTasks and oAuth2PermissionGrants/allProperties/allTasks are flagged, while deleting/restoring applications is not. Source: Microsoft Learn.

The same label appears when you build a custom role — useful for checking your own custom roles before you assign them:

New custom role creation wizard in the Entra admin center, Review and create step, showing a Privileged column that marks which selected permissions are privileged
Creating a custom role named "Application Credentials Administrator." Two of the four selected permissions — updating application credentials and service principal credentials — are marked PRIVILEGED. If you're building custom roles, check this column before you ship it. Source: Microsoft Learn.

This is fine for a quick look, but you can't diff it week over week, and you can't feed it into a report. For that, drop to the command line.

Method 2 — Microsoft Graph PowerShell (the one you'll automate)

The isPrivileged property is exposed on three things: role definitions, resource actions (permissions), and (by expansion) role assignments. First, connect. Least privilege for this audit is RoleManagement.Read.Directory — you do not need Global Reader or Directory.Read.All just to run it:

Windows PowerShell — connect
Connect-MgGraph -Scopes 'RoleManagement.Read.Directory' -NoWelcome

Now list every privileged role. The filter does the work server-side — you only get roles where the flag is true:

List privileged roles
Get-MgBetaRoleManagementDirectoryRoleDefinition -Filter "isPrivileged eq true" | Format-List DisplayName, IsPrivileged

Here's what good output looks like. Every row you get back is a role that can escalate privilege if misused:

Output
DisplayName : Application Administrator IsPrivileged : True DisplayName : Helpdesk Administrator IsPrivileged : True DisplayName : Conditional Access Administrator IsPrivileged : True ...

Next, the privileged permissions in the microsoft.directory namespace. This tells you why a role is dangerous — the specific actions that carry the flag:

List privileged permissions
Get-MgBetaRoleManagementDirectoryResourceNamespaceResourceAction ` -UnifiedRbacResourceNamespaceId "microsoft.directory" ` -Filter "isPrivileged eq true" | Format-List Name, Description
Output (excerpt)
Name : microsoft.directory/applications/credentials/update Description : Update application credentials Name : microsoft.directory/authorizationPolicy/allProperties/allTasks Description : Manage all aspects of authorization policy

Finally — and this is the report that matters most — the privileged assignments. Who actually holds a privileged role right now? Note the -ExpandProperty; the filter reaches into the expanded role definition:

List privileged assignments
Get-MgBetaRoleManagementDirectoryRoleAssignment ` -ExpandProperty "roleDefinition" ` -Filter "roleDefinition/isPrivileged eq true" | Format-List PrincipalId, RoleDefinitionId
Tip — don't type these three queries by hand every time. The audit script below runs all three, resolves each PrincipalId to a real user/group/service-principal name, and warns you if you exceed Microsoft's recommended limits. Run it read-only, export to CSV, and diff it week over week.

Method 3 — Microsoft Graph API (raw)

If you're scripting outside PowerShell, hit the beta endpoint directly. Same filter, same result:

HTTP — Graph beta
GET https://graph.microsoft.com/beta/roleManagement/directory/roleDefinitions?$filter=isPrivileged eq true GET https://graph.microsoft.com/beta/roleManagement/directory/resourceNamespaces/microsoft.directory/resourceActions?$filter=isPrivileged eq true GET https://graph.microsoft.com/beta/roleManagement/directory/roleAssignments?$expand=roleDefinition&$filter=roleDefinition/isPrivileged eq true

Why this matters: the elevation-of-privilege chains

Here's the part most admins miss. A role doesn't have to be Global Administrator to become one. The classic escalation path is password reset: if role A can reset the password of an account that holds role B, then role A effectively controls role B. Microsoft publishes exactly who can reset whom. This is the mechanism the PRIVILEGED label is warning you about.

Read this table as: the column role can reset the password of the row role. For example, a Helpdesk Administrator can reset a Directory Reader — but not another admin outside its allowed list.

Password can be reset for →Password AdminHelpdesk AdminAuth AdminUser AdminPriv. Auth AdminGlobal Admin
User (no admin role)
Helpdesk Admin
Auth Admin
User Admin
Global Admin✅*
All other built-in / custom roles

Two things jump out. First, only Privileged Authentication Administrator and Global Administrator can reset any admin, including each other. Second, resetting a password is not the only sensitive action — the same roles can also disable/enable accounts, change the userPrincipalName, change the onPremisesImmutableId, and update the phone/email fields used for self-service password reset. Change someone's SSPR phone number and you can then reset their password. That's the chain.

Watch out — deprecated Partner roles can reset a Global Administrator. The Partner Tier2 Support role can reset passwords and invalidate refresh tokens for all users, including Global Administrators. Partner Tier1 Support can do it for all non-admins. Both are deprecated and should not be assigned to anyone. Run the audit and if either shows up in your assignments, remove it — it's a full escalation path hiding behind an innocuous name.

The fix: bring the numbers down

Finding privileged objects is step one. Reducing them is the actual win. Work through these in order.

  1. Run the audit and export it. Use the script below with -ExportCsv. You now have a dated baseline of every privileged role, permission, and assignment.
  2. Apply least privilege. For each privileged assignment, ask "does this person still need this, at this scope?" Replace broad roles with narrower ones (e.g. a Helpdesk Administrator instead of a User Administrator where possible). Remove anything left over from a finished project.
  3. Move standing access to just-in-time. Convert permanent (active) privileged assignments to eligible assignments in Privileged Identity Management (PIM) so admins activate the role only when they need it, with approval and time limits.
  4. Require phishing-resistant MFA on every admin. A privileged role behind SMS is a privileged role behind a SIM swap. Enforce it with Conditional Access.
  5. Turn on recurring access reviews. Have role owners re-attest privileged assignments on a schedule so access decays instead of accumulating.
  6. Respect the limits. Microsoft recommends fewer than 5 Global Administrators and fewer than 10 privileged role assignments in total. The audit script flags you in red when you're over.
  7. Isolate control-plane intermediaries. Anything that can broker privileged access — PAM tools, jump hosts, automation runbooks, service principals holding privileged roles — is a Tier 0 control-plane asset. Administer it only from equally trusted systems, per the Enterprise access model. If a lower-tier box can manage a Tier 0 asset, that's your escalation path.
Gotcha — there is no CSP or Group Policy for this. Privileged roles are cloud directory RBAC, not device policy. You cannot deploy, restrict, or audit them through an Intune configuration profile, an OMA-URI, or a Group Policy Object. Everything here is done in Entra ID (portal, PIM, Graph). Don't go looking for a Settings Catalog toggle — it doesn't exist.

Proof it worked

After you've cut assignments and moved the rest into PIM, re-run the audit. Success looks like this — counts under the recommended limits and both checks green:

Get-EntraPrivilegedRoleAudit.ps1 — after cleanup
[1/3] Fetching privileged role definitions... 38 privileged role(s) found. [2/3] Fetching privileged permissions (microsoft.directory)... 141 privileged permission(s) found. [3/3] Fetching privileged role assignments... 8 privileged role assignment(s) found. Global Administrator assignments: 3 OK (recommended < 5) Total privileged assignments: 8 OK (recommended < 10) Audit complete.

The number of privileged roles and permissions won't change much — those are defined by Microsoft. The number that must come down is assignments. If your "before" run showed 4 Global Admins and 23 privileged assignments, and your "after" run shows 3 and 8, that's the proof. Save both CSVs; the diff is your evidence for the next access review.

Key takeaway: The PRIVILEGED label turns a fuzzy security question — "which of these is dangerous?" — into a filterable, scriptable fact. Baseline it today, move standing access into PIM, and re-run the audit on a schedule. The goal isn't zero privileged roles (impossible); it's the smallest possible number of privileged assignments, each one justified.

Privileged permission vs protected action — at a glance

CapabilityPrivileged permission (the label)Protected action
Identifies permissions that should be used carefully
Enforces extra security (e.g. MFA) when the action runs
Current statusPreviewPreview

Official references

PowerShell Scripts — Entra Privileged Roles Audit

Read-only Graph scripts for this post are in Windows-Patching-Scripts.

Get-EntraPrivilegedRoleAudit.ps1 — lists all privileged roles, permissions & assignments; flags over-limit counts
Get-EntraRolePermissionDetail.ps1 — shows one role's permissions and marks the privileged ones
View all scripts on GitHub
Share this post
LinkedIn X / Twitter Reddit Bluesky

More from EndpointWeekly

Entra ID
How Many of Your Global Admins Are PERMANENTLY Global Admins?…
Standing privileged access is the top finding in every security review — and turning on…
Entra ID
Do You Know Which Users Have ZERO Conditional Access Policy…
Conditional Access targets groups and apps, not "all users" by default. Gaps open…
Entra ID
Passkeys Are Now the Default in Entra ID: What You Need to Do…
Microsoft is ending SMS and voice MFA by 1 February 2027 and making passkeys the default…