You need to enable JavaScript to run this app. 使用AzureAD模块为O365用户分配多份自定义许可证报Edm.Guid错误求助
优惠活动
大模型
产品
解决方案
定价
更多

使用AzureAD模块为O365用户分配多份自定义许可证报Edm.Guid错误求助

许可证分配报错排查与修正方案

触发报错的核心原因

  • 匹配SKU的逻辑存在根本性偏差:To Do (Plan 2)不是可独立采购、独立分配的订阅SKU,它是E3/E5等大版本订阅下包含的子服务计划,仅作为Azure门户界面的展示文案存在。用这个值去过滤Get-AzureADSubscribedSku的结果,最终拿到的$LicenseSku是空值,后续传入接口的参数都是空对象,完全不符合Guid类型的参数要求。
  • 参数类型不匹配:代码里直接取$DisabledPlans.ServicePlanId,因为前置的SKU对象为空,这个取值最终返回null,不符合接口要求的Edm.Guid类型格式,直接触发BadRequest报错。
  • 逻辑认知偏差:需要配置的全部应用权限,本身都是Microsoft 365 E3订阅下包含的服务组件,不存在单独的To Do Plan2类独立SKU可以单独分配。

可直接运行的修正实现

Azure门户上显示的服务友好名不能直接用于接口匹配,需要对照每个服务对应的内部固定服务计划名:

  • Azure Right Management 对应内部计划名 RMS_S_ENTERPRISE
  • Exchange Online(plan 2) 对应内部计划名 EXCHANGE_S_ENTERPRISE
  • Microsoft 365 apps for enterprise 对应内部计划名 OFFICESUBSCRIPTION
  • Microsoft Forms (Plan E3) 对应内部计划名 FORMS_PLAN_E3
  • Microsoft Planner 对应内部计划名 PLANNERSTANDALONE
  • Microsoft streams for O365 E3 SKU 对应内部计划名 Stream_O365_E3
  • Microsoft Teams 对应内部计划名 TEAMS1
  • Office for the Web 对应内部计划名 SHAREPOINTWAC
  • SharePoint (Plan 2) 对应内部计划名 SHAREPOINTENTERPRISE
  • Skype for Business Online (Plan 2) 对应内部计划名 MCOSTANDARD
  • To Do (Plan 2) 对应内部计划名 TODOESSENTIALS

修正后的完整代码如下:

Connect-AzureAD

# 定义目标用户
$UserToLicense = Get-AzureADUser -ObjectId "Arthur.Dent@xxx.com"

# 定义需要保留启用的服务计划内部名称
$EnabledPlans = @(
    "RMS_S_ENTERPRISE",
    "EXCHANGE_S_ENTERPRISE",
    "OFFICESUBSCRIPTION",
    "FORMS_PLAN_E3",
    "PLANNERSTANDALONE",
    "Stream_O365_E3",
    "TEAMS1",
    "SHAREPOINTWAC",
    "SHAREPOINTENTERPRISE",
    "MCOSTANDARD",
    "TODOESSENTIALS"
)

# 匹配租户内的E3订阅SKU,对应PartNumber为SPE_E3
$LicenseSku = Get-AzureADSubscribedSku | Where-Object {$_.SkuPartNumber -eq 'SPE_E3'}

# 增加SKU匹配校验,避免空值传参
if (-not $LicenseSku) {
    Write-Error "未匹配到E3 SKU,请运行 Get-AzureADSubscribedSku 核对租户实际的SkuPartNumber值"
    exit
}

# 计算需要禁用的服务计划,提取强类型的ServicePlanId集合
$DisabledPlans = $LicenseSku.ServicePlans | 
    Where-Object {$_.ServicePlanName -notin $EnabledPlans} | 
    Select-Object -ExpandProperty ServicePlanId

# 构造许可证分配对象
$License = New-Object -TypeName Microsoft.Open.AzureAD.Model.AssignedLicense
$License.SkuId = $LicenseSku.SkuId
$License.DisabledPlans = $DisabledPlans

$AssignedLicenses = New-Object -TypeName Microsoft.Open.AzureAD.Model.AssignedLicenses
$AssignedLicenses.AddLicenses = $License
$AssignedLicenses.RemoveLicenses = @()

# 执行许可证分配
Set-AzureADUserLicense -ObjectId $UserToLicense.ObjectId -AssignedLicenses $AssignedLicenses

操作注意事项

  • 如果需要为用户分配多份不同的SKU许可证,只需要按照上述逻辑,为每个SKU单独构造对应的AssignedLicense对象,将多个对象组成数组赋值给$AssignedLicenses.AddLicenses即可。
  • 禁用计划列表必须是Guid类型的数组,不能传入嵌套的对象属性,否则会触发接口的类型校验报错。
  • 不要使用门户展示的友好名称做服务计划匹配,这些名称属于界面翻译层内容,没有固定标准,接口交互必须使用服务对应的固定内部名称。

内容的提问来源于stack exchange,提问作者Sandy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.04 01:15:04