如何在PowerShell中仅获取所有@ODATA.NEXTLINK,避免爬取数据?
仅获取Microsoft Graph用户分页的@odata.nextLink列表(PowerShell实现)
核心思路
要避免爬取用户数据、只收集分页链接,关键是让Graph API返回空数据集合的同时保留@odata.nextLink。通过设置$select=(空字段选择)和最大单页数量$top=999,可以最小化每次请求的数据量,快速遍历所有分页链接。
PowerShell代码实现
# 初始化存储nextLink的数组 $nextLinkList = @() # 初始请求地址:空$select返回空数据,$top设为Graph用户接口的最大单页量 $currentRequestUrl = "https://graph.microsoft.com/v1.0/users?`$top=999&`$select=" # 从已有的Graph上下文获取认证令牌(需先执行Connect-MgGraph完成认证) $authHeaders = @{ "Authorization" = "Bearer $((Get-MgContext).AccessToken)" } # 循环遍历所有分页链接 do { # 发送请求,仅获取空数据和nextLink $apiResponse = Invoke-RestMethod -Uri $currentRequestUrl -Headers $authHeaders -Method Get # 如果存在nextLink,加入列表并更新下一次请求地址 if ($apiResponse.'@odata.nextLink') { $nextLinkList += $apiResponse.'@odata.nextLink' $currentRequestUrl = $apiResponse.'@odata.nextLink' } # 没有nextLink则终止循环 else { $currentRequestUrl = $null } } while ($currentRequestUrl) # 输出所有收集到的nextLink $nextLinkList
关键细节说明
$select=:强制Graph API不返回任何用户字段,只返回空的value数组和分页链接,彻底避免爬取用户数据。$top=999:这是Microsoft Graph用户列表接口支持的最大单页数量,能减少分页次数,提升收集链接的效率。- 认证:代码依赖
Connect-MgGraph完成的上下文认证,如果你用其他方式获取令牌,替换$authHeaders中的令牌值即可。
批量请求的后续处理
收集完所有@odata.nextLink后,可按10-20个一组构造Graph批量请求:
- 提取每个nextLink中
https://graph.microsoft.com/v1.0之后的相对路径(比如/users?$skiptoken=xxx)。 - 构造批量请求JSON(示例):
{ "requests": [ {"id": "1", "method": "GET", "url": "/users?$skiptoken=..."}, {"id": "2", "method": "GET", "url": "/users?$skiptoken=..."}, // 最多添加20个请求 ] }
- 用
Invoke-RestMethod发送到https://graph.microsoft.com/v1.0/$batch接口,批量获取用户数据。
内容的提问来源于stack exchange,提问作者Olivier Ernest
相关产品推荐
相关产品推荐

