如何使用PowerShell 7为Azure托管标识设置Microsoft Graph API权限
PowerShell 7 跨平台环境为Azure托管标识分配Microsoft Graph API权限方案
报错根因
返回Resource 00000003-0000-0000-c000-000000000000 does not exist错误的核心原因是新旧模块参数要求差异:
00000003-0000-0000-c000-000000000000是Microsoft Graph的全局固定AppId,并非你租户内Graph服务主体的实例ObjectIdNew-MgServicePrincipalAppRoleAssignment要求ResourceId参数必须传入当前租户内对应资源服务主体的ObjectId,直接传入全局AppId就会触发资源不存在报错- 老旧的AzureAD模块会自动根据全局AppId拉取租户内实例ID,新的Microsoft Graph模块取消了这个自动解析逻辑,必须手动获取对应ID
可行实现步骤
以下方案完全基于跨平台的Microsoft Graph PowerShell模块,支持PowerShell 7.x,可在Linux、macOS、Windows环境直接运行,无需依赖已停止更新的AzureAD/AzureADPreview模块。
- 安装依赖模块
# 安装所需的Microsoft Graph应用管理模块,当前用户范围安装不需要管理员权限 Install-Module Microsoft.Graph.Applications -Scope CurrentUser -Force -AllowClobber
- 连接Microsoft Graph
# 无GUI的Linux构建代理场景加-UseDeviceAuthentication参数走设备码登录 # CI/CD场景可替换为服务主体客户端密钥/证书登录方式 Connect-MgGraph -Scopes "AppRoleAssignment.ReadWrite.All", "Application.Read.All" -UseDeviceAuthentication
注意:登录使用的账号需具备全局管理员、云应用管理员或应用管理员角色,否则无权限分配应用角色。
- 拉取必要的对象ID(核心步骤,解决资源不存在报错)
# 1. 获取当前租户内Microsoft Graph对应的服务主体实例 $graphSp = Get-MgServicePrincipal -Filter "AppId eq '00000003-0000-0000-c000-000000000000'" # 2. 获取待配置权限的托管标识(MSI)对应的服务主体实例 # 可按显示名称筛选,也可直接传入已知的MSI服务主体ObjectId $msiSp = Get-MgServicePrincipal -Filter "servicePrincipalType eq 'ManagedIdentity' and displayName eq '替换为你的托管标识名称'" # 3. 获取需要分配的Graph应用权限ID,示例为User.Read.All,可替换为所需权限值 $appRole = $graphSp.AppRoles | Where-Object { $_.Value -eq "User.Read.All" -and $_.AllowedMemberTypes -contains "Application" }
- 执行权限分配
New-MgServicePrincipalAppRoleAssignment -ServicePrincipalId $msiSp.Id ` -PrincipalId $msiSp.Id ` -ResourceId $graphSp.Id ` -AppRoleId $appRole.Id
补充说明
- 权限分配完成后通常有1-5分钟的生效延迟,不需要重启托管标识关联的Azure资源
- 批量分配多个权限时,循环执行上述分配命令、替换对应
$appRole即可 - CI/CD流水线场景使用服务主体登录时,需要提前给流水线使用的服务主体授予
AppRoleAssignment.ReadWrite.All应用权限 - Az模块目前确实没有内置对应cmdlet,直接调用Microsoft Graph REST API也是相同逻辑,本质都是操作租户内的服务主体应用角色分配关系
内容的提问来源于stack exchange,提问作者woter324
相关产品推荐
相关产品推荐

