如何在Microsoft Graph Explorer中获取用户可访问的Microsoft 365应用列表?
获取用户有权访问的Microsoft 365应用列表(类似myapps.com)
核心说明
Microsoft Graph没有直接返回用户可访问所有M365应用的单一端点,但可以通过以下两种方案实现类似myapps.com的展示效果:
方案1:通过应用角色分配关联服务主体(Service Principal)
此方案适用于获取被直接分配权限的M365应用,步骤如下:
步骤1:获取用户的应用角色分配
调用以下端点获取用户被分配的所有应用角色记录:
GET https://graph.microsoft.com/v1.0/me/appRoleAssignments
返回结果中,resourceId字段对应应用的服务主体(Service Principal)ID。
步骤2:批量获取对应的服务主体信息
使用上一步得到的resourceId,调用服务主体端点筛选出M365相关应用:
GET https://graph.microsoft.com/v1.0/servicePrincipals?$filter=id in ('{resourceId1}', '{resourceId2}') and tags/any(t: t eq 'Microsoft365')
通过tags筛选可以精准定位Microsoft 365官方应用,返回的displayName即为应用名称(如"Outlook", "Microsoft PowerPoint")。
权限要求
需要为应用或用户授予以下权限之一:
Directory.Read.All(应用权限)User.Read.All(委托权限)
示例代码(C# Graph SDK)
var graphClient = new GraphServiceClient(authProvider); // 获取用户的应用角色分配 var appRoleAssignments = await graphClient.Me.AppRoleAssignments.Request().GetAsync(); // 提取所有服务主体ID var resourceIds = appRoleAssignments.Select(a => a.ResourceId.ToString()).ToList(); // 获取对应的M365服务主体 var servicePrincipals = await graphClient.ServicePrincipals .Request() .Filter($"id in ({string.Join(",", resourceIds.Select(id => $"'{id}'"))}) and tags/any(t: t eq 'Microsoft365')") .Select(sp => new { sp.DisplayName, sp.AppId }) .GetAsync(); // 输出应用列表 foreach (var sp in servicePrincipals) { Console.WriteLine($"应用名称: {sp.DisplayName}, App ID: {sp.AppId}"); }
方案2:通过已分配的服务计划映射M365应用
此方案适用于获取用户通过许可证分配获得访问权限的M365应用,步骤如下:
调用端点获取已分配的服务计划
GET https://graph.microsoft.com/v1.0/me/assignedPlans
返回结果中的servicePlanName对应M365服务计划,可映射为对应的应用:
EXCHANGE_S_ENTERPRISE→ OutlookSHAREPOINTWAC→ Office Online(Word/PowerPoint/Excel)OFFICESUBSCRIPTION→ 桌面版Office套件TEAMS1→ Microsoft TeamsONEDRIVE_BASIC→ OneDrive
权限要求
仅需User.Read(委托权限)或User.Read.All(应用权限)即可访问。
示例代码(REST调用)
// 使用fetch API调用 async function getUserM365Apps() { const response = await fetch('https://graph.microsoft.com/v1.0/me/assignedPlans', { headers: { 'Authorization': 'Bearer ' + accessToken } }); const data = await response.json(); // 服务计划到应用名称的映射 const planToApp = { 'EXCHANGE_S_ENTERPRISE': 'Outlook', 'SHAREPOINTWAC': 'Office Online (Word/PowerPoint/Excel)', 'OFFICESUBSCRIPTION': '桌面版Office套件', 'TEAMS1': 'Microsoft Teams', 'ONEDRIVE_BASIC': 'OneDrive' }; // 提取并输出应用列表 const apps = data.value.map(plan => planToApp[plan.servicePlanName] || plan.servicePlanName); console.log('用户可访问的M365应用:', apps); }
注意事项
/me/applications端点仅返回用户拥有的应用(即用户创建的应用),并非用户有权访问的应用,这就是你之前未得到预期结果的原因。- 若要完全匹配myapps.com的内容,需要同时结合上述两种方案:直接分配的应用+许可证关联的应用。
内容的提问来源于stack exchange,提问作者khiar mohamed
相关产品推荐
相关产品推荐

