Das Programm wird nicht ordnungsgemäß als geplante Aufgabe ausgeführt

12

Situation

Ich habe ein Batch-Skript, das einige Dateien vorbereitet, ein Programm ( .exe) ausführt und diese Dateien dann löscht.

Diese Aufgabe sollte stündlich ausgeführt werden, daher versuche ich, dies mithilfe von geplanten Aufgaben zu konfigurieren. Das Problem ist, dass das zuvor erwähnte Programm .batbeim Aufrufen von der Task aus (weder über das Skript noch beim .exedirekten Aufrufen der ) nicht ordnungsgemäß ausgeführt wird , aber in den Protokollen keine Warn- oder Fehlermeldungen angezeigt werden.

Installieren

Der Task ist so konfiguriert, dass er als Windows-Dienstkonto ausgeführt wird, für das alle Berechtigungen ordnungsgemäß festgelegt wurden. Wenn ich mich mit diesem Konto über RDP anmelde, kann ich das .batund .exedirekt ohne Probleme ausführen , aber die Aufgabe scheint immer noch nichts zu tun. Dies ist leicht zu beobachten, da das Programm eine Datei immer ändert und sich der geänderte Zeitstempel während der Task nicht ändert.

In den geplanten Aufgabenprotokollen erhalte ich die Informationsmeldungen für die Aufgabe, die einen Prozess startet, beendet usw. Der "Ergebniscode" ist jedoch 111(versucht dies ohne Glück zu googeln, die einzige Zuordnung, die ich erhalte, ist "Dateiname ist zu lang ", was für AFAIK einfach völlig irrelevant ist). In den Anwendungsprotokollen bekomme ich absolut nichts.

Was ich vermute, ist das Problem

Das Programm ist eine alte Monstrosität, die eine Art Begrüßungsbildschirm erzeugt (es ist eigentlich ein normales Fenster), obwohl die GUI nicht benötigt wird, weil sie keine Interaktion erfordert und sich nach Operationen selbst schließt. Das Fenster wird ca. 2 Sekunden lang angezeigt.

Ich vermute, dass diese Anforderung für eine GUI etwas mit dem Fehlschlagen der Aufgabe zu tun hat, bin mir aber nicht sicher. Wenn ich mich mit dem Benutzer anmelde, unter dem die Aufgabe ausgeführt wird (über RDP), wird beim Starten der geplanten Aufgabe kein Fenster angezeigt.


Bearbeiten Sie über die GUI

Ich habe eine sehr kleine ausführbare C # -Datei erstellt, die das Programm ohne das Hauptfenster startet (mit ProcessStartInfo.WindowStyle = ProcessWindowStyle.Hidden). Auch auf diese Weise kann der geplante Task das Programm nicht ordnungsgemäß starten, der Rückkehrcode lautet jedoch jetzt 0.


Aktualisieren

Wenn ich die Task so konfiguriere, dass sie "Ausführen, ob der Benutzer angemeldet ist oder nicht" sagt und die run with highest privilegesOption deaktiviert ist , lautet der Fehlerwert 2147943859.


Was kann ich tun, um Fehler zu beheben?

Betriebssystem = Windows Server 2008 R2 SP1

Wenn weitere Informationen benötigt werden, lassen Sie es mich in den Kommentaren wissen.

MarioDS
quelle
Übernehmen Ihr Skript und "Programm" Eingaben wie Optionen oder Parameter? Haben Sie versucht, PowerShell anstelle von Batch zu verwenden? Wenn ein .exe"Programm" mit Parametern aus einem Skript heraus gestartet wird, muss die Eingabe ordnungsgemäß als Argument bereitgestellt werden.
Slybloty
1
Haben Sie den Scheduler mit einem anderen Programm ausprobiert? Ersetzen Sie einfach das eine Programm durch ein anderes und sehen Sie, welche Ergebnisse Sie erhalten.
Slybloty
2
@ out-null Ich glaube nicht, dass der Taskplaner das Fenster verwendet, um zu wissen, wann das Programm beendet ist. Er sollte auf den Prozess warten, was auch immer er mit Windows macht. Wenn das Programm jedoch versucht, nach etwas Bestimmtem zu suchen, um seinen Begrüßungsbildschirm (z. B. die Taskleiste) zu erstellen, und es nicht findet (weil es auf einer separaten Desktop- / Fensterstation ausgeführt wird), wird es möglicherweise angehalten ...
Ale
1
IN ORDNUNG. Haben Sie versucht, es unter dem LocalSystem-Konto auszuführen? Haben Sie auch versucht, das Prozessstartereignis mit Process Monitor von Sysinternals aus zu überwachen?
Lucky Luke
1
@BradBouchard Auch wenn Ihre Antwort die OPs-Frage in diesem speziellen Fall möglicherweise nicht löst , ist sie eine gültige Antwort und könnte für zukünftige Besucher von SF nützlich sein. Ich empfehle Ihnen daher, sie nicht zu löschen.
Ich sage Reinstate Monica

Antworten:

6

Ich glaube, Ihr Problem hat entweder mit den Berechtigungen des Kontos zu tun, mit dem die Aufgabe ausgeführt wird, oder mit dem Kontext des Kontos, der beim Ausführen der Aufgabe vorhanden ist.

Test für Konsolensitzungsanforderung

Möglicherweise muss Ihre .EXE-Datei in einer ConsoleSitzung (aka Sitzung 0) auf dem Computer ausgeführt werden. Um dies zu testen:

  1. Konfigurieren Sie die Aufgabe so, dass sie nur ausgeführt wird, wenn der Benutzer angemeldet ist, und geben Sie eine Startzeit für die Aufgabe von 2 Minuten in der Zukunft an
  2. Melden Sie sich mit demselben Benutzerkonto am Computer an, mit dem die Aufgabe ausgeführt wurde (melden Sie sich vorzugsweise an der Konsolensitzung an, indem Sie sich physisch an der Konsole befinden oder ein RAS-Programm verwenden, das den Zugriff auf die Konsole ermöglicht Konsolensitzung, über eine Eingabeaufforderung ausführen QWINSTA, beobachten Sie die SESSIONNAMESpalte und bestätigen Sie, dass der >Indikator neben steht console, mit anderen Worten, es sollte so aussehen >console)
  3. Warten Sie, bis die Task ausgeführt wird

Wenn die Aufgabe korrekt ausgeführt wird, versuchen Sie, die Aufgabe SCHTASKS.EXEmithilfe des /ITParameters zu planen . Andernfalls müssen Sie den Computer möglicherweise so konfigurieren, dass er sich automatisch als Dienstbenutzerkonto anmeldet und die Aufgabe als Startprogramm ausführt.

Überprüfen Sie die Berechtigungen

Überprüfen Sie außerdem, wie bereits vorgeschlagen, Folgendes, um sicherzustellen, dass das zum Ausführen der Aufgabe verwendete Konto über die erforderlichen Berechtigungen verfügt:

  1. Gewähren Sie dem Konto das Benutzerrecht " Anmelden als Batch-Job" (in der lokalen Gruppenrichtlinie unter Computer Configuration/Windows Settings/Security Settings/Local Policies/User Rights Assignments).
  2. Bestätigen Sie, dass die Aufgabe so konfiguriert ist, dass sie mit den höchsten Berechtigungen ausgeführt wird
  3. Stellen Sie sicher, dass der Benutzer über vollständige NTFS-Berechtigungen für alle Ordner und Dateien verfügt, mit denen er interagieren muss. Machen Sie keine Annahmen; Bestätigen Sie stattdessen, indem Sie zu diesen Speicherorten navigieren und die Effective PermissionsRegisterkarte in den Eigenschaften der Datei / des Ordners unter verwendenSecurity > Advanced

Zusätzliche Dinge zu überprüfen / versuchen

  • Benötigt die Aufgabe Zugriff auf Netzwerkressourcen? Dinge wie zugeordnete Laufwerke sind möglicherweise vorhanden, wenn Sie sich mit dem Benutzerkonto anmelden. Abhängig von der Serverkonfiguration sind sie jedoch möglicherweise nicht im Kontext des Benutzerkontos vorhanden, wenn sie über den Taskplaner ausgeführt werden.
  • Fügen Sie Ihrer Batch-Datei einige Protokolldateien hinzu. Lassen Sie das Programm nach jeder ausgeführten Zeile eine Ausgabe in eine Protokolldatei schreiben, damit Sie wissen, wo es hängen bleibt. Beispielsweise:

    @echo off
    echo Line 1 >> "C:\MyLog.txt"
    "C:\My Folder\myOldProgram.exe"
    echo Line 2 >> "C:\MyLog.txt"
    DEL somefile.dat
    echo Line 3 >> "C:\MyLog.txt"
    
  • Versuchen Sie , Ihren Lauf .EXE mit START, zum BeispielSTART "myTitle" "C:\full\path\to\my.EXE"

Ich sage Reinstate Monica
quelle
2

Ich antworte auf einen alten Beitrag, falls er jemand anderem hilft. Ich hatte das gleiche Problem. Das Ereignisprotokoll besagte, dass das Programm normal beendet wurde, aber nicht einmal die erste Codezeile würde für mich in das Protokoll schreiben. Es wurde die Option "Start In" im Taskplaner. Mir ist aufgefallen, dass das Programm über die Befehlszeile einwandfrei ausgeführt wird, wenn ich mich im aktuellen Verzeichnis befinde. Es gibt Manifestdateien und andere Abhängigkeiten in demselben Verzeichnis. Wenn Sie also den geplanten Job anweisen, im selben Verzeichnis wie die EXE zu starten, erhalten Sie möglicherweise günstige Ergebnisse. Es war die Lösung für mich.

Rob Wilson
quelle
Dies war die Lösung zum Ausführen einer in Visual Studio entwickelten benutzerdefinierten Konsolenanwendung mit unterstützenden Konfigurationsdateien.
billfredtom
1

Vielleicht hilft dir das?

/programming/6939548/a-workaround-for-the-fact-that-a-scheduled-task-in-windows-and-auser-to-be

Wir hatten ein ähnliches Problem und Ihre einzige Lösung war, dass wir mit Autologin ein spezielles Konto auf dem Server eingerichtet haben. Wenn die Aufgabe also unter dem bereits angemeldeten Benutzer lief, hat unsere .exe gut funktioniert ...

Ich weiß, das ist keine sehr schöne Lösung, aber für uns war es das einzige, was funktioniert hat. Ich weiß nicht, ob das für dich funktioniert ... (Aber bei dieser Arbeit musst du überprüfen, ob der Benutzer wirklich die ganze Zeit eingeloggt ist ...)

frupfrup
quelle
Die Aufgabe wird für mich nicht einmal richtig ausgeführt, wenn der Benutzer, unter dem sie ausgeführt wird, tatsächlich angemeldet ist (über RDP). Ich benutze das Dienstkonto, um mich über RDP anzumelden, starte die Aufgabe manuell und sehe kein Fenster.
MarioDS
2
Haben Sie die Option "Mit höchsten Berechtigungen ausführen" deaktiviert? Ich denke, dass, wenn Sie diese Option aktiviert haben, eine Freigabe der Rechte (UAC) erfolgt und Sie kein Fenster sehen, auch wenn der Benutzer angemeldet ist (wird in einer separaten Sitzung ohne Fenster aufgerufen und schlägt fehl). Versuchen Sie auch, die Option "konfiguriert für" -> "Windows Server 2003, Windows XP oder Windows 2000" auszuwählen.
Frupfrup
Das scheint keinen Unterschied zu machen, außer wenn ich jetzt "Ausführen, ob der Benutzer angemeldet ist oder nicht" einstelle, erhalte ich den Fehlercode 2147943859. Ich kann "Konfiguriert für" nur auf entweder Windows Vista/Windows Server 2008oder einstellen Windows 7/Windows Server 2008 R2. Es scheint keinen Unterschied zu machen.
MarioDS
in Ordnung. ein letzter test: erstelle eine neue aufgabe mit "neue aufgabe erstellen" anstatt "einfache aufgabe erstellen" (ich weiß nicht, welcher text wirklich angezeigt wird - meine server sind deutsch - aber ich hoffe du weißt was ich meine) und dann Ich denke, Sie können "Windows Server 2003, ..." auswählen. und dann versuchen Sie es bitte noch einmal mit den anderen Optionen ...
Frupfrup
1

Die Mitarbeiter des Unternehmens, das die Server unserer Kunden betreibt, gaben an, dass ein GUI-Programm in keiner Weise über geplante Tasks ausgeführt werden würde.

Sie verwenden ein Überwachungssystem mit Aufgabenplanungsfunktionen. Sie haben es dadurch eingerichtet und es scheint zu funktionieren.

Es tut mir leid, dass ich hier keine Gelegenheit hatte, weitere Vorschläge zu bewerten, aber danke, dass Sie trotzdem versucht haben, mir zu helfen. Ich hoffe, dass es in Zukunft anderen helfen kann, was ich sicher denke.

MarioDS
quelle
1

Ich habe versucht, ein altes VB6-Programm mit dem Taskplaner auf einem Windows 2008 R2-Server zu starten. Die Anwendung würde von der EXE-Datei aus über eine Batch-Datei oder durch Klicken auf eine Verknüpfung ausgeführt, jedoch nicht über den Taskplaner. Ich habe festgestellt, dass die Konfigurationsdateien für die Anwendung, die im Anwendungsordner im Verzeichnis C: \ program files (x86) gespeichert waren, in den Anwendungsordner unter c: \ programdata kopiert wurden. Der Scheduler funktionierte. Anscheinend wendet cmd.exe die Konfiguration von einem anderen Speicherort als vom Taskplaner verwendet an. Wenn Ihre Anwendung Konfigurationsdateien enthält, können Sie versuchen, diese in den Ordner c: \ programdata \ application zu verschieben.

Kasa
quelle
0

Verweisen Sie auf zugeordnete Netzlaufwerke in Ihrem Skript oder Programm? Ich hatte vor einiger Zeit ein ähnliches Problem, bei dem meine geplante Aufgabe nicht ausgeführt werden konnte, und ich konnte nicht herausfinden, warum. Das Ändern der Pfade in UNC-Pfade hat es für mich gelöst.

Wechseln Sie T:\Apps\MyProgram.exezu\\MyServer\MyShare\Apps\MyProgram.exe

AdamsTips
quelle
Nein, das Programm befindet sich auf dem lokalen C:Laufwerk.
MarioDS
0

Wenn ich die Task so konfiguriere, dass "Ausführen, ob der Benutzer angemeldet ist oder nicht" und die Option "Ausführen mit den höchsten Berechtigungen" deaktiviert ist, lautet der Fehlerwert 2147943859.

2147943859 in Hex konvertiert ist 800705b3. Eine kurze Reise zu Google besagt, dass das Installationsprogramm auf dem Computer nicht gestartet werden konnte. Für diesen Vorgang ist eine interaktive Fensterstation erforderlich.

Es gibt vielleicht eine Möglichkeit, es interaktiv laufen zu lassen, ohne PSEXEC (von Sysinternals) zu verwenden, aber da ich bereits weiß, wie man es über PSEXEC macht, würde ich es verwenden.

PSExec: http://technet.microsoft.com/en-us/sysinternals/bb897553.aspx

Ändern Sie daher Ihre Aktion, um alles mit psexec.exe -i (und -h, wenn Sie es mit erhöhten Rechten benötigen) voranzustellen, und es sollte funktionieren.

Ich habe dies unter Windows Server 2008 R2 SP1 mit den folgenden Aktionen versucht:

c:\windows\system32\cmd.exe

und dann die Parameter:

/c psexec.exe -h -i notepad.exe

Wenn ich die Aufgabe manuell ausführe (da ich keinen Zeitplan habe), wird in meiner aktuellen Sitzung ein Notizblock mit erhöhten Rechten ausgeführt.

Mark Allen
quelle
0

Vielleicht hilft die Antwort auf diese Frage jemandem, der diesen Thread liest?

/programming/32589381/

Zusammenfassung: Geplante Windows 2012-Aufgaben sehen nicht die richtigen Umgebungsvariablen, auch nicht PATHfür das Konto, unter dem die Aufgabe ausgeführt werden soll.

Ich habe das alles ziemlich lange durchgelesen, bevor ich das oben Genannte herausgefunden habe. (Was mein eigenes Problem war, das zur selben Frage wie die OP führte.)

Sobald Sie dies (endlich!) Wissen, ist es ziemlich einfach, es zu testen (gemäß der Stackoverflow-Antwort), zu beobachten, wie es passiert, und es zu umgehen.

Mike Beaton
quelle