如何使用Az PowerShell为托管标识服务主体添加Microsoft Graph权限?
问题
我正在使用用户托管标识(UMI)连接Microsoft Graph,已在Azure门户创建该托管标识,现需通过PowerShell为其分配User.Read.All和Group.Read.All权限以获取用户和组信息。此前我曾通过Microsoft Graph PowerShell模块解决类似问题,但现在需要改用Az PowerShell模块实现相同效果。以下是我之前使用AzureAD模块的旧脚本:
Connect-AzureAD $TenantID = "TenantID" $GraphAppId = "00000003-0000-0000-c000-000000000000" $NameOfMSI = "my-managed-identity" $Permissions = @("Group.Read.All", "User.Read.All") $MSI = Get-AzureADServicePrincipal -Filter "displayName eq '$NameOfMSI'" Start-Sleep -Seconds 10 $GraphServicePrincipal = Get-AzureADServicePrincipal -Filter "appId eq '$GraphAppId'" foreach ($PermissionName in $Permissions) { $AppRole = $GraphServicePrincipal.AppRoles | Where-Object { $_.Value -eq $PermissionName -and $_.AllowedMemberTypes -contains "Application" } New-AzureAdServiceAppRoleAssignment -ObjectId $MSI.ObjectId -PrincipalId $MSI.ObjectId -ResourceId $GraphServicePrincipal.ObjectId -Id $AppRole.Id }
请问是否可以通过Az PowerShell模块实现该需求?若可以,能否提供具体操作指引?
解决方案
可以使用Az PowerShell模块完成托管标识的Microsoft Graph权限分配,具体操作步骤如下:
前置条件
- 已安装Az PowerShell模块(若未安装,可运行
Install-Module -Name Az -AllowClobber -Scope CurrentUser安装) - 登录账号需具备应用程序管理员或全局管理员权限,用于管理服务主体的权限分配
具体脚本及说明
# 1. 连接Az账号 Connect-AzAccount -TenantId "你的租户ID" # 2. 定义变量 $TenantID = "你的租户ID" $GraphAppId = "00000003-0000-0000-c000-000000000000" # Microsoft Graph的固定应用ID $NameOfMSI = "my-managed-identity" # 你的托管标识名称 $Permissions = @("Group.Read.All", "User.Read.All") # 需要分配的权限 # 3. 获取托管标识对应的服务主体 $MSI = Get-AzADServicePrincipal -Filter "displayName eq '$NameOfMSI'" # 若刚创建托管标识,可能存在延迟,可添加睡眠等待同步 Start-Sleep -Seconds 10 # 4. 获取Microsoft Graph的服务主体 $GraphServicePrincipal = Get-AzADServicePrincipal -Filter "appId eq '$GraphAppId'" # 5. 遍历权限并分配 foreach ($PermissionName in $Permissions) { # 找到对应权限的AppRole(需确保是应用权限,即AllowedMemberTypes包含Application) $AppRole = $GraphServicePrincipal.AppRoles | Where-Object { $_.Value -eq $PermissionName -and $_.AllowedMemberTypes -contains "Application" } if ($AppRole) { # 分配应用角色权限 New-AzADServiceAppRoleAssignment ` -ObjectId $MSI.Id ` -PrincipalId $MSI.Id ` -ResourceId $GraphServicePrincipal.Id ` -Id $AppRole.Id Write-Host "已成功分配权限: $PermissionName" } else { Write-Warning "未找到权限: $PermissionName 或该权限不是应用级权限" } }
关键说明
- Az模块中
Get-AzADServicePrincipal返回的对象属性与AzureAD模块略有不同,需使用Id而非ObjectId New-AzADServiceAppRoleAssignment的参数与旧脚本对应,只需替换属性名称即可完成权限分配- 若托管标识刚创建,添加
Start-Sleep可避免因Azure同步延迟导致的服务主体查找失败问题
内容的提问来源于stack exchange,提问作者L S
相关产品推荐
相关产品推荐

