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

使用Azure PowerShell创建带密钥的Azure AD应用时添加Mail.Send权限

解决Azure AD应用自动化添加Mail.Send权限及令牌生成问题

核心问题解决步骤

1. 添加Mail.Send应用权限到Azure AD应用

要给应用添加Microsoft Graph的Mail.Send应用权限,需先获取Graph服务主体,再更新应用的权限配置。在你的脚本中插入以下代码:

# 获取Microsoft Graph服务主体
$graphSp = Get-AzADServicePrincipal -Filter "displayName eq 'Microsoft Graph'"

# 构建Mail.Send应用权限对象(Type为Role对应应用权限,Scope对应委托权限)
$requiredResourceAccess = @(
    @{
        ResourceAppId = $graphSp.AppId
        ResourceAccess = @(
            @{
                Id = $permissionId # 你的Mail.Send权限ID
                Type = "Role"
            }
        )
    }
)

# 更新Azure AD应用的权限配置
Set-AzADApplication -ApplicationId $app.ApplicationId -RequiredResourceAccess $requiredResourceAccess

2. 显式授予管理员同意

应用权限不会自动获得管理员同意,必须手动执行授权操作。先获取应用对应的服务主体,再完成权限分配:

# 获取当前应用对应的服务主体
$appSp = Get-AzADServicePrincipal -Filter "appId eq '$($app.ApplicationId)'"

# 授予管理员同意(需Application Administrator或Global Administrator权限)
New-AzADServicePrincipalAppRoleAssignment `
    -ObjectId $appSp.Id `
    -PrincipalId $appSp.Id `
    -ResourceId $graphSp.Id `
    -Id $permissionId

3. 完整整合后的脚本

将上述步骤整合到原有脚本中,确保权限配置完成后再请求令牌:

Connect-AzAccount

$appName = "MyTestingApp"
$app = New-AzADApplication -DisplayName $appName -IdentifierUris "https://myapp.com"

$secret = New-AzADAppCredential -ApplicationId $app.ApplicationId -EndDate (Get-Date).AddYears(1)

$permissionId = "a0e0c2c0-6b4c-4c98-bcd8-15e7995d8f2b"  # Mail.Send应用权限ID

# 添加Mail.Send应用权限
$graphSp = Get-AzADServicePrincipal -Filter "displayName eq 'Microsoft Graph'"
$requiredResourceAccess = @(
    @{
        ResourceAppId = $graphSp.AppId
        ResourceAccess = @(
            @{
                Id = $permissionId
                Type = "Role"
            }
        )
    }
)
Set-AzADApplication -ApplicationId $app.ApplicationId -RequiredResourceAccess $requiredResourceAccess

# 授予管理员同意
$appSp = Get-AzADServicePrincipal -Filter "appId eq '$($app.ApplicationId)'"
New-AzADServicePrincipalAppRoleAssignment `
    -ObjectId $appSp.Id `
    -PrincipalId $appSp.Id `
    -ResourceId $graphSp.Id `
    -Id $permissionId

# 生成令牌
$tenantId = (Get-AzContext).Tenant.Id # 从当前上下文获取租户ID,避免硬编码
$clientId = $app.ApplicationId
$clientSecret = $secret.SecretText
$tokenUrl = "https://login.microsoftonline.com/$tenantId/oauth2/v2.0/token"

$body = @{
    client_id     = $clientId
    client_secret = $clientSecret
    scope         = "https://graph.microsoft.com/.default"
    grant_type    = "client_credentials"
}

$response = Invoke-RestMethod -Method Post -Uri $tokenUrl -ContentType "application/x-www-form-urlencoded" -Body $body
$token = $response.access_token

关键注意事项

  • 执行脚本的账号必须拥有Application Administrator或Global Administrator权限,否则无法完成管理员同意操作。
  • 确认$permissionId对应的是应用权限而非委托权限(你提供的ID确实是Mail.Send的应用权限ID)。
  • 令牌请求中的scope使用https://graph.microsoft.com/.default会自动包含所有已授予的应用权限,无需单独指定。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 01:52:40