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

adi*_*s12 6 powershell exchange-2010 windows-server-2008-r2

我正在尝试使用任务计划程序运行一个 powershell 脚本并通过电子邮件发送一些命令的输出。我正在使用“Send-MailMessage”来做到这一点。当我使用域管理员帐户运行计划任务时,我可以很好地收到电子邮件,但是当我使用服务帐户时,电子邮件不会通过。

我使用的服务帐户同时具有“作为服务登录”和“作为批处理作业登录”。它还在我运行它的服务器上具有本地管理员权限。

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

我在此服务帐户上缺少哪些凭据?还有什么我可能会错过的吗?

谢谢您的帮助!

Mat*_*sen 10

当您通过 提交电子邮件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 <ceo@example.com>" -from "Me <advis12@example.com>" -subject "It's working! EOM" -credential $anonCredentials
Run Code Online (Sandbox Code Playgroud)

现在您的脚本也在匿名发送邮件:-)


另一个(更安全)选项是为相关服务帐户提供接收连接器所需的权限

$RC = Get-ReceiveConnector "ConnectorNameGoesHere" 
$RC | Add-ADPermission -User "DOMAIN\ServiceAcc01" -ExtendedRights ms-Exch-SMTP-Submit,ms-Exch-SMTP-Accept-Authoritative-Domain-Sender
Run Code Online (Sandbox Code Playgroud)

如果您需要传输可能被内容过滤等删除的文件,您还可以允许它绕过反垃圾邮件机制:

$RC | Add-ADPermission -User "DOMAIN\ServiceAcc01" -ExtendedRights ms-Exch-Bypass-Anti-Spam
Run Code Online (Sandbox Code Playgroud)

如果您希望它向您自己的 Exchange 组织之外的收件人发送电子邮件,您还需要允许:

$RC | Add-ADPermission -User "DOMAIN\ServiceAcc01" -ExtendedRights ms-Exch-SMTP-Accept-Any-Recipient
Run Code Online (Sandbox Code Playgroud)