当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 如何在分配给 Entra ID 帐户之前检查许可证

作者:精品下载站 日期:2024-12-14 04:11:21 浏览:15 分类:玩电脑

如何在分配给 Entra ID 帐户之前检查许可证


许可证分配可能会遇到故障

最近关于使用 Microsoft Graph PowerShell SDK 创建 Entra ID 帐户的讨论询问是否可以在同一命令中创建帐户并分配许可证。我找不到办法做到这一点,于是询问了微软。他们确认,New-MgUser cmdlet 在创建新帐户时无法分配许可证。

考虑到这种情况,最好先确认是否存在新帐户,然后再继续将许可证分配给单个帐户或使用批量分配的一批帐户。一开始错误处理会更容易。

一次分配多个许可证

另一种讨论是一次分配多个许可证还是单独分配许可证。例如,您可以通过构建许可证分配数组并将该数组用作 Set-MgUserLicense cmdlet 的输入,将多个产品许可证分配给一个帐户。

为了说明我的意思,此代码创建一个数组,其中包含 Viva、SharePoint-Syntax 高级管理和 Office 365 E3 产品许可证的 SKU 标识符:

$DepartmentSkus = @(
   @{SkuId = '61902246-d7cb-453e-85cd-53ee28eec138'},
   @{SkuId = '6ee9b90c-0a7a-46c4-bc96-6698aa3bf8d2'},
   @{SkuId = '6fd2c87f-b296-42f0-b197-1e91e994b900'}
)

在单个操作中分配许可证集是通过以下方式完成的:

Set-MgUserLicense -UserId $UserId -AddLicenses $DepartmentSKUs -RemoveLicenses @()

如果一切顺利并且所有指定的许可证均可用,则此方法非常有效。同样,如果出现问题,错误处理就会变得更加困难。

检查账户是否已有License

说到错误条件,我想到两个明显的问题:

  • 用户帐户已分配有产品许可证。
  • 租户没有可供分配的产品的更多许可证。

针对这些条件建立检查很容易。让我们探讨一下如何做。

假设我们想要将一组许可证分配给帐户,我们已经将其加载到数组中。许可证的 SKU 标识符定义如下:

[array]$DesiredSKUs = '6fd2c87f-b296-42f0-b197-1e91e994b900', 'f30db892-07e9-47e9-837c-80727f46fd3d', '1f2f344a-700d-42c9-9427-5cea1d5d7ba6', '6ee9b90c-0a7a-46c4-bc96-6698aa3bf8d2'

要检查用户帐户是否已拥有这些许可证中的任何一个,我们首先使用 Get-MgUserLicenseDetail cmdlet 检索该帐户持有的许可证,然后对照用户的许可证检查集合中的每个许可证。例如:

[array]$AdjustedSKUs = $Null
[array]$CurrentLicenses = Get-MgUserLicenseDetail -UserId $User | Select-Object -ExpandProperty SkuId
ForEach ($Sku in $DesiredSkus) {
    If ($Sku -in $CurrentLicenses) {
      Write-Host ("SKU {0} is already assigned to {1} so its assignment will be ignored" -f $Sku, $User) -ForegroundColor DarkRed
      $LicenseFound = $True       
    } Else {
      $AdjustedSKUs += $Sku
    }
} # End Foreach SKU1

如果用户还没有许可证,代码将添加到 $AdjustedSKUs 数组中。然后,该数组作为我们第二次检查的输入,以查看许可证是否可用于分配。

检查许可证可用性

要了解哪些许可证可用,该脚本会获取租户已知的一组产品订阅,并构建一个哈希表,其中包含 SKU 标识符的键和可用许可证数量的值:

[array]$Skus = Get-MgSubscribedSku

$AvailableLicenses = @{}
ForEach ($S in $Skus) {
  $AvailableUnits = ($S.PrepaidUnits.Enabled - $S.ConsumedUnits)
  $AvailableLicenses.Add([string]$S.SkuId, $AvailableUnits)
}

哈希表如下所示:

Name                           Value
----                           -----
26d45bd9-adf1-46cd-a9e1-51e9a… 2
a403ebcc-fae0-4ca2-8c8c-7a907… 999995
6ee9b90c-0a7a-46c4-bc96-6698a… 0
b05e124f-c7cc-45a0-a6aa-8cf78… -2

SKU 具有负值可能是由于订阅已过期,其中用户帐户仍分配有许可证。但是,这些许可证不再有效,因为它们已过期。我们的代码可以使用哈希表来检查我们想要分配给用户的每个产品的许可证是否可用:

ForEach ($Sku in $AdjustedSkus) {
     If ($AvailableLicenses[$Sku] -gt 0) {
        $SkusToAssign += $Sku
     } Else {
       Write-Host ("No licenses are available to assign SKU {0} to user {1}" -f $Sku, $User) -ForegroundColor Red
     }
} # End ForEach SKU

充满信心地进行许可证分配

检查可用许可证的输出是一个数组,其中包含脚本可以分配的 SKU 标识符集。我们通过调用Set-MgUserLicense来处理每个分配来做到这一点。为了防止其他分配许可证的尝试因不可用而失败,该脚本包含用于在成功分配后减少哈希表中记录的可用许可证数量的代码。

ForEach ($Sku in $SkusToAssign) {
     Write-Host ("Assiging SKU {0} to user {1}" -f $SKU, $User)
     Try {
       $Status = Set-MgUserLicense -UserId $User -AddLicenses @{SkuId = $SKU} -RemoveLicenses @()
     # Remove the assigned license from the available count
       $AvailableLicenses[$SKU]  = ($AvailableLicenses[$SKU] - 1)
     } Catch {
       Write-Host ("Whoops - Error assiging SKU {0} to user {1}" -f $SKU, $User)
     }
}

图 1 显示了生成的有关脚本所执行操作的报告。

[玩转系统] 如何在分配给 Entra ID 帐户之前检查许可证

您可以从 GitHub 下载完整的脚本。

删除许可证

我们上面讨论了如何使用单个命令分配多个许可证。您也可以使用单个命令删除多个许可证。最大的区别在于传递的数组仅包含产品标识符而不是哈希表。这是 Microsoft Graph PowerShell SDK 的缺点之一。

此示例演示如何从用户帐户中删除两个产品许可证:

[array]$LicensesToRemove = "f30db892-07e9-47e9-837c-80727f46fd3d", "6fd2c87f-b296-42f0-b197-1e91e994b900"
Set-MgUserLicense -UserId [email protected] -AddLicenses @() -RemoveLicenses $LicensesToRemove

计划许可证分配的成功或失败

做一些准备工作可以使通过 PowerShell 处理的许可证分配更加成功。可能会出现其他故障,例如暂时性网络问题或影响 Entra ID 后端许可证管理问题的问题,但最常见的问题是这里介绍的两个问题。与 Practical365.com 发布的其他示例脚本一样,本文中的代码说明了原理,而不是完整的解决方案。我希望您可以使用此处概述的建议。

Active Directory 的网络安全风险管理

了解如何通过这些网络安全风险管理解决方案预防 AD 攻击并从中恢复。

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯