2012-04-02 10 views
3

Ich versuche, eine Windows geplante Aufgabe zu erstellen, um mich jedes Mal zu benachrichtigen, wenn eine andere geplante Aufgabe in einem speziellen Ordner fehlgeschlagen ist. Um dies zu tun, habe ich einen geplanten Task eingerichtet, der mit einem Trigger 'On a event' mit einem benutzerdefinierten Ereignisfilter ausgeführt wird.XPath-Abfrage für geplante Aufgabe

Ich möchte eine Aktion ausführen (eine E-Mail senden), wenn der Ergebniscode einer geplanten Aufgabe NICHT 0 ist (d. H. Die Aufgabe ist fehlgeschlagen). Um dies zu tun ich Setup die folgenden als meine benutzerdefinierte 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 * [System [(EventID = 201)]] überprüft, ob die Ereignis-ID des Ereignisprotokolls war 201 (Aktion abgeschlossen) .

Die * [Eventdata [(Data [@ Name = "Resultcode"]! = 0)]] überprüft, ob das Ergebnis Code nicht 0 (Failure) ist

jetzt Hier mein Setup ist. Ich habe eine Teilmenge der geplanten Tasks in einem Unterverzeichnis unter dem Windows-Taskplaner:

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

Ich möchte nur meine neue Benachrichtigung Aufgabe mich für Ausfälle von Aufgaben im Rahmen dieser \ XYZ \ Unterordner benachrichtigen. Hier

ist ein Beispiel XML-Ausgabe von den Windows-Ereignisprotokolle, die den Namen der Aufgabe \ 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> 

Hier haben die XPath Ich habe versucht, aber es funktioniert nicht und gibt mir ein Parse-Fehler .

<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> 

Irgendwelche Ideen?

+0

Ich habe versucht, Ihre XPath auf die bereitgestellten XML, es ist strukturell solide und zurückgegeben "True". Planen Sie diese Aufgaben basierend darauf, dass sie 1 oder 0 und nicht True/False zurückgeben? Sie könnten, falls ja, einen Zeilenumbruch() in den X-Pfad einfügen. – JWiley

+0

Wenn mein XPath true zurückgibt, ist das EventID = 201 und der ResultCode! = 0 und der TaskName beginnt mit \ XYZ \ dann möchte ich eine E-Mail senden –

+0

Richtig, und ich glaube nicht, dass es Ihr XPath ist , denn das, was Sie haben, gibt True bereits für das gegebene XML zurück. Ich denke also, dass es etwas anderes zu tun hat, möglicherweise den Wert, den Sie überprüfen, um das Ereignis zu erstellen. – JWiley

Antwort

0

Ich denke, das kann mit dem folgenden Ausschnitt erreicht werden.

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