Aktualisierung der Exe

  • Hallo,

    Überschrift des Themas ist evtl ein wenig unklar^^..

    Folgendes Problem: Ich habe auf einem Server meine Backup.exe Datei

    Eine Verknüpfung dorthin wird jedem Benutzer über GPO in das Autostart Verzeichnis gelegt.

    Möchte ich nun die Backup.exe austauschen und ein User hat diese derweil geöffnet habe ich keinen Zugriff darauf.

    Gibt es andere Möglichkeiten das Programm zu verteilen und offen für Updates zu halten? das Programm wrid in 99% der Fälle immer jemand offen haben, da wir auch über VPN von Zuhause aus arbeiten.

    Grüße

  • Nur so als Idee:
    Ich würde es so machen, dass ich z.B. in einer Text-Datei einen Pfad angeben würde, der auf die jeweilige Datei verweist. Ins Autostart packst du ne andere Exe, die den Pfad aus der txt ausliest und dann das Programm unter dem Pfad öffnet. Dadurch kannst du einfach ne andere Exe erstellen, den Dateinamen der zweiten exe geringfügig ändern und dann in die txt schreiben. Nach ner bestimmten Zeit, wenn keiner mehr auf die alte exe zugreift kannst du dann diese löschen, etc.

    Optional:
    Statt txt-datei kannst du auch nen Registry eintrag anlegen,... Da gibts mehrere Möglichkeiten.

    Viel Glück noch!

  • Folgende Idee (habe ich für einen Update so ähnlich umgesetzt):

    • Es wird nicht mehr mit der Exe aus dem Netzlaufwerk sondern mit einer lokalen Kopie gearbeitet!
    • Die .exe wird vom Netzlaufwerk gestartet - und merkt dieses anhand z.B. des Scriptpfades
    • Stellt diese fest das das sie von einem Netzlaufwerk gestartet wurde kopiert diese sich nach lokal (z.B. Temp)
    • und startet sich selbst aus der lokalen Version noch einmal, die Netzwerkwerk Variante beendet sich.
    • Die lokale Version macht den gleichen Test (oder du übergibst Ihr einen Schalter), stellt fest das alles ok ist und zeigt die GUI an.


    So kannst du die Netzwerk-variante austauschen und beim nächsten Start hat der Benutzer dann die neue Version.


    Für Fortgeschrittene und Dauerbenutzer: mach einen Test alle z.B. 60 Minuten ob eine neuere Version im Netzwerk liegt und benachrichtige den Benutzer ggf.


    Bernhard

  • Lass die Verknüpfungen im Autostart auf dieses kompilierte Skript verweisen. Es startet immer die neuste Exe deren Namen mit der Zeichenfolge "Backup" beginnt...

    Spoiler anzeigen
    [autoit]

    Local $LatestFile[2] = [-1, ""]
    processFiles("Backup*.exe", findLatest)
    If $LatestFile[0] = -1 Then Exit ConsoleWrite("no executables found!" & @LF)
    ShellExecute($LatestFile[1])

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

    Func findLatest($file)
    Local $age = FileGetTime($file, 1, 1)
    If $age > $LatestFile[0] Then
    $LatestFile[0] = $age
    $LatestFile[1] = $file
    EndIf
    EndFunc ;==>findLatest

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

    Func processFiles($pattern, $callback)
    Local $search = FileFindFirstFile($pattern), $result
    While True
    $file = FileFindNextFile($search)
    If @error Then ExitLoop
    $callback($file)
    WEnd
    EndFunc ;==>processFiles

    [/autoit]

    LG
    Christoph :)

  • Vielen Dank, gibt allerdings folgende Fehlermeldung : Hier

  • Du benötigst die neuste Autoit Version... ;)
    Wobei ich diese Lösung fast noch schöner finde:

    Spoiler anzeigen
    [autoit]

    #include <File.au3>
    Local $aFiles = _FileListToArray(@ScriptDir, "Backup*.exe", 1), $LatestFile

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

    For $f In $aFiles ; Wir suchen die neuste Version der Exe-Datei
    If FileGetTime($f, 1, 1) > FileGetTime($LatestFile, 1, 1) Then $LatestFile = $f
    Next

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

    If StringLen($LatestFile) = 0 Then Exit ConsoleWrite("no executables found" & @LF)
    ShellExecute($LatestFile) ; Wir starten die nesute Exe-Datei

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

    For $f In $aFiles ; Wir versuchen die alten Exe-Dateien zu löschen
    If $f <> $LatestFile Then FileDelete($f)
    Next

    [/autoit]

    Hier werden alte Versionen mit der Zeit gelöscht. (In dem Moment in dem ein User sich anmeldet und kein anderer die alte Version gestartet hat)

    LG
    Christoph :)

    Einmal editiert, zuletzt von BinDannMalWeg (24. April 2014 um 14:15)

  • hallo zusammen,

    ich mach das immer wie folgt!
    entweder über eine ini datei, die dann beim start auf dem server und local überprüft wird oder wie unten im script zu sehen, über die fileversion, die beim kompilieren vergeben wird!

    Beispiel des Inhaltes einer ini datei

    [INFO]
    VERSION=1.0.2.3

    der grobe Ablauf wäre wie folgt ...
    man startet das programm, dieses prüft nun die fileversion oder ini lokal und auf dem server und je nach ergebnis, wird eine updater exe gestartet, die dann die neue programmversion in den programmpfad kopiert ...

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

    _Programm_pruefen()

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

    Func _Programm_pruefen()

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

    ;---Fileversion abrufen------
    $sV1 = $vlw_path & "\Programm.exe" ; exe auf dem server
    $sV2 = "C:\Programm.exe" ;exe auf dem client

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

    $v1 = FileGetVersion($sV1) ;server File 1
    $v2 = FileGetVersion($sV2) ;local File 2

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

    $v1split = StringSplit($v1, ".")
    $v2split = StringSplit($v2, ".")

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

    ;----------- prüfe ----
    $spl_1 = $v1split[1] & $v1split[2] & $v1split[3] & $v1split[4]
    $spl_2 = $v2split[1] & $v2split[2] & $v2split[3] & $v2split[4]

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

    $spl_erg = $spl_2 - $spl_1

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

    If $spl_erg < 0 Then
    Msgbox(0,"",'... Update vorhanden ...')
    Sleep(1000)
    Run($Scriptdir & "\Updater.exe")
    Exit
    EndIf

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

    EndFunc

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


    ;updater
    Sleep(2000)

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

    $sV1 = "\\server\Programm.exe"

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

    FileCopy($sV1, "C:\Programm.exe",1)
    Sleep(2000)

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

    Run("C:\Programm.exe")

    [/autoit]

    du müsstest das halt dann umbauen, das dein updater die version prüft und die entsprechende exe dann lokal kopiert!
    somit hat jeder user beim neustart der anwendung die aktuelle version vom server ...

    gruß gmmg :)