使用 Powershell 脚本远程发送电子邮件的问题 - Server 2012 R2

使用 Powershell 脚本远程发送电子邮件的问题 - Server 2012 R2

当我们使用 Powershell 中的 Invoke-Command 命令手动触发另一个系统上的远程计划任务时遇到问题。

情况如下:服务器 XXX 有一个计划任务,运行 Powershell 脚本。在该脚本中,在某个时刻,它会触发以下代码行:Invoke-Command -Computer "SLMTL-WSUS01.XXX.inc" -ScriptBlock {schtasks /run /tn "Windows Update - Email Reporting"}。调用的计划任务只是调用另一个 Powershell 脚本,该脚本从 HTML 文件获取内容,然后通过电子邮件发送。

问题出在这里:当通过命令调用计划任务时Invoke-Command,任务的 Powershell 脚本会运行,但不发送电子邮件。如果我手动运行任务,它会正常工作并发送电子邮件。如果这很重要,两个计划任务都以 SYSTEM 身份运行。

我们之所以这样远程执行此操作,是因为我们不想允许多台服务器在内部发送电子邮件,而希望将其限制为一台服务器。

有人知道为什么会发生这种情况吗?

提前致谢!


编辑:这是格式正确的脚本:

    $Content = Get-Content "\\slmtl-wsus01.XXX.inc\Update_Reports\*.html"
$messageParameters = @{                         
                Subject = "Windows Update report - $((Get-Date).ToShortDateString())"                         
                Body = $Content | Out-String
                from = "[email protected]"                   
                To = "[email protected]"                     
                SmtpServer = "smtp.XXX.com"                          
            }                         
            Send-MailMessage @messageParameters -BodyAsHtml 

答案1

您应该将您的命令包装在 try/catch 中以记录错误。

try {
    Send-MailMessage ..... -ErrorAction Stop
} 
catch {
    AddContent $Error[0].Exception.Message -Path "C:\Log.txt"
}

ErrorAction Stop 将允许您捕获任何非终止错误。

答案2

我在尝试使用 Cory 的方法(由于某种原因,产生了零日志文件)解决问题时找到了这个问题。

在我的原始脚本中,运行后Invoke-Command -Computer "SLMTL-WSUS01.XXX.inc" -ScriptBlock {schtasks /run /tn "Windows Update - Email Reporting"},我得到了以下命令:Move-Item "\\slmtl-wsus01.XXX.inc\Update_Reports\*.html" "\\slmtl-wsus01.XXX.inc\Update_Reports\ARCHIVE" 在我的脑海中,该Invoke-Command .....命令将等待实际的远程脚本终止,然后再继续执行 Move-Item 脚本……但它没有。因此,当我的主脚本移走文件夹的内容时,远程脚本正在尝试获取不再存在的所述内容,因此不会发送电子邮件。

再次,我的脚本编写能力因我的理解不足而受阻,一天的时间就浪费在这上面了:P

相关内容