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

[玩转系统] Microsoft 强制从 Azure AD Cmdlet 迁移到许可证管理

作者:精品下载站 日期:2024-12-14 04:03:52 浏览:13 分类:玩电脑

Microsoft 强制从 Azure AD Cmdlet 迁移到许可证管理


部分 Cmdlet 将于 2022 年停止工作

有时,即使在科技领域,幸运的机缘也会爆发。在我关于使用 Microsoft Graph 管理 Office 365 租户(在线提供)的 TEC 2021 会议上讨论 Microsoft Graph PowerShell SDK 时,情况就是如此。组织团队提前录制了 TEC 会议,以确保会议顺利进行,因此我无法使用当 Microsoft 宣布用于许可证管理的 Azure AD cmdlet 将在 2022 年 6 月 30 日停止工作时落在我腿上的示例。( 2022 年 3 月 15 日更新:Microsoft 已将停用日期推迟至 2022 年 8 月 26 日)。

这是 Microsoft 在 6 月份就 Azure AD Graph 的未来进行的预告的后续内容。简而言之,Azure AD Graph 是一个独立于 Microsoft Graph 的旧组件,即将停用。依赖于 Azure AD Graph 的 Azure AD 和 Microsoft Online Services 模块将于 2022 年进入不受支持状态。模块中的大多数 cmdlet 将继续工作,但许可证管理 cmdlet 将在 2022 年 6 月 30 日停止返回数据,因为 Microsoft迁移到新的许可证管理平台。

更新:Microsoft 已将 Azure AD 和 MSOL 模块的弃用日期推迟到 2022 年底。

显然,弃用对人们用来管理 Azure AD 不同方面的许多脚本产生了连锁反应,因此迫切需要在许可证管理 cmdlet 停止工作之前找到替代方案。 Microsoft 的指导是使用 Microsoft Graph PowerShell SDK 中的 allocateLicense Graph API 或 Set-MgUserLicense cmdlet。

升级到 Microsoft Graph PowerShell SDK

将 Azure AD cmdlet 换成 SDK cmdlet 有多困难?从表面上看,更换应该很简单,但通常情况下,这种感觉会持续大约五分钟。至少,这是我在升级脚本以从多个帐户的 Office 365 SKU(产品)中删除单个服务计划时发现的。该脚本使用 Azure AD 调用来处理许可证信息,因此它是受明年 6 月即将到来的截止日期影响的脚本类型的一个很好的示例。

我遇到的第一个问题是 SDK cmdlet 的文档。据我了解,微软从代码中生成了大部分文档,这解释了一些奇怪的措辞和文本完全不理解的性质。自然地,我痛苦地呻吟着,经过一番探索,发现了一些有用的提示,为我指明了正确的方向。

升级步骤

Microsoft Graph PowerShell SDK 支持委派和仅应用程序身份验证。在此示例中,我们将使用委派访问从 Azure AD 获取访问令牌,主要是因为这是基于 Azure AD 版本的脚本中发生的情况。概括地说,以下是我升级代码所采取的步骤:

连接到图表Connect-MgGraph cmdlet 连接到图表。连接请求可以指定与数据交互所需的权限。例如,此连接请求读取和写入目录信息的权限。

Connect-MgGraph -Scopes "User.ReadWrite.All","Directory.ReadWrite.All"

选择 Beta 配置文件。图形 API 有不同的版本(通常,V1.0 用于完整生产,Beta 用于开发)。仅当您选择 Beta 配置文件时,才可以使用 Get-MgUser cmdlet 获取用户帐户的许可证管理信息。此代码检查加载的配置文件,如果未设置则选择 Beta。

$Profile = (Get-MgProfile).Name
If ($Profile -ne "beta") { Select-MgProfile Beta }

获取租户中的产品许可证 (SKU)。该脚本允许管理员选择要从 SKU(例如 Office 365 E3)中删除的单个服务计划(例如 Forms、Whiteboard 或 Planner)。为了允许管理员进行选择,我们使用 Get-MgSubscribedSku cmdlet 获取租户中可用的 SKU 列表。

[array]$Skus = (Get-MgSubscribedSku)

然后,我们可以使用 SKU 信息向管理员呈现 SKU 菜单和服务计划,供他们选择要删除的服务计划。结果是选定的 SKU 和选定的服务计划,两者均标识为 GUID。

选择要处理的用户帐户Get-MgUser cmdlet 是选择一组 Azure AD 帐户进行处理的好方法。例如,要查找分配了特定 SKU 的所有帐户,您可以使用如下命令:

[array]$Users = Get-MgUser -Filter "assignedLicenses/any(x:x/skuId eq $SelectedSkuId)" -all

然而,该脚本使用Get-ExoMailbox,因为它的过滤功能非常出色。重要的是要有一组帐户 GUID 或用户主体名称,以在代码更新许可证信息时用作输入。 Get-ExoMailbox可以提供这些信息,所以我没有升级这部分代码。

处理帐户的许可证信息。该脚本循环遍历选定的帐户集,以检索当前许可证信息(使用 Get-MgUser),然后构建一个许可证对象 (MicrosoftGraphAssignedLicense),其中包含有关已提供的服务计划的信息已禁用该帐户以及我们现在要删除的服务计划。填充许可证对象后,我们调用Set-MgUserLicense来应用更新。

$ExistingDisabledPlans = $Null
ForEach ($S in $User.AssignedLicenses) { # Check for existing disabled licenses
  If ($S.SkuId -eq $SelectedSkuId) {
    $ExistingDisabledPlans = $S.DisabledPlans }
  }
  $ExistingDisabledPlans += $ServicePlanId # Add the plan we want to remove to the set of disabled plans
  $LicenseToRemove = New-Object -TypeName Microsoft.Graph.PowerShell.Models.MicrosoftGraphAssignedLicense
  $LicenseToRemove.SkuId = $SelectedSkuId
  $LicenseToRemove.DisabledPlans = $ExistingDisabledPlans
  $Status = Set-MgUserLicense -UserId $User.id -AddLicenses $LicenseToRemove -RemoveLicenses @()
}

我是第一个说 Set-MgUserLicense 的语法有点奇怪的人。鉴于将新 SKU 添加到帐户的语法为:

$User = Get-MgUser -UserId [email protected]
$NewSkuId ="8c4ce438-32a7-4ac5-91a6-e22ae08d9c8b"
Set-MgUserLicense -UserId $User.id -AddLicenses @{SkuId = $NewSkuId} -RemoveLicenses @()

我希望使用带有 RemoveLicenses 参数的许可证对象,而不是 AddLicenses,但这不是我希望通过在 RemoveLicenses 中传递信息来更新许可证对象的方式 参数而不是 AddLicenses,但这不是事情的工作方式。将新 SKU 添加到帐户将启用该 SKU 中包含的所有服务计划。在这种情况下,我们传递更新的许可证信息来告诉 Graph 禁用指定 SKU 中的指定服务计划。如果文档在这个主题上更清晰的话那就太好了。

请注意,为了使 cmdlet 满意,必须将空白数组传递给 RemoveLicenses。即使该参数为空,该参数也需要一个值,并且如果发现没有传递任何内容,则会反对。

从帐户中删除许可证

要从帐户中删除一个或多个产品许可证 (SKU),流程为:

  • 创建要删除的产品许可证的数组。您可以一次删除多个产品许可证。该数组包含标识要删除的产品 SKU 的 GUID。
  • 运行Set-MgUserLicense并将数组作为RemoveLicenses参数传递。这次,我们将一个空数组传递给 AddLicenses 参数来创建 cmdlet 内容。此示例从帐户中删除两个产品:
[array]$SkuToRemove = "1f2f344a-700d-42c9-9427-5cea1d5d7ba6", "4016f256-b063-4864-816e-d818aad600c9"
Set-MgUserLicense -UserId $User.id -RemoveLicenses $SkuToRemove -AddLicenses @()

验证服务计划删除

为了测试一切是否正常,我使用脚本从一堆 Office 365 E3 帐户中删除了 MyAnalytics 服务计划(微软将其重命名为 Viva Insights)。更新帐户的许可证分配一切都很顺利。您可以使用 PowerShell 或通过 Microsoft 365 管理中心查看用户信息来验证分配(图 1)。

[玩转系统] Microsoft 强制从 Azure AD Cmdlet 迁移到许可证管理

升级需要多长时间

我确信人们会担心在 6 月 30 日落锤之前升级 PowerShell 脚本所需的时间。存在几个变数,包括:

  • 开发人员熟悉 Microsoft Graph PowerShell SDK。
  • Microsoft 改进 SDK 及其文档的速度有多快。
  • 现有脚本的复杂性以及需要替换的 Azure AD 或 Microsoft Online Services 许可证管理 cmdlet 的数量。
  • 脚本运行的环境(例如使用的身份验证方法)。

距离旧的 cmdlet 停止工作只剩下九个多月的时间了。租户中受影响的脚本数量可能很少,您不需要从头开始重写所有内容。也就是说,除非您创建了自己的许可证管理解决方案。如果是这样的话,你有一些工作要做。如果不是,更新大多数脚本应该只需几天而不是几周的时间。

在模块弃用之前探索和发现

您可以从 GitHub 获取我的脚本的副本。提醒一下,这是为了探索和演示原理而编写的代码,而不是作为生产质量的解决方案。使用代码通过 Microsoft Graph PowerShell SDK 学习、探索许可证管理并与之交互。随着时间的推移,使用 SDK 将会变得更加容易。至少,如果不这样做,当弃用发生时,微软可能会有一些不满意的客户。是时候开始编码了。

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

取消回复欢迎 发表评论:

关灯