Wiederherstellen von Dateien
Posted 15 February 2010 - 16:11
Ich habe zwar schon einmal angefragt, leider konnte aber bin jetzt meinen Problem noch nicht lösen.
ich möchte beim Update gerne ein paar Dateien (Kundenspezifische Daten) "wegsichern" und sie nach dem Update wieder einspielen.
Ich gehe nun wie folgt vor:
Ich habe ein Skript, das über „CopyFile“ die Dateien in ein separates Verzeichnis sichert. Diese Custom Action habe ich als Immediate Execution nach “AppSearch”, also ganz am Anfang eingebunden.
Zum Wiederherstellen habe ich auch ein Skript erstellt. Diese Custom Action habe ich als Deferred Execution vor “Start Services” eingebunden, da diese Dateien von einem Dienst benötigt werden.
Leider liegen die Dateien nach der Installation nicht da. Im Log wird leider auch nichts angezeigt.
Hab Ihr eine Idee, wie ich diese Anforderung umsetzten kann oder weiß jemand, wie man einen Dienst über ein Skript starten und stoppen kann?
Vielen Dank
Gruß Timo
Posted 16 February 2010 - 08:57
lasse dir doch z.B. in einer MessgeBox mal das Ergebnis des Copy-Befehls anzeigen
nResult = CopyFile(Quelle, Ziel);
SprintfBox(SEVERE,"","Result: %d %s %s",nResult,Quelle,Ziel);
==> siehe ReturnWerte von CopyFile
Falls Copyfile fehlschlägt kann man mit FormatMessage noch mehr über den Fehler erfahren:
if (nResult != 0 ) then
szTmp = FormatMessage(nResult);
MessageBox (szTmp,SEVERE);
endif;
In szTmp steht dann noch mehr über die Fehlernummer.
Warum müssen diese Dateien vorher gesichert werden
Grüße
Spitfyr
Ergänzung:
Versuche es mal so um einen Dienst zu starten bzw. zu beenden:
NET STOP "Name des Dienstes"
NET START "Name des Dienstes"
Im Script mit LaunchApp bzw. LaunchAppandWait
Probiere das mal in einer "Dos-Box" aus.
Edited by Spitfyr, 16 February 2010 - 14:02.
Posted 16 February 2010 - 12:53
mit
SprintfMsiLog ( szFormat [,arg] [,...] );
kannst du dir Meldungen in das MSI-Logfile ausgeben lassen. Dann bekommst du diese Meldungen immer dann wenn du zb. mit /L*V ein Logdatei erstellst. Daher kannst du die Einträge auch nach einem Test stehen lassen und auch beim Kunden bei Problemen was ausgeben.
Da du schreibst, dass dein Script ziemlich am Anfang läuft, könnte es sein, das die Verzeichniseigenschaften noch nicht aufgelöst wurden und das Script daher nicht greift.
Edited by ali, 16 February 2010 - 12:54.
Posted 16 February 2010 - 17:29
Ich habe gerade den Test gemacht. Leider ist das Ergebniss 0.
Habt ihr sonst noch eine Idee?
Die Dateien können Kundenspezifische Inhalte haben, deshalb muss sich sie leider wegsichern.
Gruß Timo
Posted 16 February 2010 - 17:41
QUOTE |
Hab Ihr eine Idee, wie ich diese Anforderung umsetzten kann oder weiß jemand, wie man einen Dienst über ein Skript starten und stoppen kann? |
Über ein Script habe ich das noch nicht gemacht, aber über eine Komponente. In den erweiterten Einstellungen einer Komponente kannst du Control-NT-Service auswählen und während der Installation steuern.
Posted 17 February 2010 - 08:17
QUOTE |
Die Dateien können Kundenspezifische Inhalte haben, deshalb muss sich sie leider wegsichern |
Lasse sie doch einfach stehen. Wenn du nicht Dateien mit dem gleichen Namen in deiner Installation hast, werden sie doch während der Installation nicht verändert. Das spart den ganzen Aufwand mit dem Hin- und Herkopieren.
Falls du Dateien mit gleichem Namen in deiner Installation haben setze in der Komponente doch einfach die Option "Never Overwrite" und schon werden die Kundendaten nie überschrieben
QUOTE |
Ich habe gerade den Test gemacht. Leider ist das Ergebniss 0. |
Was genau hast du gemacht? Welches Ergebnis ist 0? Die Rückmeldung ist sehr ungenau.
Welches Kopieren schlägt denn fehl? Das Wegsichern (werden die Dateien denn in den Sicherungsordner kopiert) oder das Zurückkopieren der Dateien? Hast du dir auch mal die Parameter von CopyFile mit ausgeben lassen, ob da auch schon die richtigen Werte drinstehen? Wie ali schon geschrieben hat stehen da evtl. noch keine vernünftigen Werte drin.
QUOTE |
Hab Ihr eine Idee, wie ich diese Anforderung umsetzten kann oder weiß jemand, wie man einen Dienst über ein Skript starten und stoppen kann? |
Versuche es mal so um einen Dienst zu starten bzw. zu beenden:
NET STOP "Name des Dienstes"
NET START "Name des Dienstes"
Im Script mit LaunchApp bzw. LaunchAppandWait
Probiere die NET Befehle mal in einer "Dos-Box" aus.
Posted 17 February 2010 - 11:37
Leider sind die Dateien variabel, es kann sein, dass der Kunde nur eine gewisse Anzahl an Dateien hat oder mehr Dateien wie normal hat.
ja, die Dateien werden in den Sicherungsordner kopiert. Nur das wiederherstellen geht nicht. Ja, die Parameter habe ich mir ausgeben lassen, "leider" sind die Parameter richtig.
CODE |
CopyFile (Sicherungclasses ^ "*.*", classes ^ "*.*"); |
Ich versuche den Dienst über folgende „Funktion“ zu stoppen und zu starten, leider öffnet sich nur die „cmd-Box“.
CODE |
LaunchAppAndWait ("CMD.EXE", "NET STOP Test-Service", NOWAIT); LaunchAppAndWait ("CMD.EXE", "NET START Test-Service ", NOWAIT); |
@ali: Das habe ich ja versucht, leider kopiert er dann die Dateien nicht.
Gruß Timo
Posted 17 February 2010 - 12:04
QUOTE |
Ich versuche den Dienst über folgende „Funktion“ zu stoppen und zu starten, leider öffnet sich nur die „cmd-Box“. |
Bei mir klappt das so einwandfrei:
CODE |
LaunchAppAndWait("net.exe","stop \"Name des Dienstes\"",WAIT); LaunchAppAndWait("net.exe","start \"Name des Dienstes\"",WAIT); |
Die \" sind wichtig falls im Name ein Blank vorkommt.
QUOTE |
Leider sind die Dateien variabel, es kann sein, dass der Kunde nur eine gewisse Anzahl an Dateien hat oder mehr Dateien wie normal hat. |
Werden Dateien mit diesem Namen auch installiert. Du musst ja vor dem Ausliefern des Setup wissen, welche Dateien gesichert werden.
Was passiert denn, wenn diese Dateien nicht gesichert werden???
QUOTE |
CopyFile (Sicherungclasses ^ "*.*", classes ^ "*.*"); |
Und das liefert als Returnwert eine 0?
nvReturn = CopyFile (Sicherungclasses ^ "*.*", classes ^ "*.*");
Posted 17 February 2010 - 12:31
Mittlerweile löse ich die Sicherungen über die MoveFiles und DuplicateFiles Table, da mir der Supportaufwand mit div. Kasperskys und FSecures die InstallScript unterdrücken zu heftig wurde.
Hast du denn schon mal getestet, ob dein ISScript unter den Programmen ausgeführt werden?
Posted 17 February 2010 - 13:01
QUOTE |
über die MoveFiles und DuplicateFiles Table |
Im Prinzip ist das besser,
aber ist es nicht so, dass man mit DuplicateFiles nur Dateien kopieren kann die
man auch vorher installiert hat? Man kann jedenfalls kein Quellverzeichnis angeben. Die Quelldagteein müssen Dateien aus der angegebenen Componente sein.
Bei MoveFiles kannst du Quelle und Ziel frei angeben.
Posted 17 February 2010 - 14:02
Also mit
CODE |
LaunchAppAndWait("net.exe","stop \"Name des Dienstes\"",WAIT); |
funktioniert es. Nun funktioniert die Rücksicherung auch ohne Probleme.
Ich habe das Skript jetzt als "Immediate Execution" nach "InstallFinalize" eingebunden.
Gibt es die Möglichkeit, dass das cmd Fenster nicht angezeigt wird?
Denkt ihr, dass es Probleme mit der UAC oder so geben kann?
Nur mal eine generelle Fragen, warum funktioniert der gleiche Code nicht vor der Option "StartServices"?
Danke für eure Rückmeldungen
Gruß Timo
Posted 17 February 2010 - 14:09
richtig, das geht nur mit Komponenten die man auch installiert bei DuplicateFiles.
Mit MoveFiles sichere ich Dateien weg, oder verschiebe diese während der Installation in ein anderes Zielverzeichnis das ich z.b über APPSearch ermittelt habe. Da tleohnard auch wieder zurücksichern will, könnte er zwar mit MoveFiles sichern, aber müsste evtl. mit Script zurücksichern. Das hätte aber den Vorteil, das mit MoveFiles die Sicherung läuft, auch wenn das Script nicht tut. Alte Versionen würden so nicht "unwiederbringbar" überschrieben, sondern werden vorher wenigstens gesichert.
evtl. könnte man auch eine dll nehmen der man die Propertys übergibt, um die Files zurückzuholen.
Posted 17 February 2010 - 14:21
Scriptfunktionen einfügen
Wenn du mal im Taskmanager während einer Instrallation die msiexec beobachtest siehst du, dass zeitweise 4 msiexec aktiv sind.
Einige laufen als "system"
Wenn du nun dein CopyFile aufrufst kann es sein, dass du evtl. nicht mehr der Benutzer bist, mit dem das Setup gestartet wurde.
Wenn du für net.exe einen Schalter findest, dass der "silent" ausgeführt wird kannst du das Fenster ausblenden (z.B wie regsvr32 /q). Ansonsten geht (glaube ich) das nicht.
Du kannst auch nicht den return-Wert überprüfen weil LaunchAppAndWait dir nur mitteilt, ob der Befehl ausgeführt wurde oder nicht. Du bekommst nicht den Returnwert von net.exe zurückgeliefert.
Das mit der UAC müsstet du mal probieren. Ggf. beim Setup hinterlegen, das man Adminrechte braucht (require Adminstrative Privilegs). Ich glaube dann kommt die UAC Abfrage am Anfang (bin mir aber nicht ganz sicher)
PS: Ich weiss immer noch nicht genau, warum die Dateien vorher gesichert werden müssen. Wenn Dateien vom/beim Kunden geändert worden sind, werden sie bei einer erneuten Installation nicht überschrieben. (Regel des Windows-Installer: Wenn Änderungsdatum neuer als Erstellungsdatum ==> niemals überschreiben)
Posted 17 February 2010 - 14:25
genau..aber tleohnard hatte ja das Problem nur mit dem Zurücksichern.
Aber da er nun den Dienst per Script steuern kann konnte er das Kopieren nach InstallFinalize legen!
Posted 17 February 2010 - 14:39
QUOTE |
Nur mal eine generelle Fragen, warum funktioniert der gleiche Code nicht vor der Option "StartServices"? |
Weil zu diesem Zeitpunkt das Installationsscript bereits läuft. Daher müsstest du hier dein CA auf "Deffered Execution in System Context" stellen.
QUOTE |
Denkt ihr, dass es Probleme mit der UAC oder so geben kann? |
Zum Ausführen würdest du für einen UAC wohl Admin Rechte benötigen, dafür müsstest du in den Release-Einstellungen unter "Setup.exe" den "Execution Level" auf "Administrator" setzen, damit das entsprechende Manifest in die Setup.exe eíngebunden wird, dass die Admin Rechte beim UAC anfordert. Der Anwender bekommt dann einen Dialog zum Bestätigen. Hilfreich ist es hier wenn du dafür deine Setup.exe digital signierst, sonst bekommt der Anwender die Nachricht, dass ein "unbakannter Herausgeber" was tun will.
@ spitfyr
QUOTE |
genau..aber tleohnard hatte ja das Problem nur mit dem Zurücksichern. |
jo, aber deswegen kann man ja auch über das Sichern noch mal reden, meiner Meinung nach ist die MoveFiles Aktion eben besser als Script, denn wenn die Installation läuft ohne das das Script läuft zb. wegen Kaspersky, dann sind die Dateien evtl. fürimmerwech
Edited by ali, 17 February 2010 - 14:42.
Posted 17 February 2010 - 15:04
mit den Virenscanner haben wir auch oft unsere Liebe Not
QUOTE |
jo, aber deswegen kann man ja auch über das Sichern noch mal reden, meiner Meinung nach ist die MoveFiles Aktion eben besser als Script |
Besser als Script sind die Tables alle Mal!
Aber er könnte nur zum Sichern MoveFiles verwenden. Das Zurücksichern muss er ja nach InstallFiles machen (und da ist Movefiles ja schon gelaufen).
@ali
Aber ich ich kann mir noch nicht den Grund vorstellen, warum tleohnard die Dateien nach InstallFiles zurücksichern will (er kopiert ja mit *.* alle Dateien eines Ordners).
Ich würde das Setup so konfigurieren, dass die Kundendaten nicht überschrieben werden (der Wndows-Installer überschreibt ja per default keine Daten, die vom Kunden geändert worden sind).
Wir benutzen MoveFiles auch gelegentlich für Backups (für den Fall der Fälle)
Posted 17 February 2010 - 15:23
Vielen Dank an euch 2 ihr habt mir sehr geholfen.
Jetzt läuft es ohne Probleme! (Auch UAC macht keine Probleme)
Ich habe noch herausgefunden, wenn ich die Option "LAAW_OPTION_HIDDEN" anwende, dass das „cmd-Fenster“ dann nicht kommt.
CODE |
LaunchAppAndWait("net.exe","start Dienst",LAAW_OPTION_WAIT|LAAW_OPTION_HIDDEN); |
QUOTE |
Ich würde das Setup so konfigurieren, dass die Kundendaten nicht überschrieben werden (der Wndows-Installer überschreibt ja per default keine Daten, die vom Kunden geändert worden sind). |
Ich habe die Dateinen und Ordner per "Dynamic File Linking" eingebunden, weil es sich um eine Webapplikation handelt mit tausenden Unterordnern. Deshalb kennt der Windows-Installer die Dateien nicht und überscheibt sie trotzdem oder?
Danke nochmals
Gruß Timo
Posted 17 February 2010 - 15:34
QUOTE |
Ich habe die Dateinen und Ordner per "Dynamic File Linking" eingebunden, weil es sich um eine Webapplikation handelt mit tausenden Unterordnern. Deshalb kennt der Windows-Installer die Dateien nicht und überscheibt sie trotzdem oder? |
Evtl. kannst du dir das mit dem Sichern sparen.
der Windows-Installer überschreibt Dateien nach festen Regeln.
- Wenn die Datei auf dem System unverändert ist (Erstellungsdatum=Änderungsdatum) wird eine Datei bei der Installation immer überschrieben
- Wenn die Datei verändert wurde (Änderungsdatum neuer als Erstellungsdatum) wird die Datei nie mehr überschrieben (Kundendaten)*. Du müsstet sie dann ggf. vorher mit RemoveFiles löschen damit sie installiert wird.
- Wenn eine Datei eine Versionsnummer hat wird diese verwendet.
*Wenn man dem nicht ganz vertraut macht man mit MoveFiles ein Backup
Kannst das ja mal in einer ruhigen Minute austesten
QUOTE |
Ich habe die Dateinen und Ordner per "Dynamic File Linking" eingebunden, weil es sich um eine Webapplikation handelt mit tausenden Unterordnern. Deshalb kennt der Windows-Installer die Dateien nicht und überscheibt sie trotzdem oder? |
Wenn dein Setup erstellt wurde, kennt der WindowsInstaller alle Dateien...er muss ja wissen was er installiert. Aber erst beim Setupbuild werden die Informationen zusammengestellt
Edited by Spitfyr, 17 February 2010 - 16:08.
Posted 17 February 2010 - 16:27
aber welche der beiden Methoden verwendest du?
dynamic-file-linking
Edited by ali, 17 February 2010 - 16:29.
Posted 17 February 2010 - 17:00
http://helpnet.flexe...stPractices.htm
da formartiert der den Link automatisch,
oder so
http : //helpnet.flexerasoftware.com/robo/projects/installshield15helplib/DFL-BestPractices.htm
Edited by ali, 17 February 2010 - 17:02.