任务调度程序-运行 仅针对特定任务的事件
Task scheduler-run on event for a specific task only
我有一个触发电子邮件的 powershell 脚本,我已将其保存为 EmailScript.PS1
(脚本没有问题,运行正常)。我计划在有事件登录时安排此脚本,例如:
Event ID:111 Description:Task terminated
每当触发所需事件时,我都能成功安排此脚本。
但是,目前它考虑了任务调度程序中 运行 中的所有任务(例如,不是我名为 xyz
的目标任务)。
我想仅在针对特定任务(不是所有任务)触发事件时安排此基于事件的任务,但在任务计划程序创建任务选项卡中找不到这样的 filter/dropdown。
任何 suggestions/help 将不胜感激。
您可以在事件日志中查询 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
}
我建议使用自定义 XML 事件过滤器来执行此操作,因为它可以让您更灵活地 select 触发哪种事件。
为此,请执行以下操作:
- 转到触发器选项卡并单击新建/编辑触发器。
- 在 开始任务 部分将类型更改为在事件上。
- 单击“设置”部分下的自定义选项。
- 单击“编辑事件过滤器...”按钮。
- 转到 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/
我有一个触发电子邮件的 powershell 脚本,我已将其保存为 EmailScript.PS1
(脚本没有问题,运行正常)。我计划在有事件登录时安排此脚本,例如:
Event ID:111 Description:Task terminated
每当触发所需事件时,我都能成功安排此脚本。
但是,目前它考虑了任务调度程序中 运行 中的所有任务(例如,不是我名为 xyz
的目标任务)。
我想仅在针对特定任务(不是所有任务)触发事件时安排此基于事件的任务,但在任务计划程序创建任务选项卡中找不到这样的 filter/dropdown。
任何 suggestions/help 将不胜感激。
您可以在事件日志中查询 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
}
我建议使用自定义 XML 事件过滤器来执行此操作,因为它可以让您更灵活地 select 触发哪种事件。
为此,请执行以下操作:
- 转到触发器选项卡并单击新建/编辑触发器。
- 在 开始任务 部分将类型更改为在事件上。
- 单击“设置”部分下的自定义选项。
- 单击“编辑事件过滤器...”按钮。
- 转到 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/