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

