使用 powershell 从用户中删除多个许可证

Removing multiple licences from a user using powershell

我正在尝试从我的 .xlsx 文件中删除一个或多个用户的多个许可证。这是我的代码

$users = Import-XLSX '\server\c$\User Creation\ADUsersRemoval.xlsx' |
    where {$_.isLicensed -eq $true}
foreach ($user in $users)
{
    $Firstname = $User.Firstname
    $Lastname   = $User.Lastname
    $upn= "$Firstname.$Lastname@domain.com"
    Set-MsolUserLicense -UserPrincipalName $upn -RemoveLicense "Domain:POWER_BI_STANDARD","Domain:FLOW_FREE"
}

我一直收到错误

Set-MsolUserLicense : Unable to assign this license because it is invalid. Use the Get-MsolAccountSku cmdlet to retrieve a list of valid licenses.

我个人认为这是因为某些用户可能没有其中一个许可证。如果我想删除一个许可证并且他们都拥有相同的许可证,它会工作正常但有两个许可证并且一些用户没有两个,它只会抛出错误。

如有任何帮助,我们将不胜感激。

如果您试图从没有分配许可证的用户那里删除有效的许可证字符串,则会产生您看到的错误。您将需要构建逻辑以仅删除分配的许可证。

您可以使用 Compare-Object 执行此操作,但需要使用 Get-MsolUser 额外查询用户信息。如果您的 excel 文件中已经有用户许可分配,那么可以将其调整为 运行 快得多。

$users = Import-XLSX '\server\c$\User Creation\ADUsersRemoval.xlsx' |
    where {$_.isLicensed -eq $true}
$Licenses = "Domain:POWER_BI_STANDARD","Domain:FLOW_FREE"

foreach ($user in $users)
{
    $Firstname = $User.Firstname
    $Lastname   = $User.Lastname
    $upn= "$Firstname.$Lastname@domain.com"
    $LicensesToRemove = (Get-MsolUser -UserPrincipalName $upn).Licenses.AccountSkuId |
        Compare-Object $Licenses -IncludeEqual -ExcludeDifferent -PassThru
    Set-MsolUserLicense -UserPrincipalName $upn -RemoveLicenses $LicensesToRemove
}

解释:

$Licenses 包含您要删除的所有许可证。在您的 foreach 循环中,一个新变量 $LicensesToRemove 将表示与您的 $Licenses 项匹配的已分配许可证。

Compare-Object用于为LicensesToRemove提供值。 -IncludeEqual -ExcludeDifferent 确保我们只输出与用户分配的许可证和您要删除的许可证相匹配的许可证。 -PassThru 只允许输出匹配的许可证文本字符串。


根据您的用户列表的大小,在进入您的循环之前收集用户许可分配会有一个好处。 运行 Get-MsolUserSet-MsolUserLicense 在每次迭代中的效率可能低于进入循环之前的一个包罗万象的 Get-MsolUser