You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否通过Graph或PowerShell查询AAD服务主体可用API列表并程序化遍历?

嘿Andy,刚好我之前折腾过类似的需求,完全可以通过Microsoft Graph API或者PowerShell来实现你想要的自动化遍历,完美对应Azure门户里API权限标签页的层级结构!下面给你详细拆解两种实现方式:

使用Microsoft Graph API获取API权限层级结构

首先你得确保调用账号/服务主体有足够的权限,比如Application.Read.All或者Directory.Read.All,前者足够覆盖大部分场景。

1. 先拿到所有可用的API集合

Azure门户里展示的API本质都是服务主体(Service Principal),所以我们可以通过Graph的servicePrincipals接口筛选出代表API的应用:

GET https://graph.microsoft.com/v1.0/servicePrincipals?$filter=servicePrincipalType eq 'Application' and accountEnabled eq true&$select=id,displayName,appId,description

这个请求会返回所有可用的API应用,和你在门户里看到的API列表完全对应。

2. 逐层获取单个API的权限

拿到某个API的id后,就能分别拉取它的委托权限和应用权限:

  • 获取委托权限:调用oauth2PermissionScopes端点
GET https://graph.microsoft.com/v1.0/servicePrincipals/{API的servicePrincipalId}/oauth2PermissionScopes
  • 获取应用权限:调用appRoles端点
GET https://graph.microsoft.com/v1.0/servicePrincipals/{API的servicePrincipalId}/appRoles

这两个接口返回的结果,就是你在门户里展开API后看到的具体权限列表。

3. 自动化遍历的思路

你可以写个脚本逻辑:先调用第一步的接口拿到所有API列表,然后遍历每个API的id,依次请求委托/应用权限接口,最后把结果组织成「API名称 → 权限类型(委托/应用) → 具体权限」的层级结构即可。

使用PowerShell(Microsoft Graph模块)快速实现

如果不想写HTTP请求,用PowerShell的Microsoft Graph模块会更简单:

1. 准备工作

先安装并导入模块,然后连接到Graph:

# 安装模块(首次运行)
Install-Module Microsoft.Graph.Applications -Force
# 导入模块
Import-Module Microsoft.Graph.Applications
# 连接到Graph,需要授权对应权限
Connect-MgGraph -Scopes "Application.Read.All"

2. 一键遍历所有API及权限

运行下面的脚本,就能直接输出和门户一致的层级结构:

# 获取所有可用API
$allAPIs = Get-MgServicePrincipal -Filter "servicePrincipalType eq 'Application' and accountEnabled eq true" -Property Id,DisplayName,AppId,Description

# 遍历每个API,输出权限信息
foreach ($api in $allAPIs) {
    Write-Host "`n=== API名称: $($api.DisplayName) ==="
    Write-Host "API标识ID: $($api.Id)"

    # 输出委托权限
    $delegatedPerms = Get-MgServicePrincipalOauth2PermissionScope -ServicePrincipalId $api.Id
    if ($delegatedPerms) {
        Write-Host "`n--- 委托权限列表 ---"
        $delegatedPerms | Select-Object Value,DisplayName,Description | Format-Table -AutoSize
    }

    # 输出应用权限
    $appPerms = Get-MgServicePrincipalAppRole -ServicePrincipalId $api.Id
    if ($appPerms) {
        Write-Host "`n--- 应用权限列表 ---"
        $appPerms | Select-Object Value,DisplayName,Description | Format-Table -AutoSize
    }
}
一些实用提示
  • 权限控制:如果只需要获取微软官方API,可以在筛选条件里加startswith(appId, '0000000'),因为微软官方API的appId大多以0000000开头。
  • 分页处理:如果租户里API数量很多,Graph API会分页返回结果。PowerShell模块会自动处理分页,但手动调用HTTP接口时,需要检查响应里的@odata.nextLink来获取下一页数据。
  • 权限验证:如果遇到访问被拒绝的情况,先确认你的账号/服务主体已经被授予Application.Read.All权限,并且权限已经生效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 22:52:30