能否通过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
相关产品推荐
相关产品推荐

