I’ve granted my app registration Group.ReadAll and GroupMember.ReadAll permissions. However, without Directory.ReadAll, I’m only able to retrieve member IDs, not detailed information like displayName or UPN.
App Perm: https://i.imgur.com/ensbfCo.png
Could someone clarify or confirm if Directory.ReadAll is absolutely required for accessing this information?
from azure.identity import UsernamePasswordCredential
from msgraph.core import GraphClient
import json
# Azure AD App Registration and user details
# Only delegated type permission provided
# Enabled public client flows
client_id = 'xxxxxxxx-exx0-xx75-xxxx-9834a4xxxxxx'
username = '[email protected]'
password = 'password' # UserCredFlow
tenant_id = 'xxxxxx21-xxxx-xxxx-xxxx-8ed26bxxxxxx'
# Group details
group_name = "GroupName"
group_id = 'GroupID'
def get_group_members(client, group_id):
members = []
next_link = f'/groups/{group_id}/members?$select=id,displayName,userPrincipalName'
while next_link:
result = client.get(next_link)
if result.status_code == 200:
data = result.json()
members.extend(data.get('value', []))
next_link = data.get('@odata.nextLink')
else:
print(f"Error: {result.status_code}", result.text)
break
return members
try:
credential = UsernamePasswordCredential(client_id=client_id, username=username,
password=password, tenant_id=tenant_id)
client = GraphClient(credential=credential)
# Verify connection
me_result = client.get('/me')
if me_result.status_code == 200:
print("Successfully connected as:", me_result.json().get('userPrincipalName', 'Unknown User'))
else:
print(f"Failed to connect. Error: {me_result.status_code}", me_result.text)
exit(1)
# Get and print group members
print(f"nRetrieving members of group: {group_name}")
members = get_group_members(client, group_id)
print(f"nTotal number of members in the group: {len(members)}")
print("Group Members:")
for i, member in enumerate(members, 1):
print(f"nMember {i}:")
print(f"ID: {member.get('id', 'N/A')}")
print(f"Display Name: {member.get('displayName', 'N/A')}")
print(f"User Principal Name: {member.get('userPrincipalName', 'N/A')}")
# Print available fields for the first member
if members:
print("nAvailable fields for each member:")
print(", ".join(members[0].keys()))
except Exception as e:
print(f"An error occurred: {str(e)}")```
[1]: https://i.sstatic.net/Yj6g7FWx.png
3
To read the basic properties of a group’s members that are users, you need either the delegated permission User.ReadBasic.All
or User.Read.All
.
To read the basic properties of a group’s members that are groups, you need at least the Group.Read.All
permission.
In general, you need a permission to read a certain resource type.
https://learn.microsoft.com/en-us/graph/permissions-overview?tabs=http#limited-information-returned-for-inaccessible-member-objects