Automatisierte Installation / Updates

  • Hallo Leute!
    Erstmal ein dickes HALLO, denn ich bin neu :D.

    Nun habe ich direkt eine bzw. zwei Fragen. (Ich bin wirklich unerfahren mit AutoIt, lerne aber normalerweise ziemlich schnell.)

    Folgende Situation: Ich möchte ein Tool erstellen das mehrere Programme mit nur einem Klick komplett selbstständig installiert. Dazu soll auch or jeder Installation auf Updates geprüft werden. Das ganze soll aber im HINTERGRUND laufen, also nur mit einer Statusanzeige und ohne das der Benutzer vor dem PC ales sieht.
    Ich betone ausdrücklich das dieses Tool nicht zum Mißbrauch gedacht ist und auch nie (zumindest nicht mit meiner Erlaubnis) dazu verwendet wird!

    1. Meine "Hauptfrage" ist eigentlich wie ich es hinkriege ein Programm zu installieren ohne das der Benutzer alles auf dem bildschirm mitverfolgen muss, also im "Hintergrund". Dabei wäre es auch schön wenn man nicht jeden Tastendruck bei den einzelnen Installern abschicken muss, sowie hier erklärt: http://translation.autoit.de/onlinehilfe/tu…nzip/winzip.htm.
    Wenn es nicht anders geht, dann ist das halt so :D.

    2. Wie kann ich ein Programm auf Updates überprüfen und dann eventuell erneuern. Die Frage bezieht sich sowohl auf bereits installierte Programme als auch auf die Installer.

    Ich bedanke mich schonmal im Voraus für eure Mühe mir zu antworten :D.

    "Das Schweigen ist nach der Rede die zweite Großmacht der Welt."
    Jean Baptiste Henri Lacordaire (1802-1861)

    Einmal editiert, zuletzt von sklaim (1. Januar 2014 um 17:50)

  • Da du keine konkreten Beispiele nennst eine allgemeine Antwort:

    Zu Frage 1:

    • Zum einen bieten die meisten Standardsetups sogenannte "silent" Parameter. Beispielhaft hier die Doku zum "Inno Setup": http://www.jrsoftware.org/ishelp/topic_setupcmdline.htm . Auch andere Hersteller von Installationsroutinen haben solche "silent" Funktionen.
    • Grundsätzlich kann Autoit Fenster unsichtbar machen
      [autoit]winsetstate("title","text",@SW_HIDE)[/autoit]
    • Buttons und andere Elemente eines (unsichtbaren) Fensters können sehr viel zuverlässiger mit den control Funktionen als mit Send oder mouseclick automatisiert werden (winzip Hilfebeispiel), der Benutzer kann problemlos nebenher weiterarbeiten.
      [autoit]
      controlclick
      controlcommand
      ;...
      [/autoit]

    Zu Frage 2:

    Hier ist keine allgemeingültige Aussage möglich. Da es in Windows keine zentrale Software und Versionsverwaltung gibt bringt jedes Poppelprogramm seine eigene Updateroutine mit. Es ist nahezu aussichtslos einen Updater zu schreiben der universal jedes Programm aktualisieren kann. Das fängt schon damit an, dass manche Hersteller noch nichteinmal direkte Downloads der neuesten Updates bereitstellen, sondern nur über ihren eigenen Updatedienst verfügbar machen. Wenn du ein größere Netzwerk verwalten musst, dann könnte man eine eigene Softwareverteilung realisieren, bei der du auf einem zentralen Server regelmässig aktuelle Versionen bereitstellst und alle Rechner im Netzwerk diese automatisch beziehen/installieren.

  • Vielen Dank schonmal für die schnele Antwort!

    Als Beispiel kannst du ruhig die Installation von dem Link nehmen, also WinZip.

    Zu 1: Könntest du mir eventuell anhand eines Beispiels erklären (z.B. WinZip) wie die control Funktionen funktionieren? Denk dir einfach du redest mit einem totalen Neuling.

    Zu 2: Ich habe mich wohl nicht ganz ausformuliert. Ich möchte keinen Universal-Updater machen sondern nur für spezielle Programme. D.h. wenn ich den Benutzer auswählen lasse das WinZip nach Updates überprüft werden soll und wenn es eine neuere Version gibt soll diese installiert werden, dann soll das explizit für WinZip gemacht werden,

    Sonst: Die winSetState Funktion, wie wende ich die auf Fenster an die bereits existieren (hier z.B. auch wieder WinZip).


    Danke, danke und danke trotzdem! :)

    "Das Schweigen ist nach der Rede die zweite Großmacht der Welt."
    Jean Baptiste Henri Lacordaire (1802-1861)

  • Nimms mir nicht Krum, aber wenn du dir die Hilfe zu winsetstate anschaust wirst du dort ein Beispiel finden, zwar nicht für winzip, aber für notepad.

    Konkret wird dort dieser Beispielcode gepostet:

    [autoit]


    WinSetState("[CLASS:Notepad]", "", @SW_HIDE)
    Sleep(3000)
    WinSetState("[CLASS:Notepad]", "", @SW_SHOW)

    [/autoit]

    Außerdem findest du dort einen weiterführenden Link bezüglich der hier verwendeten "Erweiterte Fenstertiteldefinition"

    Um diese erweiterten Details über ein Fenster herauszufinden nutzt man normalerweise das Tool "Au3info", welches du im Scite Editor unter Tools findest. Alternativ können auch die hier genannten Programme verwendet werden.

    Hier ist im groben die Vorgehensweise anhand von "Daemon Tools" erklärt: http://supportishere.com/how-to-automat…on-with-autoit/


    Was die Updategeschichte anbelangt... wie gesagt ich werd dir hier keine fertigen Code runterschreiben. Ich kann dir aber sagen wie du in etwa vorgehen musst, welche Informationen du brauchst und welche Funktionen dabei hilfreich sein könnten und von dir in der Hilfe Nachgeschlagen werden sollten:

    • Aktuelle Version ermitteln
      [autoit]
      regread ; z.B. die Registry Keys welche bei einer Installation für eine spätere Deinstallation angelegt werden (google danach)
      filegetversion
      [/autoit]
    • Die Herstellerseite auf eine aktuellere Version als die vorhandene überprüfen
      [autoit]
      Inetread
      ; ggf. auch die Funktionen der IE.au3 oder FF.au3
      ; oder aber die FTP Funktionen (Mozilla bietet z.B. einen strukturierten FTP Server auf dem man sich bedienen kann)
      ; ebenfalls nützlich diverse String Funktionen um die Versionsnummer aus dem Webseitenquelltext zu extrahieren
      _stringbetween
      stringsplit
      stringinstr
      ; sobald mithilfe der Stringfunktionen beide Versionsnummern ermittelt und ins selbe Format gebracht wurden können diese mit
      _versioncompare
      ; verglichen werden
      [/autoit]
    • Existiert eine neue Version muss diese heruntergeladen werden
      [autoit]
      Inetget
      ; oder FTP Funktionen...
      [/autoit]
    • Nach dem Download kommt die Installation, siehe meine Ausführungen weiter oben...
    • Fertig?

    Meiner Meinung nach viel zu aufwendig, da sich jederzeit etwas an der Webseite des Herstellers ändern kann und die selbe Prozedur bei jedem Hersteller etwas anderst sein wird.

    Einmal editiert, zuletzt von misterspeed (28. Dezember 2013 um 18:20)

  • Vielen Dank für die ausführliche Erklärung. Ich werde es mal austesten und ggf. weitere Fragen stellen. Ich denke aber mal das du mir schon ziemlich stark geholfen hast :).

    Ja du hast recht, das Ganze ist aufwendig. Aber für den Verwendungszweck für den ich das brauche ist das okay :) Da lohnt es sich auch wenn man das Programm jede Woche updaten muss.

    Danke!

    "Das Schweigen ist nach der Rede die zweite Großmacht der Welt."
    Jean Baptiste Henri Lacordaire (1802-1861)

  • Also ich habe das mit der "leisen" Installation nun geschafft. Allerdings verwende ich momentan eine .ini Datei um darin folgendes zu speichern:
    1. Den Pfad zum Setup
    2. Die Parameter um die Installation leise auszuführen

    Wie kann ich das umsetzten, das man selbst im Programm andere Programme hinzufügen kann, ohne extra so eine Datei anlegen zu müssen?

    Und wie kriege ich es hin, das ich bei der Combo keine Einträge eingebe sondern ein Array, wobei jedes Feld für einen Eintrag steht?

    Spoiler anzeigen
    [autoit]

    #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_Outfile=AutoInstaller.exe
    #AutoIt3Wrapper_UseUpx=n
    #AutoIt3Wrapper_Res_Language=1031
    #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
    #include <ButtonConstants.au3>
    #include <ComboConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <ProgressConstants.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #Region ### START Koda GUI section ### Form=c:\users\sascha\documents\autoit programme\autoinstaller\hauptfenster.kxf
    $Form1 = GUICreate("AutoInstaller", 201, 162, -1, -1)
    $Combo1 = GUICtrlCreateCombo("", 8, 8, 185, 25, BitOR($CBS_DROPDOWNLIST,$CBS_AUTOHSCROLL,$CBS_SORT))
    GUICtrlSetData(-1, "Mozilla Firefox|Google Chrome")
    $Button1 = GUICtrlCreateButton("Installieren", 8, 32, 185, 25)
    $Progress1 = GUICtrlCreateProgress(8, 136, 185, 17)
    $Button2 = GUICtrlCreateButton("Setup starten", 8, 56, 185, 25)
    $Button3 = GUICtrlCreateButton("Auf Updates prüfen", 8, 80, 185, 25)
    $Label1 = GUICtrlCreateLabel("Status:", 8, 115, 37, 17)
    $Label2 = GUICtrlCreateLabel("Fertig!", 48, 115, 150, 17)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

    [/autoit] [autoit][/autoit] [autoit]

    Global $wert = ""

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Combo1
    $wert = GUICtrlRead($Combo1)
    Case $Button1
    If $wert = "" Then
    MsgBox(262144, "Fehler", "Bite wählen Sie ein Programm aus der Liste aus um dieses installieren zu können!")
    Else
    GUICtrlSetData($Label2, "Initialisiere Setup...")
    GUICtrlSetData($Progress1, 33)
    $pfad = IniRead("data.ini", $wert, "setup", "")
    $parameter = IniRead("data.ini", $wert, "parameter", "")
    GUICtrlSetData($Label2, "Installiere...")
    GUICtrlSetData($Progress1, 66)

    [/autoit] [autoit][/autoit] [autoit]

    $prozess = ShellExecuteWait($pfad, $parameter)

    [/autoit] [autoit][/autoit] [autoit]

    GUICtrlSetData($Label2, "Erfolgreich installiert!")
    GUICtrlSetData($Progress1, 100)
    Sleep(3000)
    GUICtrlSetData($Label2, "Fertig!")
    GUICtrlSetData($Progress1, 0)
    EndIf
    Case $Button2
    If $wert = "" Then
    MsgBox(262144, "Fehler", "Bite wählen Sie ein Programm aus der Liste aus um dieses installieren zu können!")
    Else
    $pfad = IniRead("data.ini", $wert, "setup", "")
    ShellExecute($pfad)
    EndIf
    EndSwitch
    WEnd

    [/autoit]

    EDIT: Ich kriege die Datei auch nicht exportiert, denn es tritt folgender Fehler auf: "Error: Binary integrity can't be verified."
    Jemand eine Idee wie man das löst?

    "Das Schweigen ist nach der Rede die zweite Großmacht der Welt."
    Jean Baptiste Henri Lacordaire (1802-1861)

  • Wie kann ich das umsetzten, das man selbst im Programm andere Programme hinzufügen kann, ohne extra so eine Datei anlegen zu müssen?

    Naja irgendwo musst du diese Infos ja speichern, wenn sie beim nächsten Programmstart noch vorhanden sein sollen. Es liegt also nahe dafür eine ini Datei zu verwenden. Alternativ könnte man diese Dinge auch in der Registry speichern, was ich persönlich für unschöner halte, da die Daten so nicht mehr protabel und leicht editierbar sind. Ich sehe jedenfalls kein Argument gegen ein ini Datei solange die Daten nicht versteckt werden sollen, aber selbst das geht wunderbar mit einer ini Datei und den crypt Funktionen.

    Die ini aus dem Programm heraus zu erstellen ist ebenfalls kein Problem, falls das die eigentliche Frage war:

    • Du brauchst einen Button "Neues Programm hinzufügen"
    • Dieser Button fragt bei Klick z.B. per [autoit]inputbox()[/autoit] oder über ein separates Fenster mit Inputfeldern nach dem $Name, dem $Pfad und den $Parametern
    • Alle drei Informationen nutzt du dann mit
      [autoit]
      iniwrite("deine.ini",$Name,"setup",$Pfad)
      iniwrite("deine.ini",$Name,"parameter",$Parameter)
      [/autoit]
    • Fertig, deine ini sollte nun einen neuen Programm Eintrag haben
    • Anschließend solltest du den Inhalt des Dropdowns neu einlesen, damit das Programm sofort zur Auswahl verfügbar ist (siehe unten)


    Und wie kriege ich es hin, das ich bei der Combo keine Einträge eingebe sondern ein Array, wobei jedes Feld für einen Eintrag steht?

    Indem du einfach deine ini einließt und das Dropdownmenü mit diesen Informationen fütterst

    [autoit]


    $Combo1 = GUICtrlCreateCombo("", 8, 8, 185, 25, BitOR($CBS_DROPDOWNLIST,$CBS_AUTOHSCROLL,$CBS_SORT))

    [/autoit][autoit][/autoit][autoit]

    if fileexists("data.ini") then

    [/autoit][autoit][/autoit][autoit]

    ; ini Datei einlesen
    $aProgramme = inireadsectionnames("data.ini")

    [/autoit][autoit][/autoit][autoit]

    ; String für guictrlsetdata vorbereiten
    $sData = ""
    for $i = 1 to ubound($aProgramme)-1
    $sData &= $aProgramme[$i] & "|"
    next
    $sData = stringtrimright($sData,1)

    [/autoit][autoit][/autoit][autoit]

    ; Combo mit Daten befüllen
    GUICtrlSetData($Combo1, $sData)

    [/autoit][autoit][/autoit][autoit]

    EndIf

    [/autoit]


    EDIT: Ich kriege die Datei auch nicht exportiert, denn es tritt folgender Fehler auf: "Error: Binary integrity can't be verified."
    Jemand eine Idee wie man das löst?

    Keine Ahnung wovon du redest. Ich sehe in deinem Quellcode keine Exportfunktion für irgendetwas. Wo und bei was erscheint der Fehler denn?

  • Wow, echt nett von dir. So sollte es echt funktionieren. Man kann ja die ini einfach in nen Temp Ordner von Windows packen und dann noch eine Funktion einbauen die einem die ini auf den Desktop kopiert (zur Sicherung).

    Der Fehler tritt auf wenn ich über SciTe auf kompilieren gehe und dort alles einstelle. Danach kommt ein kleines Fenster mit Ladebalken, das aber nach der Hälfte abbricht und dann kommt halt diese Fehlermeldung in der Konsole von SciTe.

    "Das Schweigen ist nach der Rede die zweite Großmacht der Welt."
    Jean Baptiste Henri Lacordaire (1802-1861)

  • Okay klappt, danke :)

    Kann als [gelöst] markiert werden :). Vielen Dank an misterspeed!!!!!!

    "Das Schweigen ist nach der Rede die zweite Großmacht der Welt."
    Jean Baptiste Henri Lacordaire (1802-1861)

    Einmal editiert, zuletzt von sklaim (30. Dezember 2013 um 22:37)