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 Graphoffline_access权限的RequiredResourceAccess对象,通过Set-AzureADApplication将应用的权限配置完全替换为这个新对象。 - 运行
Add-User-Impersonation时,函数同样创建仅包含Azure Service ManagementUser Impersonation权限的RequiredResourceAccess对象,再次调用Set-AzureADApplication覆盖应用现有权限配置,直接替换掉之前添加的Microsoft Graph权限。
两个函数都只设置了全新的权限列表,没有保留应用已有的权限配置,导致后执行的操作会覆盖之前的权限。
若要实现权限共存,需修改函数逻辑:先获取应用当前的RequiredResourceAccess列表,检查目标权限是否已存在,若不存在则添加新条目,最后将更新后的完整列表传入Set-AzureADApplication。
内容的提问来源于stack exchange,提问作者Harry
相关产品推荐
相关产品推荐

