如何使用 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 ,以防止應用程式代表使用者傳送電子郵件。
  • 精細控制: 將新增和移除權限合併到同一個指令碼中,以便有效率地管理。

發表留言