如何通过Logic Apps与Microsoft Graph API通知Entra ID闲置旧访问包所有者
实现方案:Logic Apps + Microsoft Graph API 清理闲置访问包
前置准备
- 配置权限:为Logic Apps的托管身份(或应用注册)添加以下Microsoft Graph应用权限:
EntitlementManagement.Read.All(读取访问包信息)GroupMember.Read.All(读取组成员)Mail.Send(发送邮件)
完成权限授予后确保权限已生效。
Logic Apps 具体流程
1. 定时触发工作流
使用Recurrence触发器,设置执行频率(例如每周1次),根据实际需求调整周期。
2. 获取所有访问包(处理分页)
由于访问包数量超过1000,必须处理Graph API的分页:
- 初始化一个数组变量
allAccessPackages,用于存储所有访问包数据。 - 初始化字符串变量
nextLink,默认值为空。 - 添加Do Until循环,终止条件设为
empty(variables('nextLink')):- 调用Microsoft Graph API动作,请求地址:
- 若
nextLink为空,使用GET https://graph.microsoft.com/v1.0/identityGovernance/entitlementManagement/accessPackages?$top=999 - 若
nextLink不为空,直接使用nextLink的值作为请求地址
- 若
- 将返回的
value数组合并到allAccessPackages变量中:union(variables('allAccessPackages'), body('Get_access_packages')?['value']) - 更新
nextLink变量为返回结果中的@odata.nextLink:body('Get_access_packages')?['@odata.nextLink']
- 调用Microsoft Graph API动作,请求地址:
3. 筛选创建时间超过180天的访问包
添加Filter Array动作,输入集合为variables('allAccessPackages'),筛选条件设为:
@less(item()?['createdDateTime'], addDays(utcNow(), -180, 'yyyy-MM-ddTHH:mm:ssZ'))
该表达式会保留所有创建时间早于180天前的访问包。
4. 逐个验证访问包的闲置条件
对筛选后的每个访问包,添加Apply to each循环:
4.1 检查是否有活动分配
调用Microsoft Graph API动作,请求地址:
GET https://graph.microsoft.com/v1.0/identityGovernance/entitlementManagement/accessPackages/{accessPackageId}/assignments?$filter=state eq 'Delivered'
其中{accessPackageId}替换为当前循环的访问包ID:items('Apply_to_each')?['id']
- 判断返回的
value数组长度是否为0:empty(body('Get_active_assignments')?['value']),如果不为0则跳过当前访问包。
4.2 检查范围组是否无成员
首先获取访问包的资源范围:从当前访问包的resourceScopes数组中,提取类型为Group的资源ID(即组ID)。
- 对每个组ID,调用Microsoft Graph API获取成员数量:
GET https://graph.microsoft.com/v1.0/groups/{groupId}/members/$count - 若所有关联组的成员数量都为0,则满足条件;只要有一个组有成员,就跳过当前访问包。
5. 收集访问包所有者信息
对符合闲置条件的访问包,调用Microsoft Graph API获取所有者:
GET https://graph.microsoft.com/v1.0/identityGovernance/entitlementManagement/accessPackages/{accessPackageId}/owners
提取所有者的mail字段,用于后续发送邮件。
6. 发送通知邮件
使用Office 365 Outlook连接器的**Send an email (V2)**动作,或直接调用Graph的Mail.Send API:
- 收件人:所有者邮箱
- 邮件主题:
闲置访问包清理通知 - 邮件内容:包含访问包名称、ID、创建时间等信息,示例内容:
您好,您作为所有者的访问包「{accessPackageName}」(ID: {accessPackageId})已创建超过180天,且无活动分配、关联范围组无成员,请及时处理。
关键注意事项
- 分页处理:必须通过
@odata.nextLink循环获取所有访问包,避免遗漏超过1000条的数据。 - 错误处理:为Graph API调用添加Configure run after设置,处理API调用失败的情况(例如重试3次)。
- 性能优化:可在筛选访问包时,先通过Graph API的
$filter提前过滤创建时间,减少后续处理的数据量:$filter=createdDateTime le {180天前的日期},但要注意日期格式需符合ISO 8601标准。
内容的提问来源于stack exchange,提问作者AskMe
相关产品推荐
相关产品推荐

