Entra ID Enumeration
Get current user Object ID
USER_ID=$(az rest --method GET \
--url "https://graph.microsoft.com/v1.0/users/$EMAIL" --query "id" -o tsv)
Get all Entra ID role assignments
ROLE_ASSIGNMENTS=$(az rest --method GET \
--url "https://graph.microsoft.com/v1.0/roleManagement/directory/roleAssignments")
az rest --method get --query "value[].{RoleID:roleDefinitionId, Scope:directoryScopeId}" -o table --url "https://graph.microsoft.com/v1.0/roleManagement/directory/roleAssignments?\$filter=principalId eq '$MY_OID'"
List only custom roles
az rest --method GET \
--uri "https://graph.microsoft.com/v1.0/roleManagement/directory/roleDefinitions" | jq '.value[] | select(.isBuiltIn == false)'
Filter assignments for current user
echo "$ROLE_ASSIGNMENTS" | jq -r --arg uid "$USER_ID" \
'.value[] | select(.principalId==$uid)'
Users Enumeration
Get users
az ad user list --output table
az ad user list --query "[].userPrincipalName"
Get info of 1 user
az ad user show --id "test@corp.onmicrosoft.com"
Search “admin” users
az ad user list --query "[].displayName" | findstr /i "admin"
az ad user list --query "[?contains(displayName,'admin')].displayName"
Search attributes containing the word “password”
az ad user list | findstr /i "password" | findstr /v "null,"
All users from Entra ID
az ad user list --query "[].{osi:onPremisesSecurityIdentifier,upn:userPrincipalName}[?osi==null]"
az ad user list --query "[?onPremisesSecurityIdentifier==null].displayName"
All users synced from on-prem
az ad user list --query "[].{osi:onPremisesSecurityIdentifier,upn:userPrincipalName}[?osi!=null]"
az ad user list --query "[?onPremisesSecurityIdentifier!=null].displayName"
Get groups where the user is a member
az ad user get-member-groups --id <email>
Get roles assigned to the user in Azure (NOT in Entra ID)
az role assignment list --include-inherited --include-groups --include-classic-administrators true --assignee <email>
Get ALL roles assigned in Azure in the current subscription (NOT in Entra ID)
az role assignment list --include-inherited --include-groups --include-classic-administrators true --all
Get EntraID roles assigned to a user
Get Token
export TOKEN=$(az account get-access-token --resource https://graph.microsoft.com/ --query accessToken -o tsv)
Get users
curl -X GET "https://graph.microsoft.com/v1.0/users" \
-H "Authorization: Bearer $TOKEN" \ -H "Content-Type: application/json" | jq
Get EntraID roles assigned to an user
curl -X GET "https://graph.microsoft.com/beta/rolemanagement/directory/transitiveRoleAssignments?\$count=true&\$filter=principalId%20eq%20'86b10631-ff01-4e73-a031-29e505565caa'" \
-H "Authorization: Bearer $TOKEN" \
-H "ConsistencyLevel: eventual" \
-H "Content-Type: application/json" | jq
Get role details
curl -X GET "https://graph.microsoft.com/beta/roleManagement/directory/roleDefinitions/cf1c38e5-3621-4004-a7cb-879624dced7c" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" | jq
Groups
Enumerate groups
az ad group list
az ad group list --query "[].[displayName]" -o table
Get info of 1 group
az ad group show --group <group>
Get “admin” groups
az ad group list --query "[].displayName" | findstr /i "admin"
az ad group list --query "[?contains(displayName,'admin')].displayName"
All groups from Entra ID
az ad group list --query "[].{osi:onPremisesSecurityIdentifier,displayName:displayName,description:description}[?osi==null]"
az ad group list --query "[?onPremisesSecurityIdentifier==null].displayName"
All groups synced from on-prem
az ad group list --query "[].{osi:onPremisesSecurityIdentifier,displayName:displayName,description:description}[?osi!=null]"
az ad group list --query "[?onPremisesSecurityIdentifier!=null].displayName"
Get members of group
az ad group member list --group <group> --query "[].userPrincipalName" -o table
Check if member of group
az ad group member check --group "VM Admins" --member-id <id>
Get which groups a group is member of
az ad group get-member-groups -g "VM Admins"
Get roles assigned to the group in Azure (NOT in Entra ID)
az role assignment list --include-groups --include-classic-administrators true --assignee <group-id>
Service Principals
Get Service Principals
az ad sp list --all
az ad sp list --all --query "[].[displayName,appId]" -o table
Get details of one SP
az ad sp show --id 00000000-0000-0000-0000-000000000000
Search SP by string
az ad sp list --all --query "[?contains(displayName,'app')].displayName"
Get owner of service principal
az ad sp owner list --id <id> --query "[].[displayName]" -o table
Get service principals owned by the current user
az ad sp list --show-mine
Get SPs with generated secret or certificate
az ad sp list --query '[?length(keyCredentials) > `0` || length(passwordCredentials) > `0`].[displayName, appId, keyCredentials, passwordCredentials]' -o json
Applications
List Apps
az ad app list
az ad app list --query "[].[displayName,appId]" -o table
Get info of 1 App
az ad app show --id 00000000-0000-0000-0000-000000000000
Search App by string
az ad app list --query "[?contains(displayName,'app')].displayName"
Get the owner of an application
az ad app owner list --id <id> --query "[].[displayName]" -o table
Get SPs owned by current user
az ad app list --show-mine
Get apps with generated secret or certificate
az ad app list --query '[?length(keyCredentials) > `0` || length(passwordCredentials) > `0`].[displayName, appId, keyCredentials, passwordCredentials]' -o json
Get Global Administrators (full access over apps)
az rest --method GET --url "https://graph.microsoft.com/v1.0/directoryRoles/1b2256f9-46c1-4fc2-a125-5b2f51bb43b7/members"
Get Application Administrators (full access over apps)
az rest --method GET --url "https://graph.microsoft.com/v1.0/directoryRoles/1e92c3b7-2363-4826-93a6-7f7a5b53e7f9/members"
Get Cloud Applications Administrators (full access over apps)
az rest --method GET --url "https://graph.microsoft.com/v1.0/directoryRoles/0d601d27-7b9c-476f-8134-8e7cd6744f02/members"
Get “API Permissions” of an App
Get the ResourceAppId
az ad app show --id "<app-id>" --query "requiredResourceAccess" --output json
[
{
"resourceAccess": [
{
"id": "e1fe6dd8-ba31-4d61-89e7-88639da4683d",
"type": "Scope"
},
{
"id": "d07a8cc0-3d51-4b77-b3b0-32704d1f69fa",
"type": "Role"
}
],
"resourceAppId": "00000003-0000-0000-c000-000000000000"
}
]
For the perms of type “Scope”
az ad sp show --id <ResourceAppId> --query "oauth2PermissionScopes[?id=='<id>'].value" -o tsv
az ad sp show --id "00000003-0000-0000-c000-000000000000" --query "oauth2PermissionScopes[?id=='e1fe6dd8-ba31-4d61-89e7-88639da4683d'].value" -o tsv
For the perms of type “Role”
az ad sp show --id <ResourceAppId> --query "appRoles[?id=='<id>'].value" -o tsv
az ad sp show --id 00000003-0000-0000-c000-000000000000 --query "appRoles[?id=='d07a8cc0-3d51-4b77-b3b0-32704d1f69fa'].value" -o tsv
Managed Identities
List all manged identities
az identity list --output table