使用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
相关产品推荐
相关产品推荐

