我有一个计划任务,当应用程序发生某些事情时会发送电子邮件。现在我想在电子邮件中发送事件的消息详细信息。该怎么做?
在 Windows Server 2008 R2 中带有任务计划程序。
答案1
实现此目的的唯一方法是使用变通方法(在我看来)。您需要创建二为您的任务执行操作。步骤如下:
- 事件被触发
- 第一个操作是运行您感兴趣的事件详细信息的查询并将其保存到文件中。
- 第二步操作是将步骤2中保存的事件详情附加到电子邮件中并发送。
答案2
这不是实现它的唯一方法。实际上,至少在 Windows Server 2008 中,有一种更好的方法可以工作:
总而言之,您需要将任务定义导出为 xml,在文本编辑器中为所需数据添加一些 xpath 查询,更新命令行,然后将更新的任务定义导入回任务计划程序。
导出后打开 xml 文件并找到 <EventTrigger> 节点。
创建子节点 <ValueQueries>
<ValueQueries>
<Value name="EventID">Event/System/EventRecordID</Value>
<Value name="Channel">Event/System/Channel</Value>
</ValueQueries>
然后,您可以使用 $(EventID) 和 $(Channel) 在命令行中引用此值查询数据。从我的测试电子邮件事件来看,这些值无法正确替换。相反,您需要执行命令行。当然,您可以将 xpath 查询添加到事件中的任何数据,这些只是示例。
在将这些数据查询中的某些数据传递到命令行时,您可能还会遇到一些挑战(包括引号、斜杠等在内的各种字符可能会与命令解释器中的特殊字符冲突)。为了缓解这种情况,我已开始使用上面定义的两个参数,然后使用 wevtutil 检索剩余的事件数据:
wevtutil qe "$(Channel)" /q:"*[System[(EventREcordID=$(EventID)]]" /f:xml
然后,您可以对生成警报的事件记录的完整 xml 文本执行您想要的操作(例如发送电子邮件、解析 xml 等...)
例如,您可以在任务中定义以下操作以将事件 xml 写入磁盘:
<Exec>
<Command>powershell.exe</Command>
<Arguments>start-transcript -path C:\alertlog.log -append; add-content -path C:\output.txt -value (wevtutil qe "$(Channel)" /q:"*[System[(EventRecordID=$(EventID))]]" /f:xml); stop-transcript;</Arguments>
</Exec>
引用的博客文章对此进行了更详细的介绍。