调用Microsoft Graph API分配带禁用SWAY的E5开发许可证报错
我尝试通过Microsoft Graph API为用户分配带有禁用服务计划SWAY的E5开发许可证,所用代码如下:
graphClient.users(uid.getUidValue()).assignLicense( UserAssignLicenseParameterSet.newBuilder() .withAddLicenses(toBeAdded) .withRemoveLicenses(Collections.emptyList()).build() ).buildRequest().post();
我已经通过调用list subscribed sku接口获取了对应的skuId和service plan guid,但执行上述代码时返回如下报错:
com.microsoft.graph.http.GraphServiceException: 错误代码: Request_BadRequest 错误信息: 用户通过组成员身份继承了许可证,无法直接在用户侧修改该许可证。许可证Sku: DEVELOPERPACK_E5, 账户: cognitumdev
POST https://graph.microsoft.com/v1.0/users/88a4c568-346d-4c9f-8752-8e03d16f0a6e/microsoft.graph.assignLicense
SdkVersion : graph-java/v3.5.0 [...]400 : Bad Request
- 我并未将许可证分配给组,而是直接分配给用户,该错误的实际含义是什么?
- 我可以通过Microsoft 365管理中心正常为已授权用户禁用SWAY应用,后续查询对应用户的assignedLicense,其结构和我尝试通过API赋值的内容完全一致,为何API调用会失败?
错误含义说明
该报错触发的是微软基于组的许可证继承校验逻辑,哪怕你没有主动给组分过该许可证,也存在两种常见触发场景:
- 租户内存在开启了DEVELOPERPACK_E5许可证自动分配的安全组/动态组,该用户属于组内成员,属于你未感知到的隐式继承场景
- 你之前给该用户直接分配过同SKU许可证,后续做过许可证分配方式的组迁移,旧的直接分配记录未彻底清除,触发了许可证状态冲突校验
你可以调用users/{id}/assignedLicenses接口查询对应许可证的assignmentSource属性,如果返回值为Group即可确认是组继承来源,返回User则为直接分配来源。
API调用失败的原因
你在管理中心执行的操作和API调用的操作本质不是同一逻辑:
- 管理中心的禁用操作是修改用户已有许可证的服务计划配置,系统检测到许可证为继承来源时会自动生成用户层面的服务计划覆盖规则,不需要额外参数
- 你当前代码的逻辑是给用户新增一个同SKU的许可证分配,并非修改已有许可证的配置,因此会触发重复分配/继承许可证不可直接修改的校验规则
修复方案
调整你的参数构造逻辑:不需要将整个SKU作为新许可证添加,只需要在addLicenses参数中传入用户已有的DEVELOPERPACK_E5的skuId,同时将SWAY的服务计划ID加入disabledPlans数组即可,assignLicense接口原生支持通过该方式调整已有许可证的服务计划配置,不需要重复新增许可证。
如果确认用户的许可证确实为组继承来源,该调用方式会自动生成用户级别的服务计划覆盖规则,和管理中心操作效果一致。
内容的提问来源于stack exchange,提问作者Steffen Harbich

