如何通过API提取Azure AD中按上次修改日期筛选的用户
按上次修改日期提取Azure AD用户的实现方案
你不需要更换其他接口,你当前调用的/users端点本身就支持按修改时间筛选,之前只能拿到全量数据基本是没用到正确的查询参数和请求头,具体可落地的方案如下:
- 直接使用OData筛选参数按需拉取
针对单次按时间节点拉取的场景,直接在现有请求上追加高级筛选参数即可,注意必须携带指定请求头,否则筛选逻辑不生效:- 给请求添加头字段:
ConsistencyLevel: eventual - 在URL中追加
$count=true参数开启高级查询能力 - 用
$filter参数对lastModifiedDateTime属性做时间范围判断,时间值使用UTC时区的ISO 8601格式
示例请求(拉取2024年1月1日0点之后修改过的用户):
如果你要筛选的是从本地Active Directory同步到Azure AD的用户、需要按本地侧最后同步时间筛选,把筛选属性替换为GET https://graph.microsoft.com/v1.0/users?$count=true&$filter=lastModifiedDateTime ge 2024-01-01T00:00:00Z&$select=id,displayName,userPrincipalName,lastModifiedDateTime ConsistencyLevel: eventualonPremisesLastSyncDateTime即可,参数用法完全一致。 - 给请求添加头字段:
- 使用增量查询接口适配定期同步场景
如果你的业务是定时拉取变更用户(比如每天同步一次新增/修改的用户数据),更推荐用用户增量delta接口,不需要自己维护时间戳,接口会自动返回两次查询之间的所有变更(含新增、修改、删除的用户),不会出现时间偏差导致的漏数问题:
首次调用示例:
首次请求会按你选的字段返回全量用户,通过响应中的GET https://graph.microsoft.com/v1.0/users/delta?$select=id,displayName,userPrincipalName,lastModifiedDateTime ConsistencyLevel: eventual@odata.nextLink逐页拉完所有数据后,响应会携带@odata.deltaLink字段,你只需要把这个链接持久化存储,下次定时任务直接请求这个delta链接,就能拿到自上次拉取之后所有变更的用户数据。 - 常见注意事项
- 未携带
ConsistencyLevel: eventual头是最常见的踩坑点,这种情况接口会返回400错误,提示不支持对应属性的筛选,很容易让人误以为接口本身不支持时间筛选 - 单页返回结果上限为999条,数据量大的时候一定要跟随响应里的
@odata.nextLink逐页翻页,不要手动拼接$skip参数,数据量超过一定阈值后$skip会失效 - 传入筛选的时间必须是UTC时区,不要使用本地时区时间,否则会出现8小时(东八区)的筛选偏差
- 未携带
内容的提问来源于stack exchange,提问作者Sumesh
相关产品推荐
相关产品推荐

