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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 14:06:01