如何使用 PowerShell 添加或删除委托的已同意权限

在 Microsoft 环境中管理应用程序的委派权限是管理员的一项关键任务。本指南提供了一个 Microsoft Graph PowerShell 脚本 ,可帮助你以更精细的粒度和更强的控制力添加或删除委派权限。


为什么要修改委派权限?

委派权限允许应用程序代表已登录用户行事。不过,在某些情况下,你可能需要调整这些权限:

  • 出于安全考虑,删除不必要或过多的权限。
  • 添加应用程序功能所需的新权限。
  • 排查 API 访问问题。

注意: 这里提供的脚本可以精细地控制权限,非常适合高级场景。


PowerShell 脚本:添加或删除委派权限

下面是管理委派权限的完整 PowerShell 脚本:

配置部分

# CONFIGURATION

# Application ID of app
$appId= "YOUR_APP_ID"

# Uncomment below line if you want to modify user consent
# $UserId = [email protected]

# Microsoft Graph App ID (DO NOT CHANGE)
# AAD Graph App Id: "00000002-0000-0000-c000-000000000000"
# MS Graph App Id: "00000003-0000-0000-c000-000000000000"
$resourceId= "00000003-0000-0000-c000-000000000000"

# Delegated Permissions you want on this service principal
$AddPermissions = @(
    "User.Read"
)

$RemovePermissions = @(
    "Mail.Send",
    "Group.ReadWrite.All"
)

主脚本

# Connect to Microsoft Graph PowerShell
Connect-MgGraph -Scopes "Directory.Read.All DelegatedPermissionGrant.ReadWrite.All"

$appPrincipal = Get-MgServicePrincipal -Filter "appId eq '$($appId)'"
$ResourceServicePrincipal = Get-MgServicePrincipal -Filter "appId eq '$($resourceId)'"
$UserPrincipal = Get-MgUser -UserId $UserId

# Find grant if one already exists
if($UserId) {
    $grants = Get-MgOauth2PermissionGrant -Filter "clientId eq '$($appPrincipal.id)' and resourceId eq '$($ResourceServicePrincipal.id)' and principalId eq '$($UserPrincipal.id)'"
} else {
    $grants = Get-MgOauth2PermissionGrant -Filter "clientId eq '$($appPrincipal.id)' and resourceId eq '$($ResourceServicePrincipal.id)'"
}

# Update existing grant
$RemovePermissions += $AddPermissions
foreach($grant in $grants) {
    # Remove permissions from grant
    foreach($permission in $RemovePermissions) {
        Write-Host "Removing: $($permission)"
        # Remove permission from grant
        $grant.scope = $grant.scope.Replace($permission, "")
    }

    # Add permissions to grant
    foreach($permission in $AddPermissions) {
        $grant.scope += $permission + " "
    }

    # Update existing Grant
    Update-MgOauth2PermissionGrant -Oauth2PermissionGrantId $grant.id -Scope $grant.scope.Trim()
}

# Create grant if none exists
if(!$grants) {
    $ScopeString = $AddPermissions -join " "
    if($UserId) {
        New-MgOauth2PermissionGrant -ClientId $appPrincipal.id -ResourceId $ResourceServicePrincipal.id -Scope $ScopeString -ConsentType Principal -PrincipalId $UserPrincipal.id
    } else {
        New-MgOauth2PermissionGrant -ClientId $appPrincipal.id -ResourceId $ResourceServicePrincipal.id -Scope $ScopeString -ConsentType AllPrincipals
    }
}

管理员注意事项

  1. 前提条件:
    • 安装最新版本的 Microsoft Graph PowerShell SDK.
    • 确保你拥有管理委派权限所需的权限(Directory.Read.All 和 DelegatedPermissionGrant.ReadWrite.All).
  2. 自定义脚本:
    • 将 YOUR_APP_ID 替换为要管理的应用的应用程序 ID。
    • 修改 $AddPermissions 和 $RemovePermissions 数组,以包含你要添加或删除的权限。
  3. 用户权限与应用程序权限:
    • 如果要修改特定用户的权限,请取消注释并将 $UserId 设置为该用户的电子邮件地址。
    • 如果要管理所有用户的权限,请让 $UserId 保持注释状态。
  4. 测试脚本:
    • 在生产环境中运行脚本之前,请先在非生产环境中测试,以确保其按预期工作。

示例用例

  • 添加权限: 添加 User.Read ,以允许应用访问基本用户个人资料信息。
  • 删除权限: 删除 Mail.Send ,以防止应用代表用户发送电子邮件。
  • 精细控制: 将添加和删除权限合并到一个脚本中,以便高效管理。

发表评论