2012-04-02 126 views
3

我想創建一個Windows計劃任務來通知我每次在特殊文件夾中的其他計劃任務失敗。爲此,我設置了一個計劃任務,使用自定義事件過濾器在觸發器上運行「在事件上」。XPath查詢計劃任務

當計劃任務的結果代碼不是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> 

的* [系統[(事件ID = 201)]]查看是否在事件日誌的事件ID爲201(動作完成) 。

的* [EVENTDATA [(數據[@名稱= 「的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>[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

我試過你提供的XML上的XPath,它在結構上是合理的並且返回「True」。你計劃這些任務的基礎上返回1或0,而不是真/假?如果是的話,你可以添加一個數字()換行到xpath。 – JWiley 2012-04-02 16:43:07

+0

如果我的XPath返回true,即EventID = 201和ResultCode!= 0,並且TaskName以\ XYZ \開頭,那麼我想發送一封電子郵件 – 2012-04-02 18:41:07

+0

對,並且我說我不相信它是您的XPath ,因爲你已經爲給定的XML返回了True。所以我認爲它與其他事情有關,可能是你爲了創建事件而檢查的價值。 – JWiley 2012-04-02 19:23:01

回答

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