Updater: Sich selbst updaten



  • Hallo,

    Ich schreibe momentan einen Updater für eine andere Software. Die andere Software zu updaten ist nicht weiter schwer, aber der Updater soll sich auch selbst aktuell halten können.
    Jetzt frage ich mich, wie man das am Besten umsetzt. Leider kann man unter Windows eine Executable, die grade ausgeführt wird, nicht ohne weiteres ersetzen. Eine Idee wäre, einen kleines Hilfsprogramm zu schreiben, der dann die Aufgabe des bloßen Dateiaustauschs und das anschließende Neustarten des eigentlichen Updaters hätte.

    Gibts da keine schöneren Lösungen? Kann man nicht irgendwie einen laufenden Prozess von der Datei trennen (mit .Net, falls das hilft), um diese dann ersetzen zu können?

    mfg
    Mr X



  • Du könntest eine Batch-Datei schreiben und anstarten, die den Updater austauscht.

    (ich hab' vor einer Ewigkeit mal einen Artikel zu einem vergleichbaren Problem (wie kann sich der Uninstaller selber löschen?) gelesen, aber keine Ahnung, ob ich den noch wiederfinden kann)



  • Was mir so einfällt (aber habe das vor langer Zeit zuletzt gemacht)
    Du kannst einen zweiten Prozess, eine andere exe oder gar nur bat, starten, die deine exe löscht und sobald das endlich klappte (als bat mit del und if exist goto) die bereits besorgte neue exe hinkopiert und startet.
    Und du kannst auch laufende exe-Dateien umbenennen. Kannst also Dich selber wegbenennen in "killme.exe", die gute exe hinbenennen, hoffen, daß dazwischen nix passiert, und beim nächsten Start wird schon die richtige aufgerufen, mit der bat machste noch den Schließmich-Neustart. Oder dein Updater selber löscht die killme.exe, falls vorhanden.



  • Mit dem Ansatz des Umbenennen ist es sogar ziemlich einfach

    1. Der Updater startet und läd einen neuen Updater.exe als UpdaterNew.exe herunter
    2. Er erstellt eine ReplaceMe.bat (Kann der Updater ja selber schreiben, so kannst du die bat nachträglich auch anpassen)
    3. Er startet die ReplaceMe.bat und beendet sich direkt selber
    4. Die ReplaceMe benennt Updater.exe nach UpdaterToDelete.exe um und UpdaterNew.exe nach Updater.exe
    5. Updater.exe wird gestartet, bat ist beendet
    6. Der Updater prüft bei jedem Start ob es eine ReplaceMe.bat und/odr eine UpdaterToDelete.exe gibt, wenn ja löscht er es 🙂



  • Die bat kann sich sogar selber löschen!



  • del %0



  • Du brauchst überhaupt keine .bat.

    Eine laufende EXE kann sich selbst renamen.

    Also:

    1. Lädt neue Update.exe und speichert sie als UpdateNew.exe
    2. Benennet sich selbst um (Update.exe -> UpdateOld.exe)
    3. Benennt neue exe um (UpdateNew.exe -> Update.exe).
    4. Fertig

    Sinnvollerweise sollte die Update.exe beim Start noch nachsehen ob eine UpdateOld.exe vorhanden ist und diese ggf. löschen.



  • So hab ich es auch mal bei einem kleinen Programm mit nur einer .exe gemacht.
    Mir ist dabei übrigens was aufgefallen (WinXP): Das Programm hat sich scheinbar nach einem Windows-Neustart zurückgesetzt. Und zwar immer wieder. Und zwar auf den Zeitpunkt, wo ich es das erste mal manuell auf einen PC kopiert habe.
    Was kann da schuld sein? Zunächst war das Programm im WINDOWS\System verzeichnis. Dann dachte ich achso, Windows wird nun denken, das sei eine Systemdatei und stellt sie beim Neustart neu her.
    Aber dann habe ich es mit einem neuen Programm in einem neuen Verzeichnis probiert (C:\Programme\...) aber es passierte wieder.

    Beispiel: Ich kopierte erstmalig app.exe v1.0.0 auf den PC. Nach ein paar Neustarts immer noch v1.0.0. Klar.
    Dann ließ ich die app.exe updaten. v1.0.1. Alles ok, bis zum nächsten Neustart. Dann ist die app.exe nämlich plötzlich wieder v1.0.0! Ohne, dass sonst irgendwas gemacht wurde.
    Echt komisch... das muss wohl irgendein ein Windows-Mechanismus sein?

    Bin mir irgendwie sicher, dass es an diesem Verfahren liegt, nur eine .exe zu haben, die sich letztendlich selbst verändert hat.

    Irgend so ne Kaspersky Suite 2010/2011 war da noch am PC, könnte eventuell damit zusammenhängen? Denke aber eher nicht.

    Hmm...



  • Automatische Updates und Updateerinnerungen sind eine nervtötende Mode.

    Ich habe mittlerweile täglich PopUps die mich darauf hinweisen, dass eine neue Version für irgendeine SW verfügbar ist. Die zu unterdrücken funktioniert selten.

    Bei Frameworks und Systemsoftware kann ich es noch akzeptieren aber ich will nicht, dass jedes Miniprogramm anfängt sein Eigenleben zu entwickeln.

    Man muss auch bedenken, dass Updates nicht immer erwünscht sind. Eine neue Oberfläche gefällt vielleicht nicht oder nützliche Funktionen wurden fallengelassen.

    Außerdem ist es aus Sicherheitsgründen eine Katastrophe weil das Update wie hier vorgeschlagen keine Adminrechte voraussetzt.

    Also Leute hört wenigstens bei kleinen Programmen auf mit dem Mist.



  • Sagt ja keiner das es Automatische Updates sein sollen.
    Ein Button "Check for Updates" (Im menü oder in der About) und dann ein automatisches Update nach klick darauf ist doch was feines 🙂



  • BadWolf schrieb:

    Eine laufende EXE kann sich selbst renamen.

    Wär mir neu... Beweise bitte.



  • Warum muß ich eigentlich bei automatischen Updates über diese Updates informiert werden. Das ist doch entgegen der Logik einer Automatisierung. Ich will über Updates nur informiert werden, wenn ich in Aktion treten muß, z.B. den Rechner neu Booten. Alles andere interessiert mich nicht! Bitte keine Popups o.ä. Das nervt! Ich hasse auch Firefox mit seinen Erweiterungen, fast täglich muß ich mir diesen Update-Dialog antun. 👎

    Wenn autom. Updates, dann bitte so, das ich davon nichts mitbekomme. Wenn ich keine Updates haben will, sollte man mich nicht darüber informieren und auch nicht updaten.



  • Sehe ich wie Artchi. Wie Google Chorme es macht ist perfekt. Immer auf dem aktuellen Stand ohne jemals mit irgendwelchen "Neue Version"-Quatschkram belästigt zu werden.

    > Wär mir neu... Beweise bitte.

    Machen wir in unserer (kommerziellen, Closed Source) Software seit Jahren so. Ist eine Client-Server Anwendung. Die Clients updaten sich automatisch selbst, wenn auf dem Server eine neue Version installiert wird, eben genau über den Weg sich selbst umzubenennen, während sie laufen.

    WinAPI -> MoveFile().


Anmelden zum Antworten