如何用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
相关产品推荐
相关产品推荐

