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

如何用PowerShell分批执行Office365的Grant-CsUserPolicyPackage命令

分批执行Grant-CsUserPolicyPackage解决批量限制问题

针对你遇到的微软命令批量执行限制问题,我来帮你调整脚本实现按批次(每批10个用户)处理,同时添加进度提示和频率控制,避免触发API限制。

修改后的完整脚本

# 1. 先一次性获取所有符合许可证条件的用户UPN列表
$allTargetUsers = Get-MsolUser | Where-Object {($_.licenses).AccountSkuId -match "STANDARDWOFFPACK_STUDENT"} | Select-Object -ExpandProperty UserPrincipalName

# 2. 设置每批处理的用户数量
$batchSize = 10

# 3. 计算需要分多少批处理(向上取整,确保最后一批不足10个也能处理)
$totalBatches = [math]::Ceiling($allTargetUsers.Count / $batchSize)

Write-Host "检测到 $($allTargetUsers.Count) 个符合条件的用户,将分为 $totalBatches 批进行处理`n"

# 4. 循环处理每一批用户
for ($batchIndex = 0; $batchIndex -lt $totalBatches; $batchIndex++) {
    # 截取当前批次的用户:跳过前面已处理的用户,取当前批次的10个
    $currentBatchUsers = $allTargetUsers | Select-Object -Skip ($batchIndex * $batchSize) -First $batchSize
    
    Write-Host "正在处理第 $($batchIndex + 1) 批,共 $($currentBatchUsers.Count) 个用户..."
    
    # 执行策略包授予命令
    Grant-CsUserPolicyPackage -Identity $currentBatchUsers -PackageName "Education_PrimaryStudent_RemoteLearning"
    
    # 每批处理完成后,除了最后一批,停顿30秒避免触发API频率限制(可根据实际情况调整时长)
    if ($batchIndex -ne $totalBatches - 1) {
        Write-Host "等待30秒后继续处理下一批...`n"
        Start-Sleep -Seconds 30
    }
}

Write-Host "`n所有用户策略包授予操作已完成!"

关键细节说明

  • 一次性获取用户列表:避免多次调用Get-MsolUser,减少不必要的API请求,提升效率
  • 批次计算逻辑:用[math]::Ceiling向上取整,确保哪怕最后一批只有1个用户也会被处理
  • 进度提示:通过Write-Host输出当前处理进度,方便你实时跟踪状态
  • 频率控制:添加Start-Sleep避免短时间内发送大量请求触发微软的API限制,这个停顿时间可以根据你的实际环境调整(比如网络好、权限高的话可以缩短到10秒)

前置注意事项

在运行脚本前,请确保你已经完成以下操作:

  • 连接到Microsoft 365服务:执行Connect-MsolService登录你的管理员账号
  • 连接到Teams/Skype for Business Online服务:执行Connect-MicrosoftTeams(因为Grant-CsUserPolicyPackage属于Teams PowerShell模块)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 08:28:11