C++ Updater programmieren

Prestige__

Mitglied
Hallo. Ich möchte in C++ und oder in Batch einen Updater für mein Programm schreiben. Ich hab den Updater erstmals Versucht in Batch zu schreiben, und so hab ich mir das vorgestellt:

Code:
if exist [URL]http://adsoleware.com/project/update/1.txt[/URL] goto update1
if not exist [URL]http://adsoleware.com/project/update/1.txt[/URL] goto urlfail-1

:update1
if exist [URL]http://adsoleware.com/project/update/2.txt[/URL] goto update2
if not exist [URL]http://adsoleware.com/project/update/2.txt[/URL] goto urlfail-2

:update2
if exist [URL]http://adsoleware.com/project/update/3.txt[/URL] goto update3
if not exist [URL]http://adsoleware.com/project/update/3.txt[/URL] goto urlfail-3

:update3
if exist [URL]http://adsoleware.com/project/update/4.txt[/URL] goto update4
if not exist [URL]http://adsoleware.com/project/update/4.txt[/URL] goto urlfail-4

:update4
if exist [URL]http://adsoleware.com/project/update/5.txt[/URL] goto update5
if not exist [URL]http://adsoleware.com/project/update/5.txt[/URL] goto urlfail-5

:update5
if exist [URL]http://adsoleware.com/project/update/6.txt[/URL] goto update
if not exist [URL]http://adsoleware.com/project/update/6.txt[/URL] goto urlfail-6



:urlfail-1
start urlfail-1.vbs
exit

:urlfail-2
start urlfail-2.vbs
exit

:urlfail-3
start urlfail-3.vbs
exit

:urlfail-4
start urlfail-4.vbs
exit

:urlfail-5
start urlfail-5.vbs
exit

:urlfail-6
start urlfail-6.vbs
exit



:update
wget.exe --no-check-certificate [URL]http://adsoleware.com/project/update/6.txt[/URL]
start 6.txt
start urlok.vbs
exit

So hätte ich mir das eben vorgestellt, klappt aber nicht, da es bei dem ersten Update-check nicht funktioniert. Ich vermute, dass man keine Weblinks mit 'if exist' und 'if not exist' abfragen kann, oder zumindest anders als hier bei meinem Code. Jetzt bin ich am überlegen ob ich den Updater in Batch weiter mache, oder in C++ schreibe. Ich bin momentan für C++ da ich mich damit mehr beschäftige, und deshalb poste ich das hier im C/C++ Abschnitt.

Jetzt wäre meine Frage, wie ich das in C++ umsetzen könnte mit dem 'if exist' und dem 'if not exist'?
Ich denke mit 'if( link ==ok ) { ....' und das if not mit '}else { ....'

Meine Idee wäre es falls ich mich doch wieder für Batch entscheide, es vielleicht so zu regeln falls es klapp:

Code:
@echo off
title AdSoleWare Task Executer (ASW-TE)

:main

if exist "C:\Users\Marcel\Desktop\AdSoleWare_Setup\update\1.txt" goto check1
if not exist "C:\Users\Marcel\Desktop\AdSoleWare_Setup\updater\1.txt" goto download

:check1
if exist "C:\Users\Marcel\Desktop\AdSoleWare_Setup\updater\2.tx"t goto check2
if not exist "C:\Users\Marcel\Desktop\AdSoleWare_Setup\updater\2.txt" goto download

:check2
if exist "C:\Users\Marcel\Desktop\AdSoleWare_Setup\updater\3.txt" goto check3
if not exist "C:\Users\Marcel\Desktop\AdSoleWare_Setup\updater\3.txt" goto download

:check3
if exist "C:\Users\Marcel\Desktop\AdSoleWare_Setup\updater\4.tx"t goto check4
if not exist "C:\Users\Marcel\Desktop\AdSoleWare_Setup\updater\4.txt" goto download

:check4
if exist "C:\Users\Marcel\Desktop\AdSoleWare_Setup\updater\5.txt" goto check5
if not exist "C:\Users\Marcel\Desktop\AdSoleWare_Setup\updater\5.txt" goto download

:check5
if exist "C:\Users\Marcel\Desktop\AdSoleWare_Setup\updater\6.txt" goto close
if not exist "C:\Users\Marcel\Desktop\AdSoleWare_Setup\updater\6.txt" goto download


:download
wget.exe --no-check-certificate http://adsoleware.com/project/update/6.txt
start urlok.vbs
exit

:close
exit

P.S.:
Es kann ruhig passieren das ich viele Fragen stellen werde :D... Es tut mir leid falls es stört. und wegen dem Thema, ich weiß nicht ganz wo ich das dazu zählen sollte, da es um C++ und Batch geht.
 
Hi

es ist kein Problem viele Fragen zu stellen :)
...aber eine hab ich auch: das Thema ist schon als erledigt markiert - ist das Absicht?

Sonst, ich würde sowas auch nicht in Batch machen - das Nicht-Url-verstehen wird nicht das einzige Problem bleiben (nächstes Problem zB., wget ist normalerweise nicht bei Windows dabei), und es ist für größere Programme keine wirklich brauchbare Sprache.

Aber auch in C++ kanns recht komplex werden - Gründe zB.
  • So fix hingeschriebene Dateilisten sind langfristig nicht wirklich brauchbar - wär nicht ein allgemeiner(er) Mechanismus nett, mit dem man beliebig viele neue Versionen mit beliebigen Dateien haben kann? Prinzipiell kennt das Programm seine eigene Version, kann die aktuellste Version vom Server abfragen, und bekommt von einem fixen Dateinamen ein Zip mit allen nötigen Dateien des Programmordners, und bei Bedarf Dateien für andere Plätze und/oder Installationsanweisungen auch.
  • Https ... aus ziemlich vielen Gründen.
  • Hashes der übertragenen Dateien gegen Übertragungsfehler (die Checksummen in TCP usw. reichen nicht immer)
  • Wenn man Leuten mit mehr Computern, und dem eigenen Server, was gutes tun will, ermöglichen dass man eine lokale Datei als Datenquelle für den Updater angibt (die der Benutzer zuerst selbst heruntergeladen hat). Inklusive einer krypt. Signatur für die Echtheitsprüfung (sonst Warnung).
  • Je nach Programm, und Installationsort usw., sind evt. Adminrechte für den Updater nötig. Auf Windows etwas umständlich, die Abfrage ins Programm einzubauen.
  • Man kann auf Windows die Dateien laufender Programme nicht ersetzen. Macht einen Updater noch umständlicher, da er (je nach Fall) irgendwo außerhalb vom Programmordner laufen muss (und später vom Hauptprogramm wieder entfernt werden muss)
  • Vielleicht soll der selbe Code ja für mehrere Betriebssysteme verwendbar sein (auch wenn du dann vermutlich nicht Batch genommen hättest)
  • ...
hash https signatur admin laufend

Zu wget noch, --no-check-certificate ist ein Sicherheitsrisiko. Wenn es ohne nicht funktioniert, besser den Server richten.
 
Hi

es ist kein Problem viele Fragen zu stellen :)
...aber eine hab ich auch: das Thema ist schon als erledigt markiert - ist das Absicht?

Sonst, ich würde sowas auch nicht in Batch machen - das Nicht-Url-verstehen wird nicht das einzige Problem bleiben (nächstes Problem zB., wget ist normalerweise nicht bei Windows dabei), und es ist für größere Programme keine wirklich brauchbare Sprache.

Aber auch in C++ kanns recht komplex werden - Gründe zB.
  • So fix hingeschriebene Dateilisten sind langfristig nicht wirklich brauchbar - wär nicht ein allgemeiner(er) Mechanismus nett, mit dem man beliebig viele neue Versionen mit beliebigen Dateien haben kann? Prinzipiell kennt das Programm seine eigene Version, kann die aktuellste Version vom Server abfragen, und bekommt von einem fixen Dateinamen ein Zip mit allen nötigen Dateien des Programmordners, und bei Bedarf Dateien für andere Plätze und/oder Installationsanweisungen auch.
  • Https ... aus ziemlich vielen Gründen.
  • Hashes der übertragenen Dateien gegen Übertragungsfehler (die Checksummen in TCP usw. reichen nicht immer)
  • Wenn man Leuten mit mehr Computern, und dem eigenen Server, was gutes tun will, ermöglichen dass man eine lokale Datei als Datenquelle für den Updater angibt (die der Benutzer zuerst selbst heruntergeladen hat). Inklusive einer krypt. Signatur für die Echtheitsprüfung (sonst Warnung).
  • Je nach Programm, und Installationsort usw., sind evt. Adminrechte für den Updater nötig. Auf Windows etwas umständlich, die Abfrage ins Programm einzubauen.
  • Man kann auf Windows die Dateien laufender Programme nicht ersetzen. Macht einen Updater noch umständlicher, da er (je nach Fall) irgendwo außerhalb vom Programmordner laufen muss (und später vom Hauptprogramm wieder entfernt werden muss)
  • Vielleicht soll der selbe Code ja für mehrere Betriebssysteme verwendbar sein (auch wenn du dann vermutlich nicht Batch genommen hättest)
  • ...
hash https signatur admin laufend

Zu wget noch, --no-check-certificate ist ein Sicherheitsrisiko. Wenn es ohne nicht funktioniert, besser den Server richten.

Ja ich hab das jetzt vorerst mal mit Batch gelößt. Das ganze Programm ist erst im 'Alpha Mode', also ganz am Anfang.

+)
Für das "Problem" mit den Admin-Rechte gibt es eine recht simple Lösung. Wenn man in den Dateinamen einer .exe Datei 'setup', 'install, .... dazu schreibt, verseht TrustedInstaller diese Datei mit dem Admin manifest (hoffentlich so richtig ^^).

+)
Wie meinst du das genau bei Punkt 4?

+)
Wegen Punkt 6.... Ich hab vor es so zu machen das wenn der Updater sich startet die jeweiligen Prozesse zu schließen (zB: taskkill /f /im AdSoleWare.exe /T).
Mit den Updates die ich plane wird sich sehr viel ändern. Ich habe auch richtig viele Ideen für Features, abe die kommen eben im Laufe der Zeit mit Updates ins Programm mit dazu.

Und eine Frage hab ich noch... Wie kann man Programme verschlüsseln? Also den Quellcode schützen. Man kann ja Programme decompilen, ich möchte später einmal nicht das mein Code geklaut werden kann :/

Und ja das Thema wäre abgeschlossen, teilweiße jetzt aber wieder.
 
verseht TrustedInstaller diese Datei
Dass Windows das Manifest selber ändert ist mir allerdings neu...

Mit dem Punkt 4 (Offlinedateien) meine ich, dass man den Benutzer vom Updater nicht zwingt, den Download von deinem Server zu machen, sondern dass man den Downloadschritt eben auslassen kann und dem Updater selber irgendeinen Ordner gibt, wo die Dateien lokal schon sind. Der Updater macht dann alles nach dem Download mit diesen Dateien.
Falls außer dem Download und dem richtigen Platzieren der Dateien generell nichts zu tun ist ist der Punkt egal, aber das dann bitte irgendwo dem Benutzer auch klarmachen

Der Teil mit der Signatur: Eine krytographische Signatur ist etwas, mit dem man (wenn richtig eingesetzt) prüfen kann, ob Daten (zB. die Updatedatei) wirklich von dir sind (du = Besitzer eines geheimen "Schlüssels", eine kleine Datei).. Je nach Sinn und Art vom Programm wäre es evt. angebracht, sowas zu machen, und das im Updater lokal auch prüfen zu lassen.

Zu taskill, bitte nicht. Rechteprobleme, möglicher Datenverlust, usw. - besser das Hauptprogramm sich selbst beenden lassen.

Und eine Frage hab ich noch... Wie kann man Programme verschlüsseln? Also den Quellcode schützen. Man kann ja Programme decompilen, ich möchte später einmal nicht das mein Code geklaut werden kann :/
Wenn das Programm auf den Computern der Benutzer läuft, über die du keine Kontrolle hast: direkt gesagt, gar nicht.

Alles was man machen kann ist, dass ein Leser vom Code länger braucht, um ihn zu verstehen (aber das bei dekompiliertem C++ aus technischen Gründen sowieso schon ziemlich gut, ohne zustätzliche Maßnahmen).

Was ich mich eher fragen würde, was willst du verhindern? Wirklich, dass jemand versteht, wie dein Programm funktioniert? Oder evt. entgangenes Geld weil jemand die Lizenzprüfung entfernt hat? Oder...?
 
Es gibt übrigens solche Updater auch als 3rd-Party-Komponenten. Du kannst z. B. nach "c++ updater github" oder "c++ updater opensource" mal googlen ;)
 
Dass Windows das Manifest selber ändert ist mir allerdings neu...

Mit dem Punkt 4 (Offlinedateien) meine ich, dass man den Benutzer vom Updater nicht zwingt, den Download von deinem Server zu machen, sondern dass man den Downloadschritt eben auslassen kann und dem Updater selber irgendeinen Ordner gibt, wo die Dateien lokal schon sind. Der Updater macht dann alles nach dem Download mit diesen Dateien.
Falls außer dem Download und dem richtigen Platzieren der Dateien generell nichts zu tun ist ist der Punkt egal, aber das dann bitte irgendwo dem Benutzer auch klarmachen

Der Teil mit der Signatur: Eine krytographische Signatur ist etwas, mit dem man (wenn richtig eingesetzt) prüfen kann, ob Daten (zB. die Updatedatei) wirklich von dir sind (du = Besitzer eines geheimen "Schlüssels", eine kleine Datei).. Je nach Sinn und Art vom Programm wäre es evt. angebracht, sowas zu machen, und das im Updater lokal auch prüfen zu lassen.

Zu taskill, bitte nicht. Rechteprobleme, möglicher Datenverlust, usw. - besser das Hauptprogramm sich selbst beenden lassen.


Wenn das Programm auf den Computern der Benutzer läuft, über die du keine Kontrolle hast: direkt gesagt, gar nicht.

Alles was man machen kann ist, dass ein Leser vom Code länger braucht, um ihn zu verstehen (aber das bei dekompiliertem C++ aus technischen Gründen sowieso schon ziemlich gut, ohne zustätzliche Maßnahmen).

Was ich mich eher fragen würde, was willst du verhindern? Wirklich, dass jemand versteht, wie dein Programm funktioniert? Oder evt. entgangenes Geld weil jemand die Lizenzprüfung entfernt hat? Oder...?


Ich möchte nur nicht das jemand mal meinen Code stehlen kann oder selbst verwenden kann. Ich hatte auch mal die Idee das Programm später irgendwann mal zu verkaufen, ja, aber das wird noch dauern da ich dafür ein Gewerbe brauche und ich noch keine 18 Jahre bin. Nochdazu ist das Projekt noch frisch geschlüpft, also es gibt es schon seit 2 - 3 Monaten, was aber meiner Meinung dennoch noch nicht lange ist, und da das Programm aufgrund dessen noch nicht alle Funktionen besitzt die im Laufe der Zeit hinzugefügt oder fertiggestellt werden müssen, finde ich es angemessen das Programm deshalb vorerst kostenlos zur Verfügung zu stellen. Ein anderer Grund ist das es eben wie gesagt das Projekt noch nicht lange gibt und deshalb auch noch nicht bekannt ist, und unbekannten Websites oder generel unbekannten Dingen traut man anfangs ja noch nicht, und das ist auch ein Grund weshalb wir es fürs erste kostenlos anbieten möchten, damit, falls mal Leute unsere Seite finden, einen Einblick in alles bekommen und das Programm sodurch mal 'testen' können.

Punkto Updater:


Also damit ich das richtig verstehe:
Der Nutzer soll selber das Update starten können, und nicht automatisch und man sollte auch einen eigenen Pfad für den Updater angeben können, falls das so richtig ist. Ich finde die Idee nicht so schlecht und wüstste schon wie ich sie umsetzten könnte. Das mit dem Updater, das man die Updates selber machen sollte oder kann, find ich auch nicht schlecht. Meiner Meinung ist die Idee für den Updater echt sehr gut, denn: Ich habe jetzt drüber nachgedacht und es wäre ja der Computer des Nutzers, und dieser entscheided ja immerhin was auf dem Computer passieren soll und was nicht, weshalb ich mich umentschieden hab es so zu machen. Ich hatte auch die Idee, es vielleicht so zu machen das standartmäßig der manuelle Updater an ist, und der Benutzer, bei belieben, den Updater automatisieren kann.

Wegen der Singatur:
Da bräuchte ich noch ein etwas mehr wissen und aufklärung darüber.

PS:
Das mit dem taskkill war nur ein schnelles Beispiel. Für die Konsolenanwendung würde ich es zB so machen, das nachdem alles abgeschlossen wäre, das sich das Programm zB mit 'return 0;' schließt oder auf andere Weise, je nach dem was es alles so noch zur Verfügung gebe.

Und tut mir leid wegen der späten Antwort. Hatte etwas stress
 
Es gibt übrigens solche Updater auch als 3rd-Party-Komponenten. Du kannst z. B. nach "c++ updater github" oder "c++ updater opensource" mal googlen ;)

Ja es wäre vielleicht eine möglichkeit, aber ich finde es besser wenn man Dinge oder Funktionen wie diese selber macht, da man dann volle Rechte daran besitzt. Angenommen ich verwende InstallForge. Da wäre was ich gesehen habe ein Lizenzsystem mit im Setup und eine VS-Updater was ich gesehen habe, aber man darf die zB ohne Erlaubnis nicht verkaufen also kommerziell nutzen. Dafür bräuchte man wahrscheinlich eine Lizenz und diese kostet dann möglicherweise Geld.
 
Ja es wäre vielleicht eine möglichkeit, aber ich finde es besser wenn man Dinge oder Funktionen wie diese selber macht, da man dann volle Rechte daran besitzt.
Unter den 3rd-Party AutoUpdater-Komponenten waren einige OpenSource-Projekte dabei. Bestimmt findest du unter denen ein Projekt mit einer passenden Lizenz.

Vereinfacht gilt in meinen Augen "Selbst entwickeln = volle Rechte + mehr Arbeit + viel mehr Bugs und Sicherheitslücken als existierende Systeme", siehe auch https://de.wikipedia.org/wiki/Not-invented-here-Syndrom

Gerade bei einem Autoupdater hast du ein riesen Problem, wenn der Updater irgendwann einmal kaputt wegen einem x-beliebigen Bug ist. Stell dir vor, das passiere mit dem Autoupdater deines Betriebssystems.

Ich hatte auch die Idee, es vielleicht so zu machen das standartdmäßig der manuelle Updater an ist, und der Benutzer, bei belieben, den Updater automatisieren kann.
Ich würde es genau andersrum empfehlen. Welcher Nutzer startet Updates manuell heutzutage? Gerade bei Sicherheitslücken ist das sehr kritisch. Eigentlich möchte man Updates einer Applikation auch dann, wenn sie in letzter Zeit nicht benutzt wurde. Dafür und zur Installation der jeweiligen Software gibt es Paket Manager. (Wie man Pakete mit kostenpflichtiger Software erstellt, ist wieder eine individuelle Frage - etwa vertreibst du deine Software frei zugänglich, jedoch nicht die Lizenz Codes.)
 
Unter den 3rd-Party AutoUpdater-Komponenten waren einige OpenSource-Projekte dabei. Bestimmt findest du unter denen ein Projekt mit einer passenden Lizenz.

Vereinfacht gilt in meinen Augen "Selbst entwickeln = volle Rechte + mehr Arbeit + viel mehr Bugs und Sicherheitslücken als existierende Systeme", siehe auch https://de.wikipedia.org/wiki/Not-invented-here-Syndrom

Gerade bei einem Autoupdater hast du ein riesen Problem, wenn der Updater irgendwann einmal kaputt wegen einem x-beliebigen Bug ist. Stell dir vor, das passiere mit dem Autoupdater deines Betriebssystems.


Ich würde es genau andersrum empfehlen. Welcher Nutzer startet Updates manuell heutzutage? Gerade bei Sicherheitslücken ist das sehr kritisch. Eigentlich möchte man Updates einer Applikation auch dann, wenn sie in letzter Zeit nicht benutzt wurde. Dafür und zur Installation der jeweiligen Software gibt es Paket Manager. (Wie man Pakete mit kostenpflichtiger Software erstellt, ist wieder eine individuelle Frage - etwa vertreibst du deine Software frei zugänglich, jedoch nicht die Lizenz Codes.)


Ich weiß das es einige Bugs (etwas viele eher) geben wird, aber mich stört das nicht wirklich. Ich programmiere weil es eines meiner Hobbys ist und da es eben meine Software wäre, könnt ich eben alles darüber entscheiden ohne wirklich fragen zu müssen. Außerdem programmiere ich eben gerne und somit würde ich auch mehr dazu lernen punkto Bugs, also wie man diese am besten beseitigt und wie man damit umgeht und so. Und wenn das ganze dann wirklich fertig wäre könnt ich auch total stolz sein so etwas selbst entwickelt zu haben ^^.

Wegen dem Updater Bug:
Ich hab im Programm selber nochmal ein kleines Info-Center gemacht wo so ziemlich alles über das Programm drinnen stehen wird. Dort steht auch die 'Offizielle Download Seite'. Also falls mal etwas kaputt werden würde, könnte man dort dann auf die website gehen und sich das evt nochmal neu herunterladen oder von dort die aktuellste Version herunterladen. Ich hab das alles mit dem 'Lizenz-System' so vorgestellt, das auf einem Server sich Verzeichnisse erstellen die zB den Nickname oder den vollen Namen wie zB 'Marcel-Schalk'. Und da ich eher vor hätte das Programm also die Anfrage dafür und später mal die Bestellung per Hand zu bearbeiten und selber auf Gültigkeit prüfen. Es wäre mir so eben erstmals lieber und jeder würde zwar das gleiche Programm bekommen, aber immer mit einem anderen Passwort geschützt, dem Lizenzsschlüssel eben, und beim Installieren und beim Updaten werden diese Schlüssel immer aus einer Datei gelesen. Falls diese richtig sind und vorhanden, Installiert sich das Programm oder Updatet sich.

Wegen dem Paket Manager hab ich das schon erstmals geregelt

Das heißt wenn man die Bestellung macht und die richtig is würden wir oder ich eben demjenigen eine Email schreiben in dem der Lizenzschlüssel und Update Schlüssel steht. Der Lizenzschlüssel ist dafür, damit man nicht einfach so das Programm herunterladen und verwenden kann, und der Updatekey damit man, falls man es geschaft hat das Hauptprogramm zu verwenden, damit dieser nicht gratis die Updates bekommt. Deshalb gibt es diese zwei Schlüssel. Und wenn ein Programm gesperrt wird weil diejenige Person zB gegen die Nutzungsbedingungen verstoßen hat, kann dieses Verzeichniss am Server gelöscht werden und somit bekommt dieser keine neuen Updates mehr und vielleicht füge ich auch noch eine Funktion hinzu dass wenn eine bestimmte url oder datei nicht mehr exestiert, das sich das programm selber löscht.
 
Und wenn das ganze dann wirklich fertig wäre könnt ich auch total stolz sein so etwas selbst entwickelt zu haben :D.
Da hast du absolut recht! Wenn es um den Lernfaktor geht oder nur als Hobby, zieh ich meine Aussage komplett zurück :rolleyes:

Es wäre mir so eben erstmals lieber und jeder würde zwar das gleiche Programm bekommen, aber immer mit einem anderen Passwort geschützt, dem Lizenzsschlüssel eben, und beim Installieren und beim Updaten werden diese Schlüssel immer aus einer Datei gelesen. Falls diese richtig sind und vorhanden, Installiert sich das Programm oder Updatet sich.
Das ist doch schon mal ein guter Anfang!


und vielleicht füge ich auch noch eine Funktion hinzu dass wenn eine bestimmte url oder datei nicht mehr exestiert, das sich das programm selber löscht.
Das ist aber dreist :eek: :D
 
Zurück