XPath 查询用于计划任务

4
我正在尝试创建一个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吗?如果是这样,您可以将一个number()包装到xpath中。 - JWiley
如果我的XPath返回true,即EventID = 201且ResultCode!= 0且TaskName以\XYZ\开头,则我想发送电子邮件。 - Chris Sansone
没错,我认为这不是你的XPath的问题,因为你已经针对给定的XML返回了True。所以我认为问题可能出在其他地方,可能是你检查以创建事件的值。 - JWiley
当我尝试使用上述内容时,这是我得到的结果。http://i43.tinypic.com/24qq0yq.jpg - Chris Sansone
3个回答

4

2

这个查询在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>

0

我认为可以使用以下代码片段实现。

    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();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接