如何通过Graph API或PowerShell获取AAD企业应用的登录数据?
解决AAD应用登录记录查询与门户一致的问题
问题根源分析
你遇到的过滤无结果问题,大概率是混淆了应用注册的AppId和企业应用的ObjectId,或是查询时未覆盖正确时间范围、权限不足。Azure门户企业应用里显示的"应用ID"就是应用注册的AppId,但如果误把企业应用的对象ID当成AppId过滤,自然会返回空结果。另外,auditLogs/signins接口默认仅返回最近30天数据,若要查询X个月的记录,必须指定时间范围参数。
正确实现步骤
1. 确认所需权限
调用auditLogs/signins需要以下管理员同意的权限之一:
AuditLog.Read.AllDirectory.Read.All
2. 精准过滤与时间范围设置
使用Beta接口时,确保过滤条件用应用注册的AppId(而非企业应用的ObjectId),同时指定startDateTime和endDateTime覆盖目标时间范围。示例请求:
GET https://graph.microsoft.com/beta/auditLogs/signins?filter=appId eq '你的应用AppId' and createdDateTime ge 2024-01-01T00:00:00Z&$top=100
注:
$top默认最多返回100条数据,需获取更多时,通过@odata.nextLink分页遍历。
3. 匹配门户显示的登录记录
门户企业应用的登录记录,对应signins日志中appId匹配该应用的条目,需注意:
- 部分应用通过服务主体登录时,
signInIdentifier会显示服务主体名称,但appId仍对应应用注册的AppId - 多环境部署的应用,需确认AppId唯一对应目标应用
4. 批量筛选未使用应用的脚本逻辑
若要批量清理X个月无登录的应用,可按以下流程编写脚本:
- 调用
GET /applications获取所有应用注册的AppId列表 - 逐个AppId调用
signins接口,查询指定时间范围内的登录记录 - 收集无任何登录记录的AppId,执行后续清理操作
常见坑点规避
- 禁止用企业应用的ObjectId作为
appId过滤条件,必须使用应用注册页面的"应用程序(客户端)ID" - 查询超过30天的数据时,必须显式指定
startDateTime,否则接口仅返回最近30天结果 - 权限需覆盖全流程:仅
AuditLog.Read.All只能访问登录日志,读取应用注册信息还需Directory.Read.All
内容的提问来源于stack exchange,提问作者filip
相关产品推荐
相关产品推荐

