![计划任务中的 PowerShell 脚本会在某些服务器上发送电子邮件,但不会在其他服务器上发送电子邮件](https://linux22.com/image/726607/%E8%AE%A1%E5%88%92%E4%BB%BB%E5%8A%A1%E4%B8%AD%E7%9A%84%20PowerShell%20%E8%84%9A%E6%9C%AC%E4%BC%9A%E5%9C%A8%E6%9F%90%E4%BA%9B%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%B8%8A%E5%8F%91%E9%80%81%E7%94%B5%E5%AD%90%E9%82%AE%E4%BB%B6%EF%BC%8C%E4%BD%86%E4%B8%8D%E4%BC%9A%E5%9C%A8%E5%85%B6%E4%BB%96%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%B8%8A%E5%8F%91%E9%80%81%E7%94%B5%E5%AD%90%E9%82%AE%E4%BB%B6.png)
希望有人能帮我理解一下,因为这有点让我头疼![我是新手,所以请温柔一点 :) ]
我最近设置了一个 PS 脚本,通过批处理文件在启动时由 Windows 计划任务运行,并使用 -ExecutionPolicy Bypass 开关运行。目的是将未运行的自动服务列表发送到我们的系统管理员分发列表,以便我们在必要时进行干预。
该任务已由 Group Policy Oject 部署到多台 Windows 2008、2008 R2 和 Windows 2012 R2 服务器上。该任务以最高权限的 SYSTEM 身份运行,我们的林/域在 Server 2012 R2 级别运行。该脚本从我们 SAN 上的 UNC 运行,并涉及将本地主机输出到 C:\temp(一个简单的 notepad.txt 文件)
这是脚本:[不可否认,我对 PowerShell 还很陌生,因此我从各处的各种文章中拼凑了一些脚本,并对其进行了反复修改,直到使它达到可接受的标准!]
#PowerScript task for reporting the name of any service with automatic startup mode that are not are running.
$Results = @()
$hst = hostname
$msgbdy = "This machine has restarted.
Check the attached file for any services with Automatic startup configuration that are not running.
[NB: Services configured to startup in Automatic (Delayed Start) are ignored]"
#GET AUTOMATIC (NOT DELAYED-START) SERVICES
$Results += Get-WmiObject -Class Win32_Service -Filter {State != 'Running' and StartMode = 'Auto'} |
ForEach-Object {Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\$($_.Name)" |
Where-Object {$_.Start -eq 2 -and $_.DelayedAutoStart -ne 1}} |
Select-Object -Property @{label='ServiceName';expression={$_.PSChildName}}
#OUTPUT TO TXT
$Results | Out-File "c:\temp\$hst.txt"
#PAUSE FOR 2 SECONDS
Start-Sleep -s 2
#SEND OUTPUT FILE BY EMAIL
send-mailmessage -from "[email protected]" -to "[email protected]" -subject "$hst Automatic Services Check" -Attachments "c:\temp\$hst.txt" -body $msgbdy -priority High -smtpServer server.ourdomain.co.uk
现在,如果直接在 PowerShell 提示符中运行脚本,它就会起作用;如果运行批处理文件来触发它,它就会起作用,就像使用计划任务一样;并且当作为计划任务触发时它会起作用......尽管事实证明这仅适用于我们大约 75% 的机器。
对于其他 25% 的用户,脚本中唯一不起作用的部分是 send-mailmessage 部分。文本文件在 C:\temp 中创建,其中包含“主机名”等,以识别它来自哪台机器,并且内容准确无误。他们只是不会完成工作并发送电子邮件报告(这可以说是整个练习的重点 :)
更令人沮丧的是,当我使用我的用户帐户登录到服务器桌面时,如果我通过直接运行批处理文件或 PowerShell 脚本来触发该过程,这些“问题机器”就会发送电子邮件,所以我知道他们有能力做到这一点!
任何帮助或花费的时间考虑都将不胜感激!
谢谢,詹姆斯
答案1
我似乎已经解决了这个问题。它既不需要身份验证,也不需要安全连接。我将问题缩小到 Exchange 2013 Server 日志中的错误“帐户‘DOMAIN\COMPUTER$’提供了有效的凭据,但它没有提交 SMTP 接收连接器‘Default Frontend MAILSERVER;身份验证失败。”。虽然服务器在 IP 范围内,但出于某种原因,只需勾选权限组/Exchange 用户复选框即可允许它。我不知道为什么只有部分服务器需要这样做,也不知道这有什么相关性,但它有效,这就足够了!我们的 Exchange 环境正在迁移中,目前相当混乱,所以答案就在那里。
感谢@Todd Wilcox 的指点。干杯