powershell - 使用 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 检索有效许可证的列表。
我个人认为这是因为某些用户可能没有这些许可证之一。如果我想删除一个许可证并且他们都拥有相同的许可证,它可以正常工作,但有两个许可证并且一些用户没有两者,它只会引发错误。
对此的任何帮助将不胜感激。
解决方案
如果您尝试从未分配许可证的用户中删除有效的许可证字符串,则会产生您看到的错误。您将需要构建逻辑以仅删除已分配的许可证。
您可以使用 执行此操作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
推荐阅读
- scala - 基于多个条件在 Spark 上优雅地合并行
- mysql - ADO - MySQL - 显示 BINLOG 事件
- javascript - 如何为数组中的相同字符串值生成永久 React 键?
- android - 当我更改片段并通过交换它不显示任何内容返回到前一个片段时
- excel - 需要对象或对象变量或带有块错误
- java - Selenium-Cucumber-Jenkins 使用标签组合执行
- javascript - 如何使用 Nestjs 测试使用护照策略实现的 Auth 0
- reactjs - React Jest 测试获取 API 的操作
- node.js - 需要帮助在同一 Node.JS/Express 路由中进行 2 个 API 调用
- redux - RxJS 视频上传进度条