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

求优化PowerShell脚本:移除应用注册的委派API权限

优化移除应用注册委派API权限的PowerShell脚本

我需要编写PowerShell脚本遍历所有应用注册,移除其中所有委派API权限,保留应用程序权限。之前的脚本在仅存委派权限时用PATCH请求清空requiredResourceAccess,存在应用程序权限时用Update-MgApplication保留,但想找更高效、统一的实现方式。

优化后的脚本

function Remove-DelegatedApiPermissions {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory)]
        [Guid]$TenantId
    )

    # 连接Microsoft Graph
    $requiredScopes = @(
        "Application.ReadWrite.All",
        "DelegatedPermissionGrant.ReadWrite.All",
        "ServicePrincipal.Read.All"
    )
    Connect-MgGraph -Scopes $requiredScopes -TenantId $TenantId -ErrorAction Stop

    try {
        # 获取所有应用注册,直接加载RequiredResourceAccess属性避免重复调用
        $apps = Get-MgApplication -All -Property Id, DisplayName, AppId, RequiredResourceAccess

        foreach ($app in $apps) {
            Write-Host "正在处理应用: $($app.DisplayName)" -ForegroundColor Cyan

            # 撤销已授予的委派权限同意
            $oauthGrants = Get-MgOauth2PermissionGrant -Filter "clientId eq '$($app.Id)'"
            if ($oauthGrants) {
                foreach ($grant in $oauthGrants) {
                    Write-Host " - 撤销委派权限同意: $($grant.Scope)"
                    Remove-MgOauth2PermissionGrant -Oauth2PermissionGrantId $grant.Id -ErrorAction SilentlyContinue
                }
            }

            # 处理应用注册中的权限声明
            if ($app.RequiredResourceAccess) {
                # 遍历每个资源的权限,过滤保留应用程序权限(Role类型)
                $updatedResourceAccess = $app.RequiredResourceAccess | ForEach-Object {
                    $filteredPermissions = $_.ResourceAccess | Where-Object { $_.Type -eq 'Role' }
                    if ($filteredPermissions) {
                        # 保留该资源的应用程序权限
                        $_ | Select-Object ResourceAppId, @{Name='ResourceAccess'; Expression={$filteredPermissions}}
                    }
                }

                if ($updatedResourceAccess) {
                    # 更新应用注册,保留剩余的应用程序权限
                    Update-MgApplication -ApplicationId $app.Id -RequiredResourceAccess $updatedResourceAccess
                    $remainingCount = ($updatedResourceAccess.ResourceAccess | Measure-Object).Count
                    Write-Host " - 应用保留 $remainingCount 个应用程序权限" -ForegroundColor Green
                }
                else {
                    # 没有剩余权限,清空RequiredResourceAccess
                    Update-MgApplication -ApplicationId $app.Id -RequiredResourceAccess @()
                    Write-Host " - 应用已无权限,清空权限声明" -ForegroundColor Green
                }
            }
            else {
                Write-Host " - 应用无API权限声明" -ForegroundColor Gray
            }
        }
    }
    catch {
        Write-Error "处理过程中出错: $_"
    }
    finally {
        # 断开Graph连接
        Disconnect-MgGraph -ErrorAction SilentlyContinue
    }
}

# 主执行
$TenantId = "你的租户ID"
Remove-DelegatedApiPermissions -TenantId $TenantId

核心优化点

  • 减少API调用次数:首次获取应用时直接指定RequiredResourceAccess属性,避免循环内重复调用Get-MgApplication
  • 统一使用MG PowerShell命令:无需混合调用Invoke-MgGraphRequest,Update-MgApplication支持直接传入空数组清空权限声明
  • 支持多资源权限处理:遍历所有RequiredResourceAccess条目,不会遗漏其他第三方API的权限处理
  • 简化权限撤销逻辑:直接通过clientId过滤Oauth2PermissionGrant,无需先查询服务主体
  • 添加错误处理:用try/catch/finally确保异常可捕获,且最终会断开Graph连接
  • 更清晰的状态输出:用不同颜色区分执行状态,便于快速查看结果

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 19:22:43