Laden...

[gelöst]Windows Service als Update-Dienst: Ein "Signal" senden um das Update zu installieren

Erstellt von Gnozo vor 10 Jahren Letzter Beitrag vor 10 Jahren 2.358 Views
G
Gnozo Themenstarter:in
141 Beiträge seit 2011
vor 10 Jahren
[gelöst]Windows Service als Update-Dienst: Ein "Signal" senden um das Update zu installieren

Hallo Leute,

ich bin gerade auf der Suche nach einer passenden Methode um einem Windows Dienst ein Signal zu senden, dass er seine Routine starten kann.

Es geht dabei um eine Art Update-Dienst. Dieser soll ein Programm automatisch updaten sobald die Update-Datei heruntergeladen wurde. Diese liegt immer in einem Verzeichnis. Da das zu updatende Programm stehen bleibt, sobald die Datei heruntergeladen ist, muss der Dienst sofort eingreifen können um das Update vorzunehmen.

Ich dachte erst an einen Timer, der alle paar sekunden in das Verzeichnis guckt ob eine entsprechende Datei vorhanden ist, nur kann das zu lange dauern und ist sowieso ineffizient, da er zu 99,9% ins leere pollt.

Mein zweiter Gedanke war FileSystemWatcher. Nur leider weiß ich nicht, ob dieser dazu geeignet wäre um sofort die Verarbeitung zu starten oder ob es dort auch zu Verzögerungen kommen kann.

Eine Alternative wäre, dass das Programm ein Signal an den Dienst schickt, welcher daraufhin losläuft. Nur da hab ich noch keinen Ansatz gefunden, wie das zu bewerkstelligen wäre.

Ich hoffe Ihr könnt mir hierbei helfen

Gruß
Lukas

I
57 Beiträge seit 2011
vor 10 Jahren
G
Gnozo Themenstarter:in
141 Beiträge seit 2011
vor 10 Jahren

Was ich noch hinzufügen sollte, ist das es nur bis .NET 3.5 geht und kein 4.0 oder 4.5 aktuell zur Verfügung steht....

trotzdem danke für die Links! 😃

49.485 Beiträge seit 2005
vor 10 Jahren

Hallo Gnozo,

warum lädt der Dienst nicht selber die Datei herunter? Dann wüsste er auch, wann der Download fertig ist.

Ansonsten sollte FileSystemWatcher schon gehen. Verzögerungsfrei ist nichts, aber die Verzögerung sollte gering genug sein.

herbivore

G
Gnozo Themenstarter:in
141 Beiträge seit 2011
vor 10 Jahren

Hallo herbivore,

Bis jetzt lädt das Programm das Update selber herunter und speichert es ab. Danach steht es still und wartet darauf, das der Benutzer es installiert.

Da der Aufwand gering gehalten werden soll und das aktuelle Programm erstmal nicht geändert werden soll, ist das mit dem Dienst die einfachste Möglichkeit.

Dann werde ich es mit FileSystemWatcher ausprobieren.

Danke 😃

6.911 Beiträge seit 2009
vor 10 Jahren

Hallo Gnozo,

muss es dazu überhaupt ein Dienst sein. Der wartet 99,9% der Zeit ja auch nur und ich sehe sowas als Verschwendung von Ressourcen an.

Wenn das Programm eh schon die Datei herunterlädt, so kann das Programm auch ein weiteres Updater-Programm starten (ev. mit Admin-Rechten, dann kann der Benutzer dies gestatten od. nicht), welches dann das Update durchführt.

BTW: im Forum gibts schon ein paar Updater-Komponenten. Schau dir dazu ggf. die Themen an.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

G
Gnozo Themenstarter:in
141 Beiträge seit 2011
vor 10 Jahren

Hallo gfoidl,

Ja das war ein Gedanke, dass das Programm das selber macht. Aber der Dienst soll später das Updaten von mehreren Programmen vornehmen, deswegen muss ich jetzt doch eine Kommunikation zwischen Application und Dienst herstellen.

Was wäre hierfür der beste Weg? WCF?

Gruß
Lukas

P
660 Beiträge seit 2008
vor 10 Jahren

Du kannst doch einfach mit dem Dienst gucken ob in einem bestimmten ordner eine bestimmte Datei
vorliegt (exe, zip, ...) und diese dann ausführen wenn der Prozess der geupdated werden soll, sich
geschlossen hat. um zu wissen wann der Download fertig ist, kannst du es ja so wie z.b. FireFox
machen und die datei während es heruntergeladen wird, DateiName.part benennen und nach dem
Download in DateiName.(exe | zip | ...) umbenennen.

oder wie bereits vorgeschlagen wurde, soll der dienst sich selbst um alles kümmern (Dl, check for
process running, kill process if necessary or wait till the user closes the program, update, verifiy
update, etc.)

MfG
ProGamer*Der Sinn Des Lebens Ist Es, Den Sinn Des Lebens Zu Finden! *"Wenn Unrecht zu Recht wird dann wird Widerstand zur Pflicht." *"Ignorance simplifies ANY problem." *"Stoppt die Piraterie der Musikindustrie"

49.485 Beiträge seit 2005
vor 10 Jahren

Hallo Gnozo,

gerade wenn der Dienst für mehrere Anwendungen zuständig sein soll, wäre es sinnvoll, wenn er sich um das komplette Update inkl. Herunterladen der Dateien kümmert. Ansonsten enthält jede Anwendung unnötigerweise diesen Overhead.

Der beste Weg ist also, wenn die Anwendung den Dienst überhaupt nicht benachrichtigen muss, sondern er selber weiß, was wann wie zu tun ist.

herbivore

PS: Warum ich automatischen Updates generell ablehnend gegenüberstehe, habe ich in Updatemechanismus... Prinzipielle Bedenken? [==> Ja] beschrieben. Dort steht auch, welche Gefahren damit verbunden sind, erst recht, wenn man nicht sehr genau aufpasst, wie man den Mechanismus realisiert.

G
Gnozo Themenstarter:in
141 Beiträge seit 2011
vor 10 Jahren

Hallo herbivore,

Danke für denk Link, dementsprechende Sicherheitsroutinen werden auch schon eingebunden.

Das Problem liegt einfach bei den verschieden verteilten Rechten auf dem System. Das Programm hat die Möglichkeit das Update vom Netzlaufwerk zu ziehen aber keine Rechte das Update durchzuführen.

Deswegen brauchen wir einen Dienst mit Adminrechten, der dann die Installation übernimmt und seine Anweisung per Programm übermittelt bekommt.

Ich werde das ganze wohl mit Pipes umsetzen.

Danke an Alle für die Vorschläge 😃

6.911 Beiträge seit 2009
vor 10 Jahren

Hallo Gnozo,

Ich werde das ganze wohl mit Pipes umsetzen.

Das ist aber WCF wesentlich einfacher.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

G
Gnozo Themenstarter:in
141 Beiträge seit 2011
vor 10 Jahren

Das ist aber WCF wesentlich einfacher.

Hallo gfoidl,

Hm, dass hab ich jetzt nicht so empfunden. Habe mir die Dokumentation zu beiden angesehen und auch Beispiele und empfand Pipes wesentlich einfacher. Vielleicht liegt es auch daran, dass ich die Doku besser verstehen konnte.

Gruß
Lukas

6.911 Beiträge seit 2009
vor 10 Jahren

Hallo Gnozo,

für einfache Primitivkommunikation mag es vllt. stimmen. Aber sobald du Objekte direkt übergeben willst, und das sehe ich hier bei diesen Anforderungen so, wird es mit Pipes kompliziert, da du dich selbst um die Serialsierung kümmern müsst. WCF erledigt das für dich selbst und du bist näher am OO-Modell mit dem Versenden von Nachrichten (~Methodenaufruf) dran als bei Pipes. Schau dir dazu auch WCF Tutorial - Basic Interprocess Communication an.

Letztlich ist dir die Wahl der IPC (Interprocesscommunication) überlassen. In diesem Thread sollten wir das Thema auch nicht weiter behandeln.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"