Azure自动化账户托管身份发邮件遇401未授权及AccessToken转换问题
问题排查与解决方案
一、Connect-MgGraph AccessToken类型转换错误
你遇到的Cannot convert the "eyJ0..." value of type "System.String" to type "System.Security.SecureString"错误,是因为-AccessToken参数要求传入SecureString类型,而$token.Token是普通字符串。解决方法:
- 将字符串令牌转换为SecureString:
# 获取令牌后转换类型 $token = Get-AzAccessToken -ResourceUrl "https://graph.microsoft.com" $secureToken = ConvertTo-SecureString $token.Token -AsPlainText -Force Connect-MgGraph -AccessToken $secureToken
二、邮件发送401 Unauthorized错误
邮件发送环节的401问题,结合Azure Automation场景,从以下几点排查:
1. 确认服务主体的权限配置
- 必须授予Microsoft Graph应用权限的
Mail.Send,且已完成管理员同意(委托权限在自动化场景无效)。 - 检查权限是否正确添加:在Azure AD的应用注册中,确认
Mail.Send权限类型为"应用权限",状态为"已授予管理员同意"。
2. 确保令牌包含正确的作用域
获取访问令牌时,要指定Microsoft Graph的资源URL,确保令牌包含Mail.Send权限:
# 正确指定Graph资源,获取包含对应权限的令牌 $token = Get-AzAccessToken -ResourceUrl "https://graph.microsoft.com"
3. 邮件发送的正确调用方式
服务主体没有自己的邮箱,发送邮件时需指定明确的发件人(需确保服务主体有权限代表该用户发送),或直接发送到目标邮箱。示例代码:
$mailParams = @{ Message = @{ Subject = " inactive用户报告" Body = @{ ContentType = "html" Content = $htmlReport } ToRecipients = @( @{ EmailAddress = @{ Address = "收件人邮箱@domain.com" } } ) } SaveToSentItems = $false } # 调用Graph API发送邮件 Send-MgUserMail -UserId "发件人邮箱@domain.com" -BodyParameter $mailParams
注:如果不需要指定发件人,也可以使用
Send-MgMail(需对应权限),但部分场景下Send-MgUserMail更稳定。
4. Azure Automation Run As账户配置检查
- 确认你使用的Azure Automation Run As账户对应的服务主体,就是已授予
Mail.Send权限的那个应用注册。 - 在自动化账户中,确认"连接"配置正确,脚本中正确获取Run As账户上下文:
$connectionName = "AzureRunAsConnection" $servicePrincipalConnection = Get-AutomationConnection -Name $connectionName Connect-AzAccount -ServicePrincipal -TenantId $servicePrincipalConnection.TenantId -ApplicationId $servicePrincipalConnection.ApplicationId -CertificateThumbprint $servicePrincipalConnection.CertificateThumbprint
内容的提问来源于stack exchange,提问作者Mycha
相关产品推荐
相关产品推荐

