Beschreibungen zu Ergebnissen der letzten Ausführung bei Aufgaben unter Windows, oder die bessere Aufgabenplanung-Übersicht!


Windows 10 setzt immer mehr auf die Aufgabenplanung. Oft hat man einen Ergebniswert am Bildschirm unter der Spalte “Ergebnis der letzten Ausführung” und fragt sich dann, wie das zu seinen Powershellergebnissen passt, welche mittels der Eigenschaft LastTaskResult vom Get-ScheduledTaskInfo seinen Wert als dezimale Zahl liefert. Das Problem liegt darin, dass der Ergebniswert am Bildschirm als Hexwert angegeben wird. Damit kämpft man dann immer im Kopf ob die beiden Werte zueinander passen. Um die Sache etwas einfacher zu gestalten kann man diesen Aufruf verwenden:

"0x{0:x}" -f (Get-ScheduledTask -TaskName "Schedule Scan"|Get-ScheduledTaskInfo).lasttaskresult

Damit wird der Wert von LastTaskResult Hexadezimal ausgegeben.

Stellt sich die Frage, welche Werte gibt es überlicherweise und welche Bedeutung haben Sie beim Aufgabenplaner? So kann man alle bekannten Werte ermitteln:

(Get-ScheduledTask|Get-ScheduledTaskInfo).lasttaskresult|select -Unique| % {"0x{0:x}" -f $_ }

Auf einem frischen Windows 10 v1709 ergibt dies:

0x41303
0x0
0x80090030
0x800710e0
0x800f0950
0x41301
0x80070005
0x80070057
0x420

Unten eine Tabelle der Dezimalen- und Hexadezimalen-Werte sowie deren Beschreibung aus der Spalte “Ergebnis der letzten Ausführung”. Wichtig zu beachten, wenn man den Hexwert in Dezimal wandelt, bekommt man bei den 0x80000000 und höheren Werten einen Überlauf und dadurch negative Zahlen, welche dann nicht mehr mit LastTaskResult übereinstimmen, da LastTaskResult vom Typ UInt32 ist. Um die korrekten Werte zu bekommen kann man 0x entfernen und den restlichen Hexadezimalen-Wert über diese Funktion wandeln lassen:

[int64]::Parse("0x80070002".Replace("0x",“), ‚Hexnumber‘)

oder einfacher:

[UInt32]"0x80070002"

LastTaskResult (UInt32) Hexadezimal Beschreibung aus “Ergebnis der letzten Ausführung”
0 0x0 Der Vorgang wurde erfolgreich beendet. (0x0)
267011 0x41303 Die Aufgabe wurde noch nicht ausgeführt. (0x41303)
2148073520 0x80090030 Das Gerät, das von diesem kryptografischen Anbieter angefordert wird, kann nicht verwendet werden. (0x80090030)
2147946720 0x800710E0 Die Anforderung wurde vom Operator oder Administrator zurückgewiesen. (0x800710E0)
2148469072 0x800F0950 (0x800F0950)
267009 0x41301 Die Aufgabe wird momentan ausgeführt. (0x41301)
2147942405 0x80070005 Zugriff verweigert (0x80070005)
2147942487 0x80070057 Falscher Parameter. (0x80070057)
1056 0x420 (0x420)
2147942402 0x80070002 Das System kann die angegebene Datei nicht finden. (0x80070002)
2147746132 0x80040154 Klasse nicht registriert (0x80040154)
268435456 0x10000000 (0x10000000)
259 0x103 (0x103)
1 0x1 (0x1)
2147943467 0x8007042B Der Prozess wurde unerwartet beendet. (0x8007042B)
2147943140 0x800702E4 Der angeforderte Vorgang erfordert erhöhte Rechte. (0x800702E4)
2379777 0x245001 (0x245001)
     

Wenn in obiger Tabelle ein Wert fehlt, der könnte hier mit samt Erklärung fündig werden: https://msdn.microsoft.com/en-us/library/windows/desktop/aa383604.

Da ich mir jetzt schon die Mühe gemacht habe, das alles zusammenzutragen, dann kann ich auch noch gleich eine Funktion daraus basteln:

Function Get-ScheduledTaskLastRunResultText ([UInt32]$LastRunResult) {
  Switch ($LastRunResult) {
     0          {"Der Vorgang wurde erfolgreich beendet. (0x0)"}
     267011     {"Die Aufgabe wurde noch nicht ausgeführt. (0x41303)"}
     2148073520 {"Das Gerät, das von diesem kryptografischen Anbieter angefordert wird, kann nicht verwendet werden. (0x80090030)"}
     2147946720 {"Die Anforderung wurde vom Operator oder Administrator zurückgewiesen. (0x800710E0)"}
     2148469072 {"(0x800F0950)"}
     267009     {"Die Aufgabe wird momentan ausgeführt. (0x41301)"}
     2147942405 {"Zugriff verweigert (0x80070005)"}
     2147942487 {"Falscher Parameter. (0x80070057)"}
     1056       {"(0x420)"}
     2147942402 {"Das System kann die angegebene Datei nicht finden. (0x80070002)"}
     2147746132 {"Klasse nicht registriert (0x80040154)"}
     268435456  {"(0x10000000)"}
     259        {"(0x103)"}
     1          {"(0x1)"}
     2147943467 {"Der Prozess wurde unerwartet beendet. (0x8007042B)"}
     2147943140 {"Der angeforderte Vorgang erfordert erhöhte Rechte. (0x800702E4)"}
     2379777    {"(0x245001)"}
     Default {"Unknown LastRunResult: $LastRunResult"}
  }
}

Dadurch kann man nun mittels Aufruf von

Get-ScheduledTaskLastRunResultText -LastRunResult 267011

der Text

Die Aufgabe wurde noch nicht ausgeführt. (0x41303)

erhalten werden.

Will man einen hexadezimalen Wert übergeben, dann sollte dies in folgender Form erfolgen:

Get-ScheduledTaskLastRunResultText -LastRunResult ([UInt32]’0x800710E0′)

Wichtig sind die Anführungsstriche bei der Hexadezimalzahl!! Beim Aufruf von dieser Zeile, erhält man eine Fehlermeldung:

Get-ScheduledTaskLastRunResultText -LastRunResult ([UInt32]0x800710E0)
Der Wert "-2147020576" kann nicht in den Typ "System.UInt32" konvertiert werden. Fehler: "Der Wert für einen UInt32
war zu groß oder zu klein."
In Zeile:1 Zeichen:1
+ Get-ScheduledTaskLastRunResultText -LastRunResult ([UInt32]0x800710E0 …
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvalidCastIConvertible

Also Vorsicht! Bei Verwendung von Hexadezimalzahlen und UINT32!

So aber nun zum Abschluss noch was sinnvolles mit der Funktion Get-ScheduledTaskLastRunResultText. Was mich schon immer an der Aufgabenplanung gestört hat, das man nicht einfach eine Ansicht ohne Gruppierungen hat, wo einfach in einer Tabelle alles dargestellt wird. Nun dies ist jetzt mit diesem Aufruf möglich:

Get-ScheduledTask | Select Taskname, @{Name="LastTaskResult";E={Get-ScheduledTaskLastRunResultText (Get-ScheduledTaskInfo $_).LastTaskResult}}  | Out-GridView

Ich denke das Prinzip ist nun klar. Also machen wir nun die große Lösung:

Get-ScheduledTask | Select Taskname, State, @{Name="LastTaskResult";E={Get-
ScheduledTaskLastRunResultText (Get-ScheduledTaskInfo $_).LastTaskResult}}, @{Name="LastRunTime";E={(Get-ScheduledTas
kInfo $_).LastRunTime}}, @{Name="NextRunTime";E={(Get-ScheduledTaskInfo $_).NextRunTime}}, TaskPath  | Out-GridView

Bang! Da geht der Rechner zwar kurz in die Knie aber es sind auf einen Schlag alle wichtigen Informationen verfügbar um schnell einen Überblick zu bekommen. Vor allem kann man nun endlich Suchen und nach Spalten sortieren!

Advertisements

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden /  Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden /  Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden /  Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden /  Ändern )

Verbinde mit %s


%d Bloggern gefällt das: