2012-04-02 6 views
3

Я пытаюсь создать запланированную задачу Windows, чтобы уведомить меня каждый раз, когда сработала какая-либо другая запланированная задача в специальной папке. Для этого я настроил запланированную задачу для запуска с помощью триггера «В случае события» с использованием фильтра пользовательских событий.XPath Query для запланированной задачи

Я хочу выполнить какое-либо действие (отправить электронное письмо), когда код результата запланированной задачи НЕ 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> 

The * [Система [(EVENTID = 201)]] проверяет, если EventID журнала событий было 201 (Выполнена) ,

The * [EventData [(Data [@ Name = "ResultCode"]! = 0)]] проверяет, если код результата НЕ был 0 (Failure)

Теперь Вот моя установка. У меня есть подмножество запланированных задач в подпапке под планировщиком задач Windows:

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

Я только хочу, чтобы моя новая задача уведомления, чтобы уведомить меня за отказы задач в рамках этой \ XYZ \ подпапка.

Вот выходной пример XML из журналов событий Windows, который будет иметь имя задачи \ 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>[email protected]</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> 

Любые идеи?

+0

Я пробовал ваш XPath на предоставленном XML, он структурно звучал и возвращался «True». Планируете ли вы эти задачи на основе возврата 1 или 0, а не True/False? Вы можете добавить обход числа() в xpath, если это так. – JWiley

+0

Если мой XPath возвращает true, то есть EventID = 201 и ResultCode! = 0, а TaskName начинается с \ XYZ \, тогда я хочу отправить электронное письмо –

+0

Право, и я говорю, что я не верю, что это ваш XPath , потому что то, что у вас есть, возвращает True уже для данного XML. Поэтому я думаю, что это связано с чем-то другим, возможно, значением, которое вы проверяете, чтобы создать событие. – JWiley

ответ

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