无 Azure subscription 时如何通过 APIs 获取 O365 账单详情?
结论
没有 Azure subscription 也可以调用 Microsoft Graph。只需拥有 Microsoft 365 租户,在 Microsoft Entra ID 中注册应用,并取得相应的管理员授权,就能通过 API 查询已购买的许可证 SKU、许可证数量、服务计划及用户分配情况。
不过,Microsoft 365 管理中心“账单和付款”页面中的全部信息,无法通过某个通用的 Microsoft Graph API 原样获取。发票、付款方式、税费、订单和账单明细是否可以通过 API 查询,取决于订阅的购买渠道:
- 许可证库存和分配情况通过 Microsoft Graph 查询。
- CSP 合作伙伴管理的客户订阅由合作伙伴通过 Partner Center API 查询。
- Azure 产生的费用通过 Azure Cost Management/Billing API 查询,但必须有对应的 Azure billing account 或 subscription。
- 对于直接向 Microsoft 购买的普通 Microsoft 365 商业订阅,部分账单数据通常只能在 Microsoft 365 管理中心查看或下载,不能默认存在公开 API。
获取租户的许可证信息
使用以下接口查询租户已订阅的 SKU:
GET https://graph.microsoft.com/v1.0/subscribedSkus
Authorization: Bearer {access_token}
典型响应中需要关注这些字段:
skuId:SKU 的唯一标识。skuPartNumber:产品 SKU 名称。consumedUnits:已分配的许可证数量。prepaidUnits.enabled:已购买并启用的许可证数量。capabilityStatus:SKU 当前状态。servicePlans:SKU 包含的服务计划。
请求示例:
curl --request GET \
--url "https://graph.microsoft.com/v1.0/subscribedSkus" \
--header "Authorization: Bearer ${ACCESS_TOKEN}" \
--header "Accept: application/json"
返回结构类似:
{
"value": [
{
"skuId": "00000000-0000-0000-0000-000000000000",
"skuPartNumber": "EXAMPLE_SKU",
"consumedUnits": 18,
"prepaidUnits": {
"enabled": 25,
"suspended": 0,
"warning": 0,
"lockedOut": 0
},
"capabilityStatus": "Enabled",
"servicePlans": []
}
]
}
以上数值只用于展示响应结构,不代表真实 SKU 或实际查询结果。
查询每个用户分配了哪些许可证
可以通过以下接口读取某个用户的许可证详情:
GET https://graph.microsoft.com/v1.0/users/{user-id}/licenseDetails
Authorization: Bearer {access_token}
例如:
curl --request GET \
--url "https://graph.microsoft.com/v1.0/users/user@example.com/licenseDetails" \
--header "Authorization: Bearer ${ACCESS_TOKEN}" \
--header "Accept: application/json"
如果要批量列出用户及其已分配的 SKU,可以查询:
GET https://graph.microsoft.com/v1.0/users?$select=id,displayName,userPrincipalName,assignedLicenses
curl --get \
--url "https://graph.microsoft.com/v1.0/users" \
--data-urlencode '$select=id,displayName,userPrincipalName,assignedLicenses' \
--header "Authorization: Bearer ${ACCESS_TOKEN}" \
--header "Accept: application/json"
查询结果可能分页。必须继续请求响应中的 @odata.nextLink,否则只能取得第一页数据。
身份验证配置
调用 Microsoft Graph 不要求购买 Azure subscription,但必须在 Microsoft Entra ID 中注册应用:
- 在 Microsoft Entra 管理中心创建 App registration。
- 记录 Tenant ID 和 Client ID。
- 根据应用的运行方式创建客户端密钥或配置证书。
- 添加所需的 Microsoft Graph 权限。
- 由租户管理员授予 admin consent。
- 从租户的 OAuth 2.0 token endpoint 获取访问令牌。
后台服务可以使用 client credentials flow:
curl --request POST \
--url "https://login.microsoftonline.com/${TENANT_ID}/oauth2/v2.0/token" \
--header "Content-Type: application/x-www-form-urlencoded" \
--data-urlencode "client_id=${CLIENT_ID}" \
--data-urlencode "client_secret=${CLIENT_SECRET}" \
--data-urlencode "scope=https://graph.microsoft.com/.default" \
--data-urlencode "grant_type=client_credentials"
随后从响应中读取 access_token。
许可证查询通常需要 LicenseAssignment.Read.All 等 Microsoft Graph 权限。具体权限应以对应接口当前文档列出的 least privileged permissions 为准。使用应用权限时,通常还需要管理员同意。
为什么不能直接调用管理中心页面地址
以下地址是 Microsoft 365 管理中心的前端路由:
https://admin.microsoft.com/Adminportal/Home?source=applauncher&ref=/users#/licenses
它不是受支持的公共 API endpoint。管理中心内部发送的网络请求可能依赖登录会话、内部接口及未公开协议,不应在抓包后直接调用。这些接口可能随时变化,也没有公开 API 所提供的兼容性承诺。
页面中的数据应分别映射到受支持的 Microsoft Graph 接口:
| 所需数据 | 建议接口 |
|---|---|
| 租户购买的许可证 SKU | GET /subscribedSkus |
| SKU 已购买和已分配数量 | prepaidUnits、consumedUnits |
| 用户已分配许可证 | GET /users?$select=assignedLicenses |
| 用户许可证及服务计划详情 | GET /users/{id}/licenseDetails |
| 发票、付款方式、税费和订单 | 无统一 Microsoft Graph 接口,按购买渠道处理 |
账单详情的处理方式
处理账单数据前,需要先确认订阅由谁销售:
- 如果 Microsoft 365 订阅是直接向 Microsoft 购买的,应在 Microsoft 365 管理中心的账单区域查看或下载可用发票。Azure Billing API 不能当作 Microsoft 365 账单 API 使用。
- 如果订阅由 CSP 经销商提供,账单关系通常在经销商一侧。只有具备相应的合作伙伴身份和权限,才能通过 Partner Center API 查询客户订阅、对账单或相关计费数据。
- 如果要查询的是 Azure 服务费用,则应使用 Azure Cost Management/Billing API。Azure 费用与 Microsoft 365 许可证库存属于两套不同的计费体系。
通常的实现方式是使用 Microsoft Graph 自动同步许可证库存和用户分配信息,再根据订阅的购买渠道单独处理账单和发票,而不是寻找一个可以完整复制 Microsoft 365 管理中心全部字段的 API。
注意事项
- Microsoft 365 租户和 Microsoft Entra ID 是调用 Microsoft Graph 的基础,但不等同于付费 Azure subscription。
consumedUnits表示已分配的许可证数量,不是费用金额。- SKU 标识与产品显示名称并不总是一一对应。如需展示友好名称,应维护经过验证的 SKU 映射,并在新 SKU 上线后及时更新。
- 应优先使用证书,避免长期使用客户端密钥,并将凭据保存在安全的密钥管理系统中。
- 应按照最小权限原则配置应用权限。如果交互式登录已经能够满足需求,可优先评估委托权限。
- Microsoft Graph
beta接口不适合作为稳定的生产依赖,除非可以接受字段和行为发生变化。 - API 返回的许可证数据与管理中心显示之间可能存在短暂的同步延迟,不能用这些数据推断实时账单金额。
备注:内容仅供参考。
