求优化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
相关产品推荐
相关产品推荐

