使用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
相关产品推荐
相关产品推荐

