使用 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-MsolUser
和 Set-MsolUserLicense
在每次迭代中的效率可能低于进入循环之前的一个包罗万象的 Get-MsolUser
。
我正在尝试从我的 .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-MsolUser
和 Set-MsolUserLicense
在每次迭代中的效率可能低于进入循环之前的一个包罗万象的 Get-MsolUser
。