Laden...

Programm über Windows Aufgabenplanung ausführen

Erstellt von IncepTer vor 5 Jahren Letzter Beitrag vor 5 Jahren 1.792 Views
I
IncepTer Themenstarter:in
24 Beiträge seit 2016
vor 5 Jahren
Programm über Windows Aufgabenplanung ausführen

Hallo Freunde,

ich habe eine kleine Applikation, welche in verschiedenen Ordner die Daten zählen (Art und Größe) und danach die darin befindlichen Daten und Ordner löschen soll.
Dabei werden zwei Parameter übergeben, welche die Ordner und die "Art" der Löschung spezifiziert.

Zur Protokollierung soll nach jedem Löschvorgang die Größe und das Datum in eine Textdatei geschrieben werden. Beispiel:

223MB | 13.10.2018

Dies soll regelmäßig durchgeführt werden und somit wollte ich die Windows Aufgabenplanung nutzen.
Wird die Anwendung durch die Planung ausgeführt, funktioniert auch alles, nur das eben keine Log-Datei erstellt wird.

Der/die Ordner werden aber gesäubert und das Programm läuft sauber durch. (Parameter werden selbstverständlich mit übergeben).
Starte ich das Programm direkt über die Console, dann klappt alles und der Log wird erstellt.

Dabei habe ich in der Aufgabenplanung mit verschiedenen Einstellungen gespielt. Von "Unabhängig der Benutzeranmeldung ausführen" bis "Mit höchsten Privilegien ausführen" wurde alles mal getestet. Auch wird kein Fehler als Ergebnis in der Aufgabenplanung angezeigt.

Vielleicht habt ihr ja eine Idee, wieso kein Log erzeugt wird, sondern nur die Ordner gesäubert werden.

Danke

16.834 Beiträge seit 2008
vor 5 Jahren

Ich vermute, dass der ausführende Nutzer des Tasks keine Berechtigung für den Ordner der Logs hat.
Dafür spricht auch, dass es Du die Anwendung via "Unabhängig der Benutzeranmeldung ausführen" ausführst. Darüber hinaus hat "Mit höchsten Privilegien ausführen" i.d.R. nicht unbedingt was mit Berechtigungen auf Verzeichnisse zutun.

Aber leider verheimlichst Du, wie Du die Logs schreibst - daher können wir hier alle nur raten.
Kann auch an zig anderen Dingen liegen, wie Current Directory oder oder oder oder...

I
IncepTer Themenstarter:in
24 Beiträge seit 2016
vor 5 Jahren

Zum testen habe ich das auf dem Desktop des aktuellen Benutzers getestet.
Also da Unterordner erstellt und eben die eigentlich Aufgabe simuliert, um den/die Fehler einzugrenzen. Der Log soll im aktuellen Ordner erstellt werden, wo das Programm auch liegt. Die Erstellung soll per StreamWriter erfolgen:

            
string D_Log = Directory.GetCurrentDirectory();

using (StreamWriter writetext = new StreamWriter(D_Log + "\\stats.txt", append: true))
{
     writetext.WriteLine(zahler_durchgaenge + "|" + zaehler_bytes + "|" + DateTime.Now);
}

Somit dürfte die Berechtigung hier keine Rolle spielen, oder?

Vielleicht habe ich auch nur irgendwo den Denkfehler drin, weil ich schon zu lange daran sitze 😄

16.834 Beiträge seit 2008
vor 5 Jahren

Zum testen habe ich das auf dem Desktop des aktuellen Benutzers getestet.

Ein Task ohne hinterlegten Benutzer hat keine Berechtigung auf den Desktop.
Das wäre quasi ein Zugriff auf ein geschütztes Verzeichnis.

Prinzipiell baut man Pfade nicht mit String-Fricklei zusammen, sondern mit Path.Combine().
Warum Du einen StreamWriter nimmst und kein File.Append ist mir nicht klar; würde zumindest den Code deutlich vereinfachen.

Directory.GetCurrentDirectory() wird sehr wahrscheinlich nicht das Verzeichnis sein, das Du denkst.
Directory.GetCurrentDirectory() ist im Task Scheduler nicht das Verzeichnis, in dem die Applikation liegt, sondern das Verzeichnis, das der Task Scheduler als default für Ausführungen verwendet; das könnte C:\Windows\System32 sein. Es heisst ja auch nicht ApplicationDirectory sondern CurrentDirctory.
Ausser Du setzt aktiv das Working Directory (im Task als "Start in (optional)").

Es ist aber ohnehin nicht gerade eine gute Idee Logs dort abzulegen, wo die Applikation liegt.
Applikationen liegen i.d.R. unter Program files und dort hat ein normaler Benutzer keine Schreibrechte.

Deswegen gibt es unter Windows auch die Environment.SpecialFolder Enumeration.
In Deinem Fall wäre wahrscheinlich

var dir = Path.Combine(Environment.GetFolderPath(Environment.CommonApplicationData), "MyAppName", "Logs");

ein passendes Verzeihnis.
Die Logs würden dann bei aktuellen Windows Versionen unter C:\ProgramData\MyAppName\Logs liegen.

I
IncepTer Themenstarter:in
24 Beiträge seit 2016
vor 5 Jahren

Danke für die Hinweise.

Stimmt, daran hatte ich gar nicht gedacht, dass CurrentDirectory sich auf die Task-App bezieht und somit ein ganz anderes Verzeichnis hat. Somit liegt die Datei auch da.

Da kann ich mich erst einmal daran machen, die von Dir angezeigten Punkte abzuarbeiten; danke sehr.