如何使用PowerShell/Graph API获取Office 365公共邮箱日历或事件?
解决Office 365公共文件夹日历获取问题
先处理Graph API的「Invalid version」错误
这个错误的核心原因是请求URL中的Graph API版本格式不正确。Graph API仅支持v1.0(正式版)和beta(预览版)两个版本标识,检查你的请求URL:
- 错误示例:
https://graph.microsoft.com/v2/publicFolders(不存在v2版本) - 正确示例:
https://graph.microsoft.com/v1.0/publicFolders或https://graph.microsoft.com/beta/publicFolders
获取Office 365公共文件夹日历的正确流程
1. 确认所需权限
放弃仅针对用户日历的Calendars.ReadBasic.All,改用公共文件夹专属权限:
- 委派权限:
PublicFolder.Read - 应用权限:
PublicFolder.Read.All
需在Azure AD应用注册中添加对应权限并完成管理员授权。
2. 获取公共文件夹列表
调用端点列出所有公共文件夹,筛选出日历类型的文件夹:
GET https://graph.microsoft.com/v1.0/publicFolders
返回结果中,找到folderClass值为IPF.Appointment的条目,其id就是公共日历文件夹的ID。
3. 获取日历中的事件
使用上一步得到的公共文件夹ID,调用端点获取事件:
GET https://graph.microsoft.com/v1.0/publicFolders/{publicFolderId}/calendar/events
可添加$select、$filter等查询参数,按需筛选返回字段或时间范围。
示例PowerShell脚本(替代原VBScript)
# 配置参数 $clientId = "你的Azure AD应用ID" $tenantId = "你的租户ID" $clientSecret = "你的应用密钥" # 获取访问令牌 $tokenBody = @{ Grant_Type = "client_credentials" Scope = "https://graph.microsoft.com/.default" Client_Id = $clientId Client_Secret = $clientSecret } $tokenResponse = Invoke-RestMethod -Uri "https://login.microsoftonline.com/$tenantId/oauth2/v2.0/token" -Method POST -Body $tokenBody $headers = @{Authorization = "Bearer $($tokenResponse.access_token)"} # 获取公共文件夹列表,筛选日历文件夹 $publicFolders = Invoke-RestMethod -Uri "https://graph.microsoft.com/v1.0/publicFolders" -Headers $headers -Method GET $calendarFolder = $publicFolders.value | Where-Object {$_.folderClass -eq "IPF.Appointment"} # 获取日历事件 if ($calendarFolder) { $events = Invoke-RestMethod -Uri "https://graph.microsoft.com/v1.0/publicFolders/$($calendarFolder.id)/calendar/events" -Headers $headers -Method GET $events.value | Select-Object subject, start, end, location } else { Write-Host "未找到公共文件夹中的日历" }
内容的提问来源于stack exchange,提问作者Kenneth Chow
相关产品推荐
相关产品推荐

