tresha
Goto Top

Powershell Skript zur Aufgabenüberwachung

Hallo Leute,

Ich versuche ein Skript zu schreiben, der eine bestimmte selbstgeschriebene Aufgabe überwacht und mir bei einer Störung eine E-Mail schickt. Mein Problem ist aber, dass die Event-ID 102 von vielen anderen Aufgaben ebenfalls benutzt wird. Also kriege ich die Aufgabe schwierig gefiltert. Ich bin auf dem Stand, dass man die Aufgaben nicht nach Namen filtern kann. (Korrigiert mich falls ich falsch liege)
Ich habe momentan 2 verschiedene Wege, wo jeweils eine Information meinerseits fehlt.
Der Prozess soll so ablaufen:

Aufgabe startet z.B. um 10:00 Uhr und ist um 10:05 fertig.
Skript soll um 10:15 Uhr in dem Ereignisprotokoll danach suchen.

Wenn Problem dann schick mir eine E-Mail mit Fehlerbeschreibung.
Wenn Erfolgreich dann schick mir auch eine E-Mail.


Meine Ansätze:
1) Einfachste und beste Variante (meiner Meinung nach)
$date = get-date -format d
$event = get-eventlog -LogName Microsoft-Windows-TaskScheduler/Operational -InstanceId 102 -after "$date" | sort TimeWritten | format-list EntryType, EventID, Source, Message  
    $PCName = $env:COMPUTERNAME
    $EmailBody = $event | format-list -property * | out-string
    $EmailFrom = "$PCameN <XXXXXXX@XXXX.de>"  
    $EmailTo = "XXXXXX@XXXX.de"   
    $EmailSubject = "New Event Log [Application]"  
    $SMTPServer = "XXXXX.XXXX.XXX"  
    Write-Host "Sending Email"  
    write-host $EmailBody 
    #Send-MailMessage -From $EmailFrom -To $EmailTo -Subject $EmailSubject -body $EmailBody -SmtpServer $SMTPServer
Allerdings kommt hier die Meldung bei der Message:
Die Beschreibung für Ereignis-ID 102 in Quelle Microsoft-Windows-TaskScheduler wurde nicht gefunden. Der lokale Computer hat möglicherweise nicht die notwendigen Registrierungsinformationen oder Meldungs-DLL-Dateien, um die Meldung anzuzeigen, oder Sie sind nicht berechtigt, darauf zuzugreifen. Die folgenden Informationen sind Teil des Ereignisses:'\Microsoft\Windows\Windows Error Reporting\QueueReporting', 'NT-AUTORITÄT\SYSTEM'

Auch wenn ich das Skript von sich selbst aus schauen lasse ob`s Adminrechte hat und falls nicht, neustartet, funktioniert dies nicht.

2) Alle Logs der letzten 10min
$date = get-date -format t
$date.AddMinutes(-10)
$event = get-eventlog -LogName Microsoft-Windows-TaskScheduler/Operational -InstanceId 102 -after "$date" | sort TimeWritten | format-list EntryType, EventID, Source, Message  

Habe hier mal den Rest rausgelassen..

Hat wer einen Vorschlag?

PS: Bin neu hier und hoffe auf eine gute Community! face-smile

Content-Key: 324091

Url: https://administrator.de/contentid/324091

Ausgedruckt am: 29.03.2024 um 12:03 Uhr

Mitglied: 131381
Lösung 131381 16.12.2016 aktualisiert um 14:25:03 Uhr
Goto Top
Hier wird dir geholfen. Einfach per XPath abfragen..., Task-Trigger dran feddich.
Aufgabenplanungs-Ergebnis abfragen

Gruß
Mitglied: colinardo
Lösung colinardo 19.12.2016 aktualisiert um 19:01:06 Uhr
Goto Top
Servus @tresha, willkommen auf Administrator.de!
ich würde dir ebenfalls den Tipp von @131381 ans Herz legen. Dann wird dein Skript sofort automatisch nach der Ausführung durch den Aufgabenplaner getriggert mit Übergabe des Result-Codes.

Ich habe dir mal einen Task-Trigger als XML exportiert der das demonstriert.
(Hinweise dazu weiter unten)

<?xml version="1.0" encoding="UTF-16"?>  
<Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">  
  <RegistrationInfo />
  <Triggers>
    <EventTrigger>
      <Enabled>true</Enabled>
      <Subscription>&lt;QueryList&gt;&lt;Query Id="0" Path="Microsoft-Windows-TaskScheduler/Operational"&gt;&lt;Select Path="Microsoft-Windows-TaskScheduler/Operational"&gt;*[System[(Level=4 or Level=0) and (EventID=201)] and EventData[Data[@Name="TaskName"]="\MeinTestTask"]]&lt;/Select&gt;&lt;/Query&gt;&lt;/QueryList&gt;</Subscription>  
      <ValueQueries>
        <Value name="ResultCode">Event/EventData/Data[@Name='ResultCode']</Value>  
      </ValueQueries>
    </EventTrigger>
  </Triggers>
  <Principals>
    <Principal id="Author">  
      <UserId>S-1-5-18</UserId>
      <RunLevel>LeastPrivilege</RunLevel>
    </Principal>
  </Principals>
  <Settings>
    <MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>
    <DisallowStartIfOnBatteries>true</DisallowStartIfOnBatteries>
    <StopIfGoingOnBatteries>true</StopIfGoingOnBatteries>
    <AllowHardTerminate>true</AllowHardTerminate>
    <StartWhenAvailable>false</StartWhenAvailable>
    <RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable>
    <IdleSettings>
      <StopOnIdleEnd>true</StopOnIdleEnd>
      <RestartOnIdle>false</RestartOnIdle>
    </IdleSettings>
    <AllowStartOnDemand>true</AllowStartOnDemand>
    <Enabled>true</Enabled>
    <Hidden>false</Hidden>
    <RunOnlyIfIdle>false</RunOnlyIfIdle>
    <WakeToRun>false</WakeToRun>
    <ExecutionTimeLimit>P3D</ExecutionTimeLimit>
    <Priority>7</Priority>
  </Settings>
  <Actions Context="Author">  
    <Exec>
      <Command>powershell</Command>
      <Arguments>-Command "Send-MailMessage -From "sender@domain.de" -to "empfänger@domain.de" -Subject 'Statusmeldung zum Task' -body 'Der Task wurde mit dem ExitCode: $(ResultCode) abgeschlossen.' -SmtpServer 'smtp.domain.de' -Credential (New-Object PSCredential('USERNAME',(ConvertTo-SecureString 'PASSW=RD' -AsPlainText -Force))) -UseSSL"</Arguments>  
    </Exec>
  </Actions>
</Task>

Du musst in dieser Zeile
<Subscription>&lt;QueryList&gt;&lt;Query Id="0" Path="Microsoft-Windows-TaskScheduler/Operational"&gt;&lt;Select Path="Microsoft-Windows-TaskScheduler/Operational"&gt;*[System[(Level=4 or Level=0) and (EventID=201)] and EventData[Data[@Name="TaskName"]="\MeinTestTask"]]&lt;/Select&gt;&lt;/Query&gt;&lt;/QueryList&gt;</Subscription>  
das \MeinTestTask durch den Pfadnamen deines Tasks den du überwachen willst ersetzen.

In Zeile 41 steht die Aktion welche ausgeführt wird. In diesem Fall wird Ein PowerShell-Command mit Send-MailMessage direkt in den Taskplaner geschrieben. Wenn du es verwenden willst passe die Parameter an deine Vorlieben an. Dort kannst du natürlich stattdessen auch den Aufruf eines Powershell-Skriptes hinterlegen.

Das XML-File kannst du direkt in den Taskplaner importieren:

screenshot

und dann nach belieben weiter bearbeiten.

Die zusätzliche Anpassung die ich an der XML-Datei vorgenommen habe ist die Variable welche aus dem Task direkt abgefragt und an die Aktion übergeben werden kann.
<ValueQueries>
        <Value name="ResultCode">Event/EventData/Data[@Name='ResultCode']</Value>
</ValueQueries>
Hier wird der ResultCode für den Task verfügbar gemacht. Den Wert kannst du dann in der Aktion des Tasks mittels $(ResultCode) verwenden, wovon ich unten in meiner Aktion auch Gebrauch mache.

Weitere Informationen dazu kannst du in meinen Beiträgen hier nachlesen:

Grüße Uwe