Windows-Aufgabenplanung - per schtasks.exe einen Task erstellen und abfragen

  • Hallo.

    Hat schon jemand Code geschrieben, um per Script einen Task in der Windows-Aufgabenplanung zu erstellen und würde den zur Verfügung stellen?

    Ich bin gerade dabei die Millionen Infos zum Thema "Task Scheduler" mühevoll durchzuackern, habe schon abenfüllende Möglichkeiten gefunden und finde es für meine Zwecke übertrieben.

    Derzeit schwebt mir eine einfachere Lösung mithilfe von schtasks.exe vor. Leider ist es innerhalb meines Scripts nicht gerade geschwätzig, was Fehlermeldungen angeht. Die meiste Zeit bringt es gar keine, und die andere Zeit findet man keine Angaben dazu. Deshalb ist es echt mühselig, das per Trail&Error herauszufinden und ich würde mich sehr freuen, wenn jemand seine Erkenntnisse dazu teilen mag.

    Der Code soll können: Einen neuen Task erstellen* und abfragen ob der Task existiert (/Query). Evtl. noch löschen oder ändern.

    *Task erstellen:

    - Mit höchsten Berechtigungen,

    - Trigger: Bei Anmeldung von User XY,

    - Aktionen: Programm XY starten.

    Hintergrund-Infos

    Mein Script dient zur Steuerung meiner täglichen Backups. Es ruft verschiedene Backup-Programme auf, von denen nur 1 Programm Admin-Rechte benötigt. Der ganze Vorgang soll jedoch "silent" ablaufen, also ohne dass man jedesmal (UAC-)Abfragen beantworten muss. Das lässt sich per Windows-Aufgabenplanung umsetzen.

    In meinem anderen Thread haben wir eine Lösung erarbeitet, bei der mein (kompiliertes) Script von der Win-Aufgabenplanung mit Admin-Rechten gestartet wird. Nun suche ich eine Möglichkeit, um mit einem Script einen Task in der Aufgabenplanung zu erstellen, anstatt das manuell zu machen.

    Wenn jemand sagt: "Das geht nicht!" Denke daran: Das sind seine Grenzen, nicht deine.

  • Schau Dir mal die beiden Task Planner UDFs im engl. Forum an: https://www.autoitscript.com/wiki/User_Defi…nctions#Windows

  • Derzeit schwebt mir eine einfachere Lösung mithilfe von schtasks.exe vor.

    Immer noch gesucht.

    Einiges konnte ich schon mit schtasks.exe umsetzen. Was noch fehlt ist ein Befehl, um einen Aufgaben-ORDNER zu löschen. Einen zum Löschen einer Aufgabe/Task habe ich schon. Kann da jemand weiterhelfen?

    Wenn jemand sagt: "Das geht nicht!" Denke daran: Das sind seine Grenzen, nicht deine.

  • Schau Dir mal die MS Doku an. TaskFolder.DeleteFolder dürfte ein möglicher Weg sein.
    Als Basis nimmst Du die UDFs die ich Dir verlinkt habe und schreibst Dir die DeleteFolder Funktion.
    Wenig Aufwand, schnelles Ergebnis.

  • Du würdest Dir viel leichter tun, wenn Du nicht auf einem vorgegebenen Lösungsweg bestehst (es genügt schon, wenn Du ein Problem zu lösen hast).
    Das schränkt nämlich die Menge der Lösungen unnötig ein. Und wer sagt denn, dass Du mit Deiner Vorgabe a) überhaupt und b) zu einer effizienten und effektiven Lösung kommst.

    Den größten Lerneffekt hat man, wenn man für möglichst viele Wege offen ist.
    Aber das muss ich Dir als Prof ja nicht sagen ;)

  • Die UDFs und die MS Doku benutzen Scripting Objects, ich suche aber einen Weg mit der schtasks.exe. :P

    Du bist mir hoffentlich nicht böse, dass ich Deinen Thread für einen Hinweis an andere interessierte Leser 'missbrauche' ;).

    Schau Dir mal die MS Doku an. TaskFolder.DeleteFolder dürfte ein möglicher Weg sein.
    Als Basis nimmst Du die UDFs die ich Dir verlinkt habe und schreibst Dir die DeleteFolder Funktion. Wenig Aufwand, schnelles Ergebnis.

    Ich beziehe mich auf die von water angegebene UDF des Users Allow2010 :

    Thread : Taskplaner/Taskscheduler COM UDF

    Aktueller Download : taskplanerCOM_5.4.zip  edited October 7, 2015 by Allow2010

    (da Links vergänglich sind, habe ich sie noch einmal angehängt)

    Ich habe die UDF nur überflogen, aber offenbar gibt es bereits eine DeleteFolder-Funktion :

    Spoiler anzeigen

    Auszug aus taskplanerCOM.au3 :

    Anmerkung :

    Im Startpost und in den Funktionsbeschreibungen weist Allow2010 darauf hin, dass er eine ältere Quelle verwendet hat :

    Based on: http://www.autoit.de/index.php?page=Thread&postID=214517#post214517 and on work from Veronesi

    Dieser Link funktioniert nicht mehr - gemeint ist aber wohl :

    TaskScheduler / Aufgabenplaner mittels ObjCreate("Schedule.Service") ansteuern

    Gruß Musashi

  • Hallo water,

    dein Meinung respektiere ich und verstehe, wenn du den leichten Weg bevorzugst. Wenn ich das wollte, hätte ich es einfach: Eine funktionierende Lösungen für mein Backup-Steuerscript habe ich schon. Dabei lege ich die Tasks der Win-Aufgabenplanung per Hand an. Nun will ich die Tasks per Script erstellen lassen, aber nicht (nur) um eine runde Lösung zu bekommen, sondern gerade weil ich etwas lernen will. Und weil es Spaß macht! :P

    Den größten Lerneffekt hat man, wenn man für möglichst viele Wege offen ist.

    Das hast du wahrscheinlich anders gemeint, aber wenn man es mal so sieht, ist doch derjenige für möglichst viele Wege offen, der außer den fertigen UDFs auch einen zusätzlichen Weg beschreitet. Und sei gewiss, schon bis hierhin hat für mich einen großen Lerneffekt gegeben, als ich mich mit schtasks.exe beschäftigt habe. :thumbup:

    Außer dem Spaß am Lernen und Programmieren sind weitere Faktoren gegen das Arbeiten mit Windows-Objekten, dass ich mit Windows Script(ing) Host nicht gerne arbeite. Und was die UDFs betrifft, da habe ich jetzt schon einige Fehler drin gefunden, was das Vertrauen nicht gerade stärkt.

    Meine bisherigen Lernerfolge beinhalten folgendes:

    - Funktionierenden Lösungen mit schtasks.exe für Create (nur einfach, mit Programm zum Ausführen und Privilegien), Query, Run, Change, Delete (Task). Diese funktionieren derzeit schon rudimentär, können aber leicht ausgebaut werden.

    - Das Anfordern von höheren Rechten während eines laufenden Scripts mit "normalen" Rechten.

    - Leichte Einblicke in die UAC und die entsprechenden Anforderungen an eigene Programme.

    - Die Erkenntnis, dass nicht jeder sich mit AsAdmin und AsInvoker auskennt, der das behauptet.

    Auch wenn ich manchmal meine eigenen Wege gehen will, sind deine Tipps sehr willkommen! Unzählige Male habe ich erfahren dürfen, dass die Tipps und Gedanken anderer mich auf neue Ideen gebracht haben. :thumbup:Vielleicht finden wir ja noch eine Lösung für DeleteFOLDER allein mit der schtasks.exe!?

    Wenn jemand sagt: "Das geht nicht!" Denke daran: Das sind seine Grenzen, nicht deine.

  • Du bist mir hoffentlich nicht böse, dass ich Deinen Thread für einen Hinweis an andere interessierte Leser 'missbrauche' ;) .

    Ich kann dir doch gar nicht böse sein! 8o

    Deine Links sind alle richtig.

    Das weiß ich, weil ich mich seit Tagen mit eben diesen Codes und Threads (und vielen mehr) beschäftige und den Autor "Allow2010" schon in beiden Foren angeschrieben habe. Eine Antwort gabe es leider noch nicht.

    Wenn jemand sagt: "Das geht nicht!" Denke daran: Das sind seine Grenzen, nicht deine.

  • Das hast du wahrscheinlich anders gemeint, aber wenn man es mal so sieht, ist doch derjenige für möglichst viele Wege offen, der außer den fertigen UDFs auch einen zusätzlichen Weg beschreitet.


    ....ich suche aber einen Weg mit der schtasks.exe.

    Ich meinte mit meinem Post, dass DU die möglichen Wege einschränkst, wenn Du auf einer Lösung mit schtasks bestehst.

    Anderes Thema:

    Zitat

    Und was die UDFs betrifft, da habe ich jetzt schon einige Fehler drin gefunden, was das Vertrauen nicht gerade stärkt.

    Welche Fehler hast Du gefunden? Ich denke, dass man mit wenig Aufwand die UDFs akutalisieren kann. Falls es sich im Rahmn hält, dann mache ich mich gerne dran.

  • Ich meinte mit meinem Post, dass DU die möglichen Wege einschränkst, wenn Du auf einer Lösung mit schtasks bestehst.

    Ich weiß. Und ich freue mich, dass du mir deine Meinung mitgeteilt hast! :thumbup:

    Welche Fehler hast Du gefunden? Ich denke, dass man mit wenig Aufwand die UDFs akutalisieren kann. Falls es sich im Rahmn hält, dann mache ich mich gerne dran.

    DAS Angebot weiß ich zu schätzen und nehme es gerne an!

    taskplanerCOM.au3

    Bisher bin ich über zwei Dinge gestolpert, das heißt, ich habe noch nicht nach weiteren Fehlern gesucht.

    Das eine ist die Funktion _TaskIsValidPlatfrom(). Zu finden ganz am Ende der Datei, Verwendung an vielen Stellen.

    Zitat

    Func _TaskIsValidPlatfrom()

    $autiotversionok = _VersionCompare(@AutoItVersion, "3.3.9.4") = 0

    If Not @error And @OSVersion = "WIN_XP" Or @OSVersion = "WIN_XPe" Or @OSVersion = "WIN_2000" And $autiotversionok <> -1 Then

    (Leider kriege ich es mit den Code-Formatierungen nicht hin so zu markieren. Deshalb als Zitat.)

    Abgesehen vom Buchstabendreher im Funktionsnamen sind meiner Meinung nach die Prüfungen nicht nur verwirrend, sondern auch falsch. Die rot markierten Stellen zeigen erst einen erzwungenen boolschen Wert, der dann auf <> -1 geprüft wird. Zudem glaube ich nicht, dass die Verkettung von "Not", "And", und "Or" tatsächlich so wirken, wie der Autor sich das vorgestellt hat.

    Das andere ist ganz oben im Code die Anweisung "#AutoIt3Wrapper_Res_requestedExecutionLevel=asInvoker". Das ist jetzt nicht als Fehler gemeint, sondern dass ich nicht genau weiß, was das bewirkt. Über "asInvoker" habe ich mich informiert, aber was ich gefunden habe, hat mich mehr verwirrt, als schlauer gemacht. Vielleicht kannst du da helfen?

    Wenn jemand sagt: "Das geht nicht!" Denke daran: Das sind seine Grenzen, nicht deine.

    Einmal editiert, zuletzt von Professor Bernd (22. August 2019 um 00:01)

  • Die UDF hat von mir eine Chance bekommen. Seit über 2 Stunden beschäftige ich mich damit, erfolglos! :( Der Autor hat sich vielleicht viel Mühe gegeben, aber leider ist das Ergebnis nicht benutzerfreundlich und ist scheinbar nur auf (s)eine Art von Tasks ausgelegt. An folgender einfachen Aufgabe bin ich gescheitert.

    Erstellen eines Tasks "MyTestTask1", "mit höchsten Berechtigungen ausführen", Aktion: Programm starten "E:\1\Test-IsAdmin.exe". Sonst nichts!

    Für alles andere sollen die Standard-Werte übernommen werden. Zum Ausführen des Scripts werden Adminrechte benötigt.

    Wenn jemand sagt: "Das geht nicht!" Denke daran: Das sind seine Grenzen, nicht deine.

    Einmal editiert, zuletzt von Professor Bernd (23. August 2019 um 19:26)

    1. Wie rufst Du die Funktion auf?
      Welche Fehlermeldungen, Returncodes, @error-Werte erhältst Du?
    2. Bis wann brauchst Du das?
      Ich bin gerade dran die UDF zu aktualisieren. TaskCreate ist gerade in Arbeit.
      Da die Windows 10 Aufgabensteuerung ein Art "Simple Aufgabe" Funktion enthält, möchte ich einen Wrapper dafür schreiben. Der sollte dann Deine Wünsche abdecken.
  • Das andere ist ganz oben im Code die Anweisung "#AutoIt3Wrapper_Res_requestedExecutionLevel=asInvoker". Das ist jetzt nicht als Fehler gemeint, sondern dass ich nicht genau weiß, was das bewirkt. Über "asInvoker" habe ich mich informiert, aber was ich gefunden habe, hat mich mehr verwirrt, als schlauer gemacht. Vielleicht kannst du da helfen?

    Da kenne ich mich auch zu wenig aus. Aber da das der Default-Wert ist, kann man die ganze Zeile ja einfach löschen :)

  • Aber da das der Default-Wert ist, kann man die ganze Zeile ja einfach löschen :)

    Stimmt, siehe List of compiler directives used by AutoIt3Wrapper.exe

    #AutoIt3Wrapper_res_requestedExecutionLevel=  

    mögliche Settings :

    asInvoker

    highestAvailable

    requireAdministrator

    None (remove the trustInfo section)

    -> Default is the setting from Aut2Exe (asInvoker)

    Professor Bernd -> auch interessant :

    What is the difference between "asInvoker" and "highestAvailable" execution levels ?

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

    2 Mal editiert, zuletzt von Musashi (23. August 2019 um 22:24)

  • Da kenne ich mich auch zu wenig aus. Aber da das der Default-Wert ist, kann man die ganze Zeile ja einfach löschen :)

    OK! :)

    Bis wann brauchst Du das? Och, ist nicht eilig, lass dir ruhig 'ne Stunde Zeit, oder 2! :P :ironie:

    Im Ernst, es ist NICHT eilig. Meine Backups laufen, also kein Problem. Das hier ist weils Spaß macht! (Und weil ich (meine) unfertige Scripts nicht mag.) ;)

    Wie rufst Du die Funktion auf?

    Also gekommen bin ich bis hierhin:

    Zitat

    ; _TaskCreate($TaskName, $TaskDescription, $TriggerEvent, $StartTrigger, $EndTrigger, $DaysOfWeek, $DaysOfMonth, $MonthOfYear, $WeeksOfMonth, $DaysInterval, $Interval, $RepetitionEnabled, $LogonType, $RunLevel, $Username, $Password, $Program, $WorkingDirectory = "", $Arguments = "", $RunOnlyIfNetworkAvailable = True, $active = True,$multiinst=0,$nobatstart=False,$stoponBat=False,$hidden = False, $idle = False, $WakeToRun=False,$timelimit="P1D",$priority = 5, $duration="")

    _TaskCreate("MyTestTask1", "", 0, "", "", 0, 0, 0, 0, 0, "", False, 3, 1, "", "", "E:\1\Test-IsAdmin.exe")

    Das hat aber nicht funktioniert.

    Dann habe ich einen "Einmal"-Task erstellt, mit Datum und Zeit in der Vergangenheit. (Ich will ja KEINE zeitgesteuerte Ausführung! Aber ohne die Angaben lässt sich per Script kein Task anlegen.) Dieser Workaround sieht dann so aus:

    Zitat

    _TaskCreate("MyTestTask1", "", 1, "2011-03-30T08:00:00", "", 0, 0, 0, 0, 0, "", False, 3, 1, "", "", "E:\1\Test-IsAdmin.exe")

    Das funktioniert hinsichtlich des Anlegen des Tasks. Da ich da aber viel geraten habe, was die Parameter betrifft, kann ich nicht sagen, obs hinsichtlich der Benutzung funktioniert (Task ausführen per Script), oder obs unbeabsichtige Dinge auslöst.

    ... Art "Simple Aufgabe" Funktion enthält, möchte ich einen Wrapper dafür schreiben. Der sollte dann Deine Wünsche abdecken.

    Da habe ich meine Bedenken. Das "Einfache Aufgabe erstellen" ist im Prinzip ein Wizard, der einen durch den Erstellungsvorgang zwingt. Dabei MUSS ein Trigger / Zeitplan erstellt werden, was ich nicht will. Besser ist die Funktion "Aufgabe erstellen". Damit kann ich das einstellen, was ich will.

    Hier ein paar Bilder, wie das manuelle Erstellen meiner Aufgabe aussieht.

    Wenn jemand sagt: "Das geht nicht!" Denke daran: Das sind seine Grenzen, nicht deine.

    3 Mal editiert, zuletzt von Professor Bernd (23. August 2019 um 22:49)

  • Derzeitige Idee ist, dass die vielen, vielen möglichen Parameter in mehrere Arrays ($aRegistration, $aSettings, $aPrincipal, $aTriggers, $aRepetition, $aActions) entsprechend dem Objekt-Modell aufgeteilt werden.

    In diese Arrays schreibt man dann die gewünschten Properties mit den Werten rein und übergibt sie an die Funktion.

    ==> Dies ist der offene Ansatz. Alles ist möglich, aber der Benutzer muss viel Wissen mitbringen.

    Der Wrapper-Ansatz deckt nur die Basis-Funktionen ab ("Einfache Aufgabe erstellen"). Prüft dafür aber die Richtigkeit und befüllt die oben beschriebenen Arrays.

    Dann wird die selbe Funktion aufgerufen um die Task zu erstellen.

    Soweit zur Idee.
    Mal sehen, wie es in der Umetzung dann ausieht ^^