Updater basteln



  • Updater sind oft eine Plage.

    Shade Of Mine schrieb:

    Richtig wäre, das Update still zu laden und wenn es fertig ist zu Fragen ob es installiert werden soll.

    Nein bitte nicht. Benutzer mit Volumenflat oder sonst schwacher Verbindung möchten auf keinen Fall dass etwas ohne ihren ausdrücklichen Wunsch heruntergeladen wird.

    Der Updater vom Acrobat Reader hat meine Einstellungen immer ignoriert weshalb ich schließlich auf FoxIt umgestiegen bin. Nur wegen dem Updater!

    Updater müssen intensiv getestet werden wegen möglicher Probleme mit Schreibrechten oder der Firewall und Antivirensoftware. Und das auf allen gängigen Windows Versionen. Eigentlich kann man da kaum alle wesentlichen Testfälle abdecken als Einzelperson.

    Idealerweise sollte direkt bei der Installation festgelegt werden können wie der Updater sich verhält: Bescheid geben dass neue Version online ist, still runterladen, nichts tun, installation auf Nachfrage, automatische Installation u.s.w.. Und diese Einstellung sollte später jederzeit zuverlässig änderbar sein.

    Außerdem darf der Updater nicht mit dem Installer kollidieren. Bei Programmen die mit mit MSI installiert wurden kann man nicht einfach Dateien löschen, sonst wird das bei dem nächsten Softwarestart bemerkt und die Installation "repariert".

    Bei begrenzten Entwicklungsresourcen kann da eigentlich nur Crap rauskommen. Ich würde mir dreimal überlegen ob ich mir und den Usern das alles wirklich antun will. Und bitte, wo kommen wir den hin wenn jede Popelsoftware ihren eigenen Dienst mit Adminrechten laufen lässt und den Systray belagert? 😮



  • Shade Of Mine schrieb:

    Eisflamme schrieb:

    Wie macht Chrome das denn?

    Beim installieren bekommt dein Programm ja Admin Rechte - das kannst du nutzen um einen Service zu installieren der mit Admin Rechten läuft. Google nutzt diesen Service nun um seine Programme automatisch upzudaten. Das sind 100% silent Updates. Der User wird nichtmal gefragt ob er updaten will oder nicht.

    Chrome wird in das Benutzerverzeichnis installiert wo er keine Admin rechte braucht. (Warum Chrome "GoogleUpdate.exe" laufen hat ist mir schleierhaft, das könnte Chrome selber übernehmen.)
    Das ist der Grund warum es silent Updates sind, nicht wegen dem Prozess.



  • IchHasseUpdater schrieb:

    ...Und bitte, wo kommen wir den hin wenn jede Popelsoftware ihren eigenen Dienst mit Adminrechten laufen lässt und den Systray belagert? 😮

    Am besten sind diese Maus oder Tastatur "Hilfsprogramme" die sich im Tray breitmachen und einfach nur die Windows Maus/Tastatureinstellungen der Systemsteuerung anzeigen, wenn man draufklickt 😃



  • Ich habe gerade nochmal überlegt, ich muss den Updater dann ja wirklich mit dem Installationsprogramm kombinieren. msi wäre dann wirklich so ein Problem, dann lasse ich den Benutzer lieber ohne msi auswählen, wo er seine Software hinhaben möchte.

    Und wenn bei Programmstart die kurze Meldung kommt "Update ist vorhanden, installieren?", dann kann er es sich ja schließlich aussuchen, falls die Internetverbindung gerade langsam ist (dann macht mein Programm aber sowieso keinen Sinn, also ist das wohl kaum der Fall). Und wenn ich nach "Ok" noch nach Adminrechten frage, sind doch automatisch auch die Schreibrechte geklärt. Was spricht gegen diese Lösung?

    Edit: Man kann bei Visual Studio einfach unter Projekt->Eigenschaften->Linker->Manifestdatei->UAC-Ausführungsebene "requireAdministrator" angeben. Das sollte doch vermutlich für alle Windowsversionen funktionieren, oder? Edit2: Das funktioniert überhaupt nicht. Von VS erstellte manifest ist definitiv eingebunden, aber er fragt nicht nach Rechten und kann auch nichts ausführen, was Rechte benötigt. Überhaupt kann ich als normaler Benutzer auch im Programmordner nichts löschen, auch dann nicht, wenn ich den Löschen-Button mit dem Adminsymbol drücke. Nachfrage kommt zu keiner Zeit. Ich tendiere dazu mich jetzt auch einfach über fehlende Adminrechte zu beklagen...

    Ich mag es bei Software oft nicht, wenn die sich in die Benutzerordner reinschreibt, weil der Pfad einfach irre lang ist. Fändet ihr das denn eine gute Alternative?



  • David W schrieb:

    Chrome wird in das Benutzerverzeichnis installiert wo er keine Admin rechte braucht. (Warum Chrome "GoogleUpdate.exe" laufen hat ist mir schleierhaft, das könnte Chrome selber übernehmen.)
    Das ist der Grund warum es silent Updates sind, nicht wegen dem Prozess.

    Also unter OS X ist das definitiv nicht so. Und Windows habe ich gerade keins da um es dort zu testen...

    @Eisflamme
    Software in den Benutzerordner ist schlecht und Sicherheitstechnisch eine Katastrophe - deshalb würde es mich wundern wenn Chrome das unter Windows so macht. Mal abgesehen von Multiuser Systemen wo sowas sowieso eine dumme Idee ist, ist es halt Sicherheitstechnisch ein Wahnsinn.

    Du kannst über das Manifest einen UAC Dialog anfordern. Du kannst in den Einstellungen der Software ja meinetwegen das automatische laden von Updates deaktivieren lassen - aber im Prinzip ists ideal wenn die Software das Update im Hintergrund lädt und beim starten das Update anbietet (falls du nicht automatisch installieren willst). Automatisch ist natürlich die beste Lösung.

    Und diese Update Services sollen sich natürlich nicht ins Systray legen sondern im Hintergrund laufen - bzw. eben nur ab und zu angestoßen werden...



  • Shade Of Mine schrieb:

    David W schrieb:

    Chrome wird in das Benutzerverzeichnis installiert wo er keine Admin rechte braucht. (Warum Chrome "GoogleUpdate.exe" laufen hat ist mir schleierhaft, das könnte Chrome selber übernehmen.)
    Das ist der Grund warum es silent Updates sind, nicht wegen dem Prozess.

    Also unter OS X ist das definitiv nicht so. Und Windows habe ich gerade keins da um es dort zu testen...

    so ist es aber unter Windows.



  • Shade Of Mine schrieb:

    Und diese Update Services sollen sich natürlich nicht ins Systray legen sondern im Hintergrund laufen - bzw. eben nur ab und zu angestoßen werden...

    Update-Service braucht man mMn. gar keins, das kann das Programm doch übernehmen wenn es normal läuft.
    Jedes mal wenn die Software gestartet wird guckt sie nach ob ein Update fertig runtergeladen wurde. Wenn ja -> anbieten zu installieren. Wenn nein guckt sie ob ihr Updater-Daemon schon läuft. Wenn ja -> fertig. Wenn nein nachgucken ob's Zeit zum nachgucken ist. Wenn ja nachgucken ob es ein neues Update gibt. Wenn ja den Updater-Daemon starten, der das dann runterlädt.

    So braucht man kein Service und die Software wird auch keinen Traffic mehr erzeugen sobald sie nicht mehr gestartet wird.



  • zwutz schrieb:

    Shade Of Mine schrieb:

    David W schrieb:

    Chrome wird in das Benutzerverzeichnis installiert wo er keine Admin rechte braucht. (Warum Chrome "GoogleUpdate.exe" laufen hat ist mir schleierhaft, das könnte Chrome selber übernehmen.)
    Das ist der Grund warum es silent Updates sind, nicht wegen dem Prozess.

    Also unter OS X ist das definitiv nicht so. Und Windows habe ich gerade keins da um es dort zu testen...

    so ist es aber unter Windows.

    Habs extra nachgesehen: http://imageshack.us/photo/my-images/849/bildschirmfoto20120814u.png/
    Ist also definitiv nicht der Fall.

    Mag aber so sein, wenn man als User installiert. Da er dann ja nicht nach Programme installieren kann. Ist aber eine sehr sehr dumme Idee.

    @hustbaer:
    Nope.
    Damit verlangst du jedesmal vom User elevated privileges. Die er dir uU nicht geben kann. Der Service hat den Vorteil dass er mit den notwendigen Rechten läuft und nicht extra danach fragen muss. Ein User muss ja nicht unbedingt Admin Rechte haben...



  • Shade Of Mine schrieb:

    @hustbaer:
    Nope.
    Damit verlangst du jedesmal vom User elevated privileges. Die er dir uU nicht geben kann. Der Service hat den Vorteil dass er mit den notwendigen Rechten läuft und nicht extra danach fragen muss. Ein User muss ja nicht unbedingt Admin Rechte haben...

    Willst du das Update vom Service installieren lassen? Hm...
    Weiss nicht ob ich das so gut finde.

    Wo ist das Problem wenn im Falle eines Updates ein UAC Fenster aufpoppt? (Zum Checken/Runterladen/... braucht er ja keine Elevation, bloss zum Installieren)



  • zwutz schrieb:

    Shade Of Mine schrieb:

    David W schrieb:

    Chrome wird in das Benutzerverzeichnis installiert wo er keine Admin rechte braucht. (Warum Chrome "GoogleUpdate.exe" laufen hat ist mir schleierhaft, das könnte Chrome selber übernehmen.)
    Das ist der Grund warum es silent Updates sind, nicht wegen dem Prozess.

    Also unter OS X ist das definitiv nicht so. Und Windows habe ich gerade keins da um es dort zu testen...

    so ist es aber unter Windows.

    AFAIK nur wenn man Chrome direkt mit einem Klick auf "Google chrome jetzt installieren" auf der Google Homepage installiert. (So war es auf jeden Fall bei mir)



  • hustbaer schrieb:

    Willst du das Update vom Service installieren lassen? Hm...
    Weiss nicht ob ich das so gut finde.

    Chrome macht es zB so.
    Systemupdates funktionieren auch auf diese Weise.

    Wo ist das Problem wenn im Falle eines Updates ein UAC Fenster aufpoppt? (Zum Checken/Runterladen/... braucht er ja keine Elevation, bloss zum Installieren)

    Dass der User diese Rechte uU eben nicht hat.

    Es ist eine unsitte immer und überall Adminrechte einzufordern. Das hebelt das ganze System aus. Mittlerweile klicken die User sowieso immer nur weiter weiter weiter wenn ein UAC Dialog kommt. Die Sicherheit ist durch solche Software wie zB Firefox, Java, etc. einfach nicht mehr gegeben und das finde ich bedenklich.

    Aber gut, wenn man unbedingt keine silent updates haben will (warum auch immer) dann muss man mit einem extra Updater arbeiten. Die Software muss dann warnen dass es Updates gibt wenn der User bestätigt popt das UAC auf - sucken tut das ganze natürlich wenn der User keine Adminrechte hat - dann fühlt er sich von der Software verarscht, wie es zB Logitech sehr gut vormacht.

    Generell sollte man aber nicht einfach so nach Admin Rechten Fragen - also in so einem Fall lieber auf händische Updates vertrauen. Denn nichts ist doofer als dem User funktionalität anzubieten (neues Updates, neue Features, etc.) die er dann nicht bekommen kann.



  • Ja, alles so eine Sache. Also meine manifest-Datei funktioniert mittlerweile. Hat jedoch irgendwie einen Neustart gebraucht.

    Chrome (Win7x64) ist bei mir hier installiert:
    C:\Users\:)\AppData\Local\Google\Chrome\Application\chrome.exe

    Und hätte es mich explizit gefragt, wo ich es hinhaben möchte, hätte ich diesen Ort mit Sicherheit nicht angegeben, ich installiere nie etwas dorthin.

    Shade of Mine:
    Ja, also wenn ich nicht über den Service arbeiten sollte (einfach, weil der auch nochmal mehr Aufwand ist und ich evtl. in einem späteren Update einen besseren Updater anbiete), würde ich halt stets mit UAC den Updater aufrufen. Wenn Nutzer keine Rechte kriegen kann, sollte der Updater ja ausgeführt werden ohne Rechte zu haben, richtig? Und für den Fall zeigt der bei mir jetzt die URL an, wo man sich händisch das Update besorgen kann. Ist zwar immer noch umständlich, aber der User fühlt sich dann zumindest nicht ganz so verarscht, er kann es ja einrichten (wobei er zum Runterladen und installieren auch wieder Adminrechte braucht... d.h. im Grunde genommen, kann er einfach den Updater mit Adminrechten starten).



  • Shade Of Mine schrieb:

    ...

    Wo ist das Problem wenn im Falle eines Updates ein UAC Fenster aufpoppt? (Zum Checken/Runterladen/... braucht er ja keine Elevation, bloss zum Installieren)

    Dass der User diese Rechte uU eben nicht hat.

    Es ist eine unsitte immer und überall Adminrechte einzufordern. Das hebelt das ganze System aus. Mittlerweile klicken die User sowieso immer nur weiter weiter weiter wenn ein UAC Dialog kommt...

    Und es nervt natürlich auch einfach. Gegen gewisse Updater hab ich bereits eine solche Antipathie entwickelt das ich reflexartig auf "Nein" klicke damit ich kurzfristig meine Ruhe hab. Nur in sehr entspannten Augenblicken installier ich mal irgendwas, das mehr als einen Mausklick Aufwand erfordert.



  • Bei mir sind's dann zwei 😞

    - Wollen Sie Update installieren?

    - CUA-Klick auf ja (aber den Klick hat man ja selbst mit mehr Sicherheitsbedürfnis gewählt) [wobei ich es - siehe QT-Thread - nicht hinbekomme die exe mit CUA so zu starten, dass der Benutzer auch gefragt wird! system geht auch nicht :(]


  • Administrator

    @Shade Of Mine,
    Der User hat keine Rechte nach "Programme" zu schreiben, aber er soll die Möglichkeit bekommen, Updates zu installieren? Ist das nicht irgendwie widersprüchlich? Sogar fast schon eine Sicherheitslücke?

    Wenn jemand keine Schreibrechte in "Programme" hat, dann soll er auch nicht in der Lage sein, irgendwelche Updates zu installieren. Dann benötigt es jemand, welcher diese Recht auch besitzt und nicht irgendwelche Lösungen, welche diese Sicherheitsmassnahmen umgehen.

    Ich würde daher im Fall eines User ohne Rechte beim ersten Mal nach dem Aufstarten der Applikation einen klaren Hinweis geben, dass ein Update vorhanden ist, aber dazu jemand mit entsprechenden Rechten benötigt wird. Falls der User das Update nicht durchführt, soll fortan irgendwo ein dezenter Hinweis in der Applikation platziert werden.

    Grüssli



  • Hi,

    nochmal eine Frage: Mein Updater funktioniert soweit prima (ein Klick für Ok, einer für CUA). Aber wenn er im Updater eine DLL ersetzen möchte, die das (bereits beendete!) Hauptprogramm nutzt, kommt es manchmal vor, dass er die nicht überschreiben kann, sprich: die Datei ist noch geöffnet. Wieso, wenn doch die exe schon beendet wurde? Laufen die Aufräumarbeiten von exe und dll parallel und nicht voneinander abhängig?

    Wie kann ich das Problem lösen/umgehen?



  • Einfachste Variante: Retry-Schleife 🙂



  • Alternativ geht auch oft ein rename der DLL und diese dann spaeter mal loeschen.



  • Retry-Schleife, hm... das hatte ich im Kopf, aber war unsicher, ob es nicht zu wenig elegant wäre. Aber gut, werde es wohl so umsetzen. 🙂

    Zudem will ich verstehen, wieso die DLL noch geöffnet ist, obwohl die übergeordnete EXE ja schon beendet wurde.

    Aber kann ich eine noch geöffnete DLL umbenennen? Wie löse ich damit das Problem?



  • Eisflamme schrieb:

    Retry-Schleife, hm... das hatte ich im Kopf, aber war unsicher, ob es nicht zu wenig elegant wäre. Aber gut, werde es wohl so umsetzen. 🙂

    Naja, gibt sicher elegantere Möglichkeiten, aber die sind dann vermutlich auch komplizierter 🙂

    Aber kann ich eine noch geöffnete DLL umbenennen?

    Kommt drauf an wie die geöffnet ist.
    Eine .exe die gerade ausgeführt wird kann man normalerweise umbenennen. Eine geladene DLL dann vermutlich auch.
    Wenn das File mit CreateFile geöffnet wurde geht es allerdings nicht.

    Wie löse ich damit das Problem?

    * Alle alten .exen/.dlls umbenennen (irgend ein generierter Filename, halt irgendwas was es in dem Verzeichnis nicht schon gibt).
    * Alle umbenannten Files löschen
    * Wenn ein File dabei nicht gelöscht werden konnte => mit MoveFileEx(name, 0, MOVEFILE_DELAY_UNTIL_REBOOT) zum Löschen beim nächsten Start markieren
    * Neue Files mit den "normalen" Namen schreiben


Anmelden zum Antworten