Hallo liebe Entwicklergemeinde,
ich hoffe, ich habe nichts übersehen, aber nach längerem Suchen suche ich Rat bei folgendem Problem.
Ich habe bereits eine MDI-Anwendung geschreiben, die ein simples Backup und Restore für eine PostgreSQL-Datenbank macht, sowie das Backup und Restore über Write-Ahead-Logging konfiguriert und der User nichts mehr an der Datenbank selber machen muss.
Mit Hilfe dieses Programmes soll es auch möglich sein, das Ganze automatisch ausführen zu lassen, auch dann wenn kein Benutzer an dem Rechner angemeldet ist.
Angabe von Uhrzeit und Datum, sowie die Backup-Periode ist alles realisiert. Ich hatte einen Scheduled Task erstellt, der genau das getan hat. Aber leider nur dann, wenn auch jemand an dem Rechner angemeldet ist.
Kern des Problems ist, dass aus dem Programm irgendwie heraus ein Dienst oder ein Task installiert werden soll, der zu einem gewissen Zeitpunkt, meinetwegen 3:00 Nachts, das Programm mit dem Argument "automatic" aufruft. Dann (das sollte auch schon richtig funktionieren) erledigt mein Programm seine Arbeit und beendet sich wieder selbstständig.
Nur das installieren des automatischen Dienstes / Tasks bereitet mit Kopfschmerzen. Wie würdet ihr das machen?
Wenn mir irgendjemand helfen kann, wäre ich sehr glücklich!!!
Vielen Dank und viele Grüße
riehol
Ich bin mir zwar nicht sicher, aber beim Abmelden werden nur die Programme geschlossen, die der angemeldete Benutzer gestartet hat. Wenn also ein Prog gestartet wurde, das unter Systemrechten läuft, sollte es auch nach dem Abmelden noch aktiv sein. Vielleicht hilft dir das weiter. Frage wäre dann nur, wie man das Programm mit Systemrechten aus einem Dienst heraus startet.
Vielleicht weiß ja dazu jemand etwas.
Wieso packst du nicht die Funktion an sich in den Dienst? Der muss doch dazu nicht das Programm aufrufen wenn er das selbst tun kann.
Hallo riehol,
... entweder das, oder du packst zumindest die eigentliche Funktionalität des Programms in eine DLL, die du dann sowohl aus deiner MDI-Anwendung heraus aufrufen kannst, als auch aus einer Kommandozeilenanwendung, die ohne Benutzerinteraktion automatisch abläuft. Denn wenn kein Benutzer angemeldet ist, macht eine Anwendung mit GUI nur Probleme. Genauso wie das Starten einer Anwendung mit GUI aus einem Dienst heraus.
herbivore
Ich habe die Funktionalität schon gekapselt und bin gerade dabei ein kleines Tool ohne GUI zu verfassen, das sollte auch klappen.
Aber mein Hauptproblem bleibt weiterhin, wie kann ich aus meinem Hauptprogramm heraus bestehende Parameter nehmen (Zeit und Intervall) und damit eine geplante Aufgabe erstellen die dann unabhängig davon, ob ein Benutzer angemeldet ist, oder nicht, mein Kommandozeilentool aufruft?
Danke schon einmal für die bestehenden Antworten!
Grüße
riehol
Was mir so spontan einfällt:
Du könntest einen geplanten Task anlegen der sagen wir alle 15 Min ausgeführt wird, schaut ob er was zu tun hat, das erledigt und sich wieder beendet. Die Aufträge zum Zeitpunkt x was zu erledigen könntest in einer kleinen xml Datei ablegen die der Task ausliest.
Hallo riehol,
ich würde, wie da anderen schon gesagt haben, die komplette funktionalität in einen Dienst legen.
Diesem Dienst solltest du dazu noch einen kleinen WCF-Service implementieren, der vom Hauptprogramm die einstellungen entgegen nimmt, wie Uhrzeit der automatischen ausführung, etc....
Ich würde sogar so weit gehen das die komplette Funktionalität nur im Dienst stattfindet und dein GUI-Programm nur die Schnittstelle dazu darstellt. Also wenn du ein Backup über deine Gui-Anwendung ausführen willst. Das diese den Auftrag an den Dienst schickt und er sie ausführt.
MfG
Rabban