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

使用PowerShell批量移除用户多许可证报错求助

解决Set-MsolUserLicense移除多份许可证时的无效许可证错误

你猜的完全没错——这个报错的核心原因就是你尝试移除的许可证中,有部分是当前用户根本没持有的。Set-MsolUserLicense这个cmdlet比较“严格”,要求你通过-RemoveLicense指定的所有许可证,必须是该用户已经分配的,只要有一个不存在,就会直接抛出无效许可证的错误。

下面是修改后的代码,可以完美解决这个问题:

$users = Import-XLSX '\\server\c$\User Creation\ADUsersRemoval.xlsx' | Where-Object {$_.isLicensed -eq $true}
# 先把要移除的目标许可证统一定义成数组,后续维护更方便
$targetLicenses = @("Domain:POWER_BI_STANDARD","Domain:FLOW_FREE")

foreach ($user in $users) {
    $Firstname = $User.Firstname
    $Lastname = $User.Lastname
    $upn = "$Firstname.$Lastname@domain.com"

    # 获取该用户当前已经分配的所有许可证SKU
    $userCurrentLicenses = (Get-MsolUser -UserPrincipalName $upn).Licenses.AccountSkuId

    # 只保留用户实际持有的目标许可证——这一步是关键!
    $licensesToActuallyRemove = $targetLicenses | Where-Object {$userCurrentLicenses -contains $_}

    # 只有当用户有需要移除的许可证时,才执行移除操作
    if ($licensesToActuallyRemove.Count -gt 0) {
        Set-MsolUserLicense -UserPrincipalName $upn -RemoveLicense $licensesToActuallyRemove
        Write-Host "✅ 已为用户 $upn 移除许可证: $($licensesToActuallyRemove -join ', ')"
    } else {
        Write-Host "ℹ️ 用户 $upn 没有需要移除的目标许可证,跳过操作"
    }
}

代码关键逻辑说明:

  • 把要移除的许可证放到$targetLicenses数组里,后续如果要调整移除的许可证,直接改这个数组就行,不用到处找代码
  • 通过Get-MsolUser获取用户当前的所有许可证,提取AccountSkuId(也就是你指定的Domain:SKU_NAME格式的字符串)
  • 用Where-Object筛选出用户实际持有的目标许可证,这样就不会把用户没有的许可证传给-RemoveLicense参数
  • 最后加了判断,避免对没有目标许可证的用户执行无意义的操作,还能输出日志方便排查

另外补充个小提示:如果不确定你的许可证SKU格式是否正确,可以执行Get-MsolAccountSku命令,查看租户下所有有效的许可证SKU列表,确保你用的是正确的名称。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 06:57:19