Jump to content


This is a ready-only archive of the InstallSite Forum. You cannot post any new content here. / Dies ist ein Archiv des InstallSite Forums. Hier können keine neuen Beiträge veröffentlicht werden.
Photo

Wiederherstellen von Dateien


20 replies to this topic

tleonhard

tleonhard
  • Full Members
  • 59 posts

Posted 15 February 2010 - 16:11

Hallo,

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


Spitfyr

Spitfyr
  • Full Members
  • 162 posts

Posted 16 February 2010 - 08:57

Hallo,
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 huh.gif

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.


ali

ali
  • Full Members
  • 1,008 posts

Posted 16 February 2010 - 12:53

Hallo,
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.


tleonhard

tleonhard
  • Full Members
  • 59 posts

Posted 16 February 2010 - 17:29

Hi,

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

ali

ali
  • Full Members
  • 1,008 posts

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.

Spitfyr

Spitfyr
  • Full Members
  • 162 posts

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 biggrin.gif

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.


tleonhard

tleonhard
  • Full Members
  • 59 posts

Posted 17 February 2010 - 11:37

Hi,

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

Spitfyr

Spitfyr
  • Full Members
  • 162 posts

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 ^ "*.*");



ali

ali
  • Full Members
  • 1,008 posts

Posted 17 February 2010 - 12:31

ich meine das ich mit Wildcards und CopyFile Probleme hatte, ich habe das dann mit XCopyFile gelöst.
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?

Spitfyr

Spitfyr
  • Full Members
  • 162 posts

Posted 17 February 2010 - 13:01

@ali
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.

tleonhard

tleonhard
  • Full Members
  • 59 posts

Posted 17 February 2010 - 14:02

Hallo,

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





ali

ali
  • Full Members
  • 1,008 posts

Posted 17 February 2010 - 14:09

@spitfyr
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.

Spitfyr

Spitfyr
  • Full Members
  • 162 posts

Posted 17 February 2010 - 14:21

Zwischen InstallInitialize und InstallFinalize würde ich möglichst keine
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)



Spitfyr

Spitfyr
  • Full Members
  • 162 posts

Posted 17 February 2010 - 14:25

@ali:
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!


ali

ali
  • Full Members
  • 1,008 posts

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 wink.gif

Edited by ali, 17 February 2010 - 14:42.


Spitfyr

Spitfyr
  • Full Members
  • 162 posts

Posted 17 February 2010 - 15:04

@ali
mit den Virenscanner haben wir auch oft unsere Liebe Not mad.gif

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)

tleonhard

tleonhard
  • Full Members
  • 59 posts

Posted 17 February 2010 - 15:23

Hi,

Vielen Dank an euch 2 ihr habt mir sehr geholfen.
Jetzt läuft es ohne Probleme! (Auch UAC macht keine Probleme) biggrin.gif

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

Spitfyr

Spitfyr
  • Full Members
  • 162 posts

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 dry.gif

Kannst das ja mal in einer ruhigen Minute austesten cool.gif



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.


ali

ali
  • Full Members
  • 1,008 posts

Posted 17 February 2010 - 16:27

mit dem dynamic file linking hatte ich auch schon mal meine Probleme beim Major Upgrade da hatte ich glaube ich ausversehen den Komponentencode geändert. ph34r.gif

aber welche der beiden Methoden verwendest du?
dynamic-file-linking

Edited by ali, 17 February 2010 - 16:29.


tleonhard

tleonhard
  • Full Members
  • 59 posts

Posted 17 February 2010 - 16:46

Leider geht dein Link nicht. Welche Optionen gibt es denn da?

ali

ali
  • Full Members
  • 1,008 posts

Posted 17 February 2010 - 17:00

hm, mach mal mit cut&paste
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.