首页 > 解决方案 > 使用 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 :无法分配此许可证,因为它无效。使用 Get-MsolAccountSku cmdlet 检索有效许可证的列表。

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

对此的任何帮助将不胜感激。

标签: powershellazure-active-directoryoffice365

解决方案


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

您可以使用 执行此操作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-MsolUser和运行Set-MsolUserLicense可能会比一次无所不包的效率低。Get-MsolUser


推荐阅读