【问题标题】:XPath Query for Scheduled Task计划任务的 XPath 查询
【发布时间】:2012-04-02 15:22:13
【问题描述】:

我正在尝试创建一个 Windows 计划任务,以在每次特殊文件夹中的其他计划任务失败时通知我。为此,我使用自定义事件过滤器设置了一个计划任务,以使用触发器“在事件上”运行。

当计划任务的结果代码不是 0(即任务失败)时,我想执行一些操作(发送电子邮件)。为此,我将以下内容设置为我的自定义 XML/XPath:

<QueryList>
    <Query Id="0" Path="Microsoft-Windows-TaskScheduler/Operational">
        <Select Path="Microsoft-Windows-TaskScheduler/Operational">*[System[(EventID=201)]] and *[EventData[(Data[@Name="ResultCode"]!=0)]]</Select>
    </Query>
</QueryList>

*[System[(EventID=201)]] 检查事件日志的 EventID 是否为 201(操作已完成)。

*[EventData[(Data[@Name="ResultCode"]!=0)]] 检查结果代码是否为非 0(失败)

现在这是我的设置。我在 Windows 任务计划程序下的子文件夹中有一部分计划任务:

 -> Task Scheduler
     -> Task Scheduler Library
         -> XYZ
             -> Task 1
             -> Task 2
             -> ...

我只希望我的新通知任务在此 \XYZ\ 子文件夹下的任务失败时通知我。

这是一个来自 Windows 事件日志的示例 XML 输出,其任务名称为 \XYZ\TaskNameHere

<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
    <System>
        <Provider Name="Microsoft-Windows-TaskScheduler" Guid="{de7b24ea-73c8-4a09-985d-5bdadcfa9017}" />
        <EventID>201</EventID>
        <Version>0</Version>
        <Level>4</Level>
        <Task>201</Task>
        <Opcode>2</Opcode>
        <Keywords>0x8000000000000000</Keywords>
        <TimeCreated SystemTime="2012-04-02T13:51:41.708Z" />
        <EventRecordID>385206</EventRecordID>
        <Correlation ActivityID="{EC12AB2E-C049-4AF5-9FAB-4540F2B3AD83}" />
        <Execution ProcessID="2580" ThreadID="4960" />
        <Channel>Microsoft-Windows-TaskScheduler/Operational</Channel>
        <Computer>blah@whocares.com</Computer>
        <Security UserID="S-1-5-18" />
    </System>
    <EventData Name="ActionSuccess">
        <Data Name="TaskName">\XYZ\Task Name Here</Data>
        <Data Name="TaskInstanceId">{EC12AB2E-C049-4AF5-9FAB-4540F2B3AD83}</Data>
        <Data Name="ActionName">C:\SomeProgram.exe</Data>
        <Data Name="ResultCode">3762504530</Data>
    </EventData>
</Event>

这是我尝试过的 XPath,但它不起作用并给我一个解析错误。

<Select Path="Microsoft-Windows-TaskScheduler/Operational">*[System[(EventID=201)]] and *[EventData[(Data[@Name="ResultCode"]!=0)]] and *[EventData[(Data[@Name="TaskName" and contains(text(),'\XYZ\')])]]</Select>

有什么想法吗?

【问题讨论】:

  • 我在提供的 XML 上尝试了您的 XPath,它结构合理并返回“True”。您是否根据返回 1 或 0 而不是 True/False 来安排这些任务?如果是这样,您可以在 xpath 中添加一个 number() 换行。
  • 如果我的 XPath 返回 true,即 EventID=201 和 ResultCode != 0 并且 TaskName 以 \XYZ\ 开头,那么我想发送电子邮件
  • 对,我说我不相信它是您的 XPath,因为您所拥有的已经为给定的 XML 返回 True。所以我认为它与其他事情有关,可能是您为创建事件而检查的值。
  • 这是我尝试使用上述内容时得到的结果。 i43.tinypic.com/24qq0yq.jpg

标签: xpath windows-server-2008 scheduled-tasks


【解决方案1】:

此查询在 Windows 10 任务计划程序中运行良好。它侦听 my-task 正在完成 (EventID=201) 并检查 ResultCode。我有两个任务监听另一个任务的不同结果代码:=0 用于通过 powershell 消息框通知用户该任务已成功完成,!=0 用于报告错误。

<QueryList>
    <Query Id="0" Path="Microsoft-Windows-TaskScheduler/Operational">
        <Select Path="Microsoft-Windows-TaskScheduler/Operational">
*[System/EventID=201[EventData[Data[@Name='ResultCode']=0][Data[@Name='TaskName']='\my-task']]
    </Select>
</Query>
</QueryList>

【讨论】:

    【解决方案2】:

    以防万一有人想知道这回答了我的问题:

    http://msdn.microsoft.com/en-us/library/cc231312%28v=prot.10%29.aspx

    事实证明,Task Scheduler 并没有实现整个 XPath 功能,只是其中的一个子集。

    【讨论】:

      【解决方案3】:

      我认为这可以通过以下sn-p来实现。

          string queryString = "*[System/EventID=201] and *[EventData[(Data[@Name=\"ResultCode\"]=0)]]"; ;
          var query = new EventLogQuery("Microsoft-Windows-TaskScheduler/Operational", PathType.LogName, queryString);
         var reader = new EventLogReader(query);
      //read...
         var eventRec = reader.ReadEvent();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-07-20
        • 2021-04-19
        • 2011-02-25
        • 1970-01-01
        • 2011-05-22
        • 2011-01-22
        • 2019-06-06
        相关资源
        最近更新 更多