任务计划程序仅针对特定任务在事件上运行

时间:2019-05-23 11:23:09

标签: windows powershell taskscheduler

我有一个触发电子邮件的Powershell脚本,并且我将其保存为EmailScript.PS1该脚本没有问题,它运行得很好)。我计划在每次事件登录时安排此脚本,例如:

Event ID:111    Description:Task terminated

无论何时触发所需事件,我都能成功计划此脚本。

但是,当前它考虑了在任务计划程序中运行的所有任务(例如,不是我的名为xyz的目标任务)。

我只想在为特定任务(不是所有任务)触发事件时计划基于事件的任务,但是在任务计划程序的“创建任务”选项卡中找不到此类过滤器/下拉列表。

任何建议/帮助将不胜感激。

2 个答案:

答案 0 :(得分:2)

我建议使用自定义XML事件过滤器来执行此操作,因为它为您提供了更大的灵活性来选择要触发的事件类型。

为此,请执行以下操作:

  • 转到“触发器”标签,然后单击“新建/编辑触发器”。
  • 开启开始任务部分,将类型更改为“发生事件”。
  • 单击“设置”部分下的自定义选项。
  • 单击“编辑事件过滤器...”按钮。
  • 转到“ XML”标签,然后在菜单底部,按“手动编辑查询”按钮。
  • 复制并粘贴以下XML,然后确定更改。

注意:确保将 TASK_NAME_HERE 替换为要触发其的任务的名称。此外,如果要在其他事件类型上触发,则可以用其他事件名称替换 TaskSuccessEvent

<QueryList>
  <Query Id="0" Path="Microsoft-Windows-TaskScheduler/Operational">
    <Select Path="Microsoft-Windows-TaskScheduler/Operational">*[EventData[@Name='TaskSuccessEvent'][Data[@Name='TaskName']='\TASK_NAME_HERE']]</Select>
  </Query>
</QueryList>

编辑:要匹配特定任务的多个事件ID,您可以执行以下操作:

<QueryList>
  <Query Id="0" Path="Microsoft-Windows-TaskScheduler/Operational">
    <Select Path="Microsoft-Windows-TaskScheduler/Operational">
        *[EventData[Data[@Name='TaskName']='\TASK_NAME_HERE']]
        and
        *[System[(EventID='102' or EventID='103')]]
        </Select>
  </Query>
</QueryList>

有关其他内容,请参见以下内容:https://blogs.technet.microsoft.com/askds/2011/09/26/advanced-xml-filtering-in-the-windows-event-viewer/

答案 1 :(得分:1)

您可以在事件日志中查询111事件ID的最新实例,然后从那里获取任务名称:

$event = Get-WinEvent -FilterHashtable @{Id=111;LogName='Microsoft-Windows-TaskScheduler/Operational'} -MaxEvents 1
$taskName = $event.Properties[0].Value

if($taskName -ne '\xyz'){
    # not the right task, abort
    exit
}