使用 powershell 通过 MS Exchange 发送未经身份验证的邮件(Windows Server 2008 R2)

使用 powershell 通过 MS Exchange 发送未经身份验证的邮件(Windows Server 2008 R2)

我正在尝试使用任务计划程序运行 powershell 脚本并通过电子邮件发送一些命令的输出。我使用“Send-MailMessage”来执行此操作。当我使用域管理员帐户运行计划任务时,我可以正常收到电子邮件,但当我使用服务帐户时,电子邮件无法发送。

我使用的服务帐户既有“以服务登录”功能,也有“以批处理作业登录”功能。它还具有我运行此服务的服务器上的本地管理员权限。

需要注意的是:我曾使用 telnet 通过我正在使用的 SMTP 服务器发送电子邮件,并且能够发送未经身份验证的电子邮件,因此问题不是 SMTP 服务器的身份验证问题。

我在这个服务帐户上缺少什么凭证?我还可能缺少其他什么吗?

谢谢您的帮助!

答案1

telnet当您通过和提交电子邮件时选择不验证,服务器假定您是anonymous(又名知名的NT AUTHORITY\Anonymous logonS-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

相关内容