我正在尝试使用任务计划程序运行 powershell 脚本并通过电子邮件发送一些命令的输出。我使用“Send-MailMessage”来执行此操作。当我使用域管理员帐户运行计划任务时,我可以正常收到电子邮件,但当我使用服务帐户时,电子邮件无法发送。
我使用的服务帐户既有“以服务登录”功能,也有“以批处理作业登录”功能。它还具有我运行此服务的服务器上的本地管理员权限。
需要注意的是:我曾使用 telnet 通过我正在使用的 SMTP 服务器发送电子邮件,并且能够发送未经身份验证的电子邮件,因此问题不是 SMTP 服务器的身份验证问题。
我在这个服务帐户上缺少什么凭证?我还可能缺少其他什么吗?
谢谢您的帮助!
答案1
telnet
当您通过和提交电子邮件时选择不验证,服务器假定您是anonymous
(又名知名的NT AUTHORITY\Anonymous logon
或S-1-5-7
)。
什么时候Send-MailMessage
提交电子邮件时,它将始终尝试验证会话。如果未指定一组凭据,它将假定使用当前用户的网络凭据,并以运行 PowerShell 脚本的服务帐户进行身份验证。
该服务帐户既不是匿名帐户,也不是 Exchange 用户或 Exchange 组织管理员,因此不允许提交电子邮件。
为了解决这个问题,你需要一个PSCredential
目的:
$anonUsername = "anonymous"
$anonPassword = ConvertTo-SecureString -String "anonymous" -AsPlainText -Force
$anonCredentials = New-Object System.Management.Automation.PSCredential($anonUsername,$anonPassword)
Send-MailMessage -to "Big Boss <[email protected]>" -from "Me <[email protected]>" -subject "It's working! EOM" -credential $anonCredentials
现在你的脚本也可以匿名发送邮件了:-)
另一个(更安全的)选项是向相关服务帐户提供所需的权限在接收连接器上:
$RC = Get-ReceiveConnector "ConnectorNameGoesHere"
$RC | Add-ADPermission -User "DOMAIN\ServiceAcc01" -ExtendedRights ms-Exch-SMTP-Submit,ms-Exch-SMTP-Accept-Authoritative-Domain-Sender
如果您需要传输可能被内容过滤或类似程序删除的文件,您也可以允许它绕过反垃圾邮件机制:
$RC | Add-ADPermission -User "DOMAIN\ServiceAcc01" -ExtendedRights ms-Exch-Bypass-Anti-Spam
如果你想让它向收件人发送电子邮件外部您自己的 Exchange 组织您也需要允许这样做:
$RC | Add-ADPermission -User "DOMAIN\ServiceAcc01" -ExtendedRights ms-Exch-SMTP-Accept-Any-Recipient