如何通过Microsoft Graph API获取同组织其他用户的Outlook日历事件?
解决获取其他用户Outlook日历事件的访问拒绝问题
核心原因
获取其他用户日历事件不能用获取自身事件时的委托权限,必须使用应用权限且完成管理员同意。委托权限仅允许访问当前登录用户的资源,应用权限则赋予应用本身访问组织内所有用户日历的权限(前提是配置对应权限并完成管理员同意)。
所需权限
在Azure AD应用注册中添加以下应用权限之一:
Calendars.Read:只读访问所有用户日历事件Calendars.ReadWrite:读写访问所有用户日历事件
添加后必须由全局管理员或Exchange管理员完成管理员同意,否则权限不会生效。
正确代码示例(客户端凭据流)
先安装必要的NuGet包:
Install-Package Microsoft.Graph Install-Package Microsoft.Identity.Client
使用客户端凭据流初始化GraphServiceClient并调用接口:
using Microsoft.Graph; using Microsoft.Identity.Client; using System.Collections.Generic; using System.Threading.Tasks; public async Task<List<Event>> FetchOtherUserCalendarEvents(string targetUserId) { // 应用注册配置信息 string clientId = "你的应用ID"; string tenantId = "你的租户ID"; string clientSecret = "你的客户端密钥"; // 初始化客户端凭据认证提供器 var confidentialClient = ConfidentialClientApplicationBuilder .Create(clientId) .WithTenantId(tenantId) .WithClientSecret(clientSecret) .Build(); var authProvider = new ClientCredentialProvider(confidentialClient); // 构建GraphServiceClient实例 var graphClient = new GraphServiceClient(authProvider); // 获取目标用户日历事件 var eventsResult = await graphClient.Users[targetUserId].Calendar.Events .Request() .Select("subject,body,bodyPreview,organizer,attendees,start,end,location") .GetAsync(); return eventsResult.ToList(); }
注意事项
targetUserId必须是目标用户的用户主体名称(UPN)或Azure AD对象ID,不能使用显示名称- 检查Azure AD应用注册的"API权限"页面,确认权限状态为"已授予"(管理员同意完成)
- 若仅需访问特定用户的日历,也可让用户手动共享日历给应用,但此方式不适合批量访问组织内用户的场景
内容的提问来源于stack exchange,提问作者Naligeshi Shruthi
相关产品推荐
相关产品推荐

