我有 2 个批处理文件,用于发送电子邮件以通知服务器关闭或启动。批处理文件使用单个参数(要发送的消息)调用 exe。该 exe 来自使用 system.net.mail 的 vb.net 程序。
批处理文件在命令提示符下正常工作,并接收到电子邮件。
现在我希望这些批处理文件在操作系统启动时和操作系统关闭时自动运行,而无需任何用户登录。
我尝试在 Win 8.1 机器上测试了这一点,我相信它应该与 Server 2012 R2 上的运行方式相同。如果这是一个错误的假设,请提出建议。
以下是我尝试的方法:
1)任务计划程序(但仅用于启动,没有关闭选项)
2)本地组策略编辑器 > 计算机配置 > Windows 设置 > 脚本(启动/关机)
在这两种情况下,设置似乎都很简单,但电子邮件从未发送。
有人可以给我提供一些我显然没有考虑过的考虑因素吗?
是权限问题吗?我怎么知道呢?
问题是“看上去是预定的但实际上不是”吗?
问题是批处理文件不能这样使用吗?
因为这是我第一次这样做,所以我很确定我遗漏了一些基本的东西。
答案1
由于下面提到的两个限制,这实际上不是一个答案,但是对于评论来说太长了,所以......
我做了简单测试,有以下两个缺点:
- 脚本不发送电子邮件。我需要我的 ISP 的 smtp 中继,但找到它太麻烦了。
- 我在 Win10 预览版上测试,而不是 Win8.1。今晚我只有这些了。
在里面Local Group Policy Editor > Computer Configuration > Windows Settings > Scripts (Startup/Shutdown)
,我在目录中放置了一个启动 powershell 脚本startup
,在目录中放置了一个关闭 powershell 脚本shutdown
。
我特别注意在Powershell Scripts
每个启动和关闭策略节点内的选项卡下添加脚本。
我确保我有一个名为的目录,c:\temp
因为我懒得将其编写成脚本。
我还通过运行以下命令确保允许运行 powershell 脚本:
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned
这是启动脚本:
if (!(Test-Path c:\temp\log.txt)) {New-Item -ItemType file -Path c:\temp\log.txt}
$timestamp = get-date
$string = "$timestamp UP!"
$string | Out-File -FilePath c:\temp\log.txt -Append -NoClobber
以下是关机脚本:
if (!(Test-Path c:\temp\log.txt)) {New-Item -ItemType file -Path c:\temp\log.txt}
$timestamp = get-date
$string = "$timestamp DOWN!"
$string | Out-File -FilePath c:\temp\log.txt -Append -NoClobber
然后我重启了电脑。以下是文件的内容c:\temp\log.txt
:
06/01/2015 00:07:45 DOWN!
06/01/2015 00:08:10 UP!
我希望它发送邮件能得到相同的结果,但是当然,除非真正尝试,否则无法确定。
答案2
研究和使用大家的评论和答案确实帮助我解决了问题,但有时真正的问题会有所不同。因此,我觉得有义务发布我遇到的实际问题,以防其他人遇到同样的“问题”。
在脚本测试期间似乎在我的 Win 8.1 机器上工作更方便;结果并非如此。我假定我的 Win 8.1 机器实际上与 Server 2012 R2 的工作方式完全相同;我的假设是错误的。
当我把所有东西都转移到我的 2012 R2 服务器后,脚本就一直完美地运行着。我无法解释为什么 Win 8.1 机器的反应不同,它就是如此。
所以我的解决方案是不再使用 Win 8 或 8.1 机器来测试启动/关闭脚本,只需在目标服务器上执行即可。
(抱歉回复晚了,我出城长途旅行了)
答案3
转到事件查看器,搜索登录和注销安全事件,右键单击它并为此事件添加发送电子邮件的任务。
这是最好的方法。