You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在PowerShell中为identityRiskEvents Graph API使用createdDateTime筛选器

我来帮你搞定这个Graph API分页的问题!你遇到的skip=5100失败是因为Graph API的beta版本对$skip参数有默认上限(通常是5000条),超过这个值就会触发报错。改用按时间范围分段拉取是最靠谱的解决方案,下面我给你详细说怎么做:

一、设计筛选查询的思路

首先,我们可以利用createdDateTime属性将数据拆分成多个时间区间(比如每周/每3天),这样每个区间内的数据量不会超过分页上限,就能顺利拉取所有数据。当然你也可以结合文档里的其他属性(比如riskLevel、riskType)来缩小范围,但时间分段是解决skip上限问题的核心。

举几个实用的筛选示例:

  • 拉取近7天的事件:$filter=createdDateTime ge 2024-01-01T00:00:00Z and createdDateTime lt 2024-01-08T00:00:00Z
  • 拉取高风险等级的事件:$filter=riskLevel eq 'high'
  • 结合时间和风险类型:$filter=createdDateTime ge 2024-01-01T00:00:00Z and riskType eq 'unfamiliarFeatures'

注意:时间格式必须是ISO 8601(比如yyyy-MM-ddTHH:mm:ssZ),否则Graph API会直接报错。

二、PowerShell中用Invoke-WebRequest实现的完整代码

我会用MSAL.PS模块来获取访问令牌(比手动请求令牌端点更简单可靠),然后循环按时间区间拉取所有事件ID:

第一步:安装依赖模块(如果没装过)

Install-Module -Name MSAL.PS -Force -AllowClobber

第二步:完整脚本

# 配置你的Azure AD应用信息
$clientId = "你的应用程序ID"
$tenantId = "你的租户ID"
$scope = "https://graph.microsoft.com/.default"

# 获取Graph API访问令牌(交互式登录,适合测试;生产环境可以用证书/客户端密钥)
$token = Get-MsalToken -ClientId $clientId -TenantId $tenantId -Scope $scope -Interactive

# 初始化变量:存储所有事件ID的数组,以及起始/结束时间
$allEventIds = @()
$timeIntervalDays = 7  # 每次拉取7天的数据,可根据你的数据量调整
$startDate = (Get-Date).AddMonths(-3)  # 从3个月前开始拉取,按需修改
$today = Get-Date

# 循环处理每个时间区间
while ($startDate -lt $today) {
    # 计算当前区间的结束时间
    $endDate = $startDate.AddDays($timeIntervalDays)
    if ($endDate -gt $today) {
        $endDate = $today
    }

    # 格式化时间为Graph API要求的ISO 8601格式
    $startStr = $startDate.ToString("yyyy-MM-ddTHH:mm:ssZ")
    $endStr = $endDate.ToString("yyyy-MM-ddTHH:mm:ssZ")

    # 构建请求URL:只拉取id字段+按时间筛选
    $requestUrl = "https://graph.microsoft.com/beta/identityRiskEvents?`$filter=createdDateTime ge $startStr and createdDateTime lt $endStr&`$select=id"

    # 循环处理当前时间区间的所有分页数据
    do {
        try {
            $response = Invoke-WebRequest -Uri $requestUrl -Headers @{Authorization = "Bearer $($token.AccessToken)"} -Method Get -ContentType "application/json"
            $responseData = $response.Content | ConvertFrom-Json

            # 将当前页的事件ID添加到数组
            if ($responseData.value) {
                $allEventIds += $responseData.value.id
                Write-Host "已拉取 $($responseData.value.Count) 条事件ID,当前累计: $($allEventIds.Count)"
            }

            # 更新URL为下一页的链接
            $requestUrl = $responseData.'@odata.nextLink'
        }
        catch {
            Write-Error "请求失败: $_"
            break
        }
    } while ($requestUrl)  # 直到没有下一页链接为止

    # 移动到下一个时间区间
    $startDate = $endDate
}

# 输出结果
Write-Host "拉取完成,共获取 $($allEventIds.Count) 条事件ID"
$allEventIds

脚本关键说明:

  1. 认证部分:用Get-MsalToken获取令牌,交互式登录适合测试;如果是生产环境,可以改用客户端密钥或证书认证(把-Interactive换成-ClientSecret $secret或-CertificateThumbprint $thumbprint)。
  2. 时间分段:通过timeIntervalDays控制每次拉取的天数,数据量多的话可以改小(比如3天),避免单页数据过多。
  3. 效率优化:用$select=id只拉取需要的ID字段,减少网络传输的数据量,提升拉取速度。
  4. 错误处理:添加了try-catch块,遇到请求失败时会输出错误信息并终止当前区间的拉取,避免脚本崩溃。
三、额外提示
  • 如果你的事件数据特别多,还可以结合$orderby=createdDateTime来确保数据顺序一致,避免重复或遗漏。
  • 测试时可以先缩小时间范围(比如只拉取最近1天的数据),确认脚本正常运行后再扩大范围。

内容的提问来源于stack exchange,提问作者Panda

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:51:34