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

PowerShell中Azure AD服务主体权限被替换而非累加问题求助

问题:Azure AD服务主体权限被覆盖无法共存的原因

我编写了两个PowerShell函数,用于为Azure AD中的服务主体添加两个独立权限:

第一个函数代码:

function Add-User-Impersonation {
    
    param(
        $App
    )

    $AzureManagementAPI = New-Object -TypeName "Microsoft.Open.AzureAD.Model.ResourceAccess" -ArgumentList "41094075-9dad-400e-a0bd-54e686782033","Scope"

    $RequiredAccess = New-Object -TypeName "Microsoft.Open.AzureAD.Model.RequiredResourceAccess"
    $RequiredAccess.ResourceAppId = "797f4846-ba00-4fd7-ba43-dac1f8f63013"
    $RequiredAccess.ResourceAccess = $AzureManagementAPI

    Set-AzureADApplication -ObjectId $App.ObjectId -RequiredResourceAccess @($RequiredAccess)


    Write-Output "User-Impersonation Added"

    return $App
}

第二个函数代码:

function Add-Offline-Access {
    
    param(
        $App
    )

    $myappId = $App.ObjectId
    $MSGraph = Get-AzureADServicePrincipal -All $true | Where-Object { $_.DisplayName -eq "Microsoft Graph" }

    # Retrieve the ID of the 'offline_access' permission from Microsoft Graph
    $offlineAccessPermission = $MSGraph.Oauth2Permissions | Where-Object { $_.Value -eq 'offline_access' }
    $Graph = New-Object -TypeName "Microsoft.Open.AzureAD.Model.RequiredResourceAccess"
    $Graph.ResourceAppId = $MSGraph.AppId
    $Per1 = New-Object -TypeName "Microsoft.Open.AzureAD.Model.ResourceAccess" -ArgumentList $offlineAccessPermission.Id,"Scope"
    $Graph.ResourceAccess = $Per1
    Set-AzureADApplication -ObjectId $myappId -RequiredResourceAccess $Graph

    Write-Output "Offline-Access Added"

    return $App
}

实际操作中,先运行Add-Offline-Access函数,会在Microsoft Graph下添加offline_access权限;但运行Add-User-Impersonation函数后,该权限会被Azure Service Management下的User Impersonation权限替换,无法同时保留两个权限。请问该问题的原因是什么?


原因分析

问题核心在于Set-AzureADApplication的-RequiredResourceAccess参数是覆盖式更新,而非追加式添加:

  • 运行Add-Offline-Access时,函数创建仅包含Microsoft Graph offline_access权限的RequiredResourceAccess对象,通过Set-AzureADApplication将应用的权限配置完全替换为这个新对象。
  • 运行Add-User-Impersonation时,函数同样创建仅包含Azure Service Management User Impersonation权限的RequiredResourceAccess对象,再次调用Set-AzureADApplication覆盖应用现有权限配置,直接替换掉之前添加的Microsoft Graph权限。

两个函数都只设置了全新的权限列表,没有保留应用已有的权限配置,导致后执行的操作会覆盖之前的权限。

若要实现权限共存,需修改函数逻辑:先获取应用当前的RequiredResourceAccess列表,检查目标权限是否已存在,若不存在则添加新条目,最后将更新后的完整列表传入Set-AzureADApplication。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 17:01:17