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

Mit MSI Updates durchführen


15 replies to this topic

rene0905

rene0905
  • Full Members
  • 10 posts

Posted 06 February 2008 - 14:38

Hallo liebe Mitstreiter dies ist mein Ersterbeitrag hier in diesem Forum un dich hoffe doch auf starke Resonanz. In meiner Ausbildung stehe ich vor folgendem Problem.

Ich möchte ein Update verfahren Entwicklen, bis jetzt reicht mein Wissen noch nicht aus. Ich möchte eine MSI- oder eine EXE-Datei erstellen die vorinstallierte Software auf dem Rechner / auf Netzwerklaufwerken erkennt und die neu erhobenen Daten in das vorgeschriebene Verzeichniss kopiert.

Habe da auch schon erste Erfolge hinter mir, nämlich dass ich die Suche nach einem Eintrag in der Registry zur Startbedingung mache. In der Registry steht dann der Verzeichisspfad des installerierten Programms. Das funktioniert auch so weit einwandfrei, aber wird es im Einsatz bei dem kunden nicht funktionieren, da die bei Kunden bereits installierte Software keinerlei dieser Einträge vorgenommen hat, so werde ich demnach auch keine finden und das Update ist gescheitert.

Ich denke da an folgenden Ansatz: Die Startbedingung abändern, so dass die MSI/EXE-Datei nicht nach einem Registryeintrag suchen muss, sondern nach meiner Auszuführenden [Name].EXE auf dem Computer, sowie alle Netzwerklaufwerke. An dieser Stelle soll dann mein Update installiert werden. Das liebe Mitstreiter ist mein Problem. Ich bekomme es nicht hin.

Vielleicht gibt es ja einen ganz anderen Ansatz, der mir weiterhilft... Aber ich weis dass es nicht ClickOnce sein kann, weil das zu vielen Veränderungen bei Kunden führt.

KONKTETE FRAGE: Gibt es beim Studio ein Funktion, die den Pfad einer sich im Netzwerk/Computer befindlichen Datei ausliest, den Namen der Datei abschneidet und mir dann als String in eine Variable schreibt, die ich dann einem Benutzerdefiniertem Ordner übergebn kann?

Ich weis es sind viele Fragen und Möglichkeiten die offen stehen, doch bitte versucht mir tipps und Anregungen zu geben.

(P.S. für die Schönheit noch ne Frage: Wenn ich das Update installiere, wie bekomme ich es hin, das nicht zwei mal meine Software in "Start->Einstellungen->Systemsteuerung->Software" zu sehen ist?)


mit freundlich Grüßen aus Hamburg

René

Stefan Krueger

Stefan Krueger

    InstallSite.org

  • Administrators
  • 13,269 posts

Posted 08 February 2008 - 00:31

Für die Stringverarbeitung schreibst du am besten eine Custom Action.
Aber bedenke, dass das ABsuchen aller lokalen Festplatten schon sehr lange dauern kann. Das durchsuchen aller Netzwerklaufwerke noch länger, durchaus auch Stunden.

Wenn es einen Uninstall-Eintrag für die alte Version gibt, dann steht dort vielleicht auch das Zielverzeichnis drin. Schau doch mla in der Registry unter HKLM\Software\Microsoft\Windows\Current Version\Uninstall

rene0905

rene0905
  • Full Members
  • 10 posts

Posted 08 February 2008 - 12:02

Hallo Stefan,

im Vorwege schon einmal vielen Dank für das Aufzeigen, eines andern Lösungsweg. Leider werden von unserem Programm keiner dieser Einträge gesetzt.

Zur Dateisuche:

Wie gewährleiste ich, dass auch das ganze Neztwerk durchsucht wird?:

Gebe ich in den Eigenschaften der Startbedingung: Dateisuche beim Punkt "Folder" einfach keinen Wert an?

Weitere Möglichkeit:

Wenn ich eine Umgebungsvariable in Windows ertstelle, kann ich dann einfach dem propertiy wert des benutzterdefinierten Ordner den Name der Umgebungsbariable, bespielsweise "pfad_mein_programm" übergeben? Braucht man dafür Admin-Rechte? Wie sieht es mir mit der Erkennbarkeit im Netzwerk aus?

Zur Erkennung im Netzwerk:

Angenommen meine Software ist auf einem Server "xy" irgendwo in einer Domäne installiert...Wie komme ich an die Registrierungen auf diesem Server ran, so dass meinen Benutzerdefinierten Ordner füllen kann?

QUOTE
besten eine Custom Action
Wie kann ich denn eine Custom Action so einbauen, dass sie vor der Festsetzung des [TARGETDIR] anspringt. INSTALL/ROLLBACK etc liefern mir doch nur Zeitpunkte, an denen schon feststeht an welcher Stelle mein Programm installiert wird... oder?



Stefan Krueger

Stefan Krueger

    InstallSite.org

  • Administrators
  • 13,269 posts

Posted 11 February 2008 - 18:10

QUOTE
Wie gewährleiste ich, dass auch das ganze Neztwerk durchsucht wird?:
Gebe ich in den Eigenschaften der Startbedingung: Dateisuche beim Punkt "Folder" einfach keinen Wert an?

Dann werden alle *lokaen* Festplatten durchsucht. Netzlaufwerke musst du explizit angeben, oder gleich eine Custom Action zum Suchen schreiben.

Du kannst gesetzte Umgebungsvariablen auslesen, z.B.:
[%PATH]
Über eine Custom Action vom Typ 51 (Set a Property) kannst du dies einem Verzeichnis zuweisen (vor CostFinalize, besser vor CostInitialize). Verwende als Bedingung die Environment-Variable selbst (wie oben) damit die Aktion nur ausgeführt wird, wenn die Variable gesetzt ist.

QUOTE
Wie kann ich denn eine Custom Action so einbauen, dass sie vor der Festsetzung des [TARGETDIR] anspringt. INSTALL/ROLLBACK etc liefern mir doch nur Zeitpunkte, an denen schon feststeht an welcher Stelle mein Programm installiert wird... oder?

Oh, arbeitest du mit Visual Studio? Damit ist das nicht möglich. Du brauchst dafür ein "richtiges" MSI Authoring Programm.

rene0905

rene0905
  • Full Members
  • 10 posts

Posted 22 February 2008 - 12:23

Hallo Stefan,

vielen Dank für den Hinweis. Mir sind da leider etwas die Hände gebunden, da ich mit dem Microsoft Visual Studio .NET 2003 arbeiten muss.

Die Möglichkeiten die mir dort gegeben sind sollten doch für ein Updaten reichen oder nicht?

Ich habe mir überlegt, das ich die Funktionalitäten des Setups einschränke und die wichtigsten Änderungen über eine Programm durchführe, das nach der Installation gestartet wird... Jedoch stehe ich immer noch vor einem Problem:

Jetzt gehts erst richtig los: Wenn ich mir eine Software baue und diese Fertig ist bauen ich mir eine msi-Datei, die mir die verzeichniss-Struktur anlegt und alle Daten kopiert. Möchte ich jetzt aber ein Quartalsupdate einlaufen lassen, dass hauptsächlich meine auszuführende.exe ändert und vielleicht noch einige Anderen Dateien stehe ich immer noch vor dem Problem, dass wenn ich das neue MSI-Paket installiere, die alte Software gelöscht wird, wenn ich das Update installiere. Wenn ich nicht die ProductVersion erhöhe, kann ich noch nicht einmal das Update installieren, es kommt eine Fehlermeldung, das eine Software bereits installiert ist.

Mein Ziel ist es nur die "upzudatenden" Dateien ausliefern zu müssen.

Baue ich mir nun eine Software mit dem Namen "[meineSoftware]_Update", die die zu aktualisierenden Daten in das Verzeichniss der "alten" Software installiert, funktioniert dass auch. Deinstalliere ich nun aber "[meineSoftware]_Update" bleibt beispielsweise meine Exe. immer noch in der neueren Version im Ordner erhalten... Kannst du mir sagen, wie andere Entwickler es hinbekommen, dass an dieser Stelle dann auch nur noch die Dateien der alten Version wieder "zurück kommen"?

Fern ab davon noch ganz andere Fragen: Was ist eine Patch-Datei und wie erstelle ich sie? Heisst das Datei-Format .msp? Kann das Studio die eine Patch-Datei ertstellen. Diese Fragen würde ich nicht stellen würde mir das MSDN Aufschluss geben.

Schon mal im Vorraus vielen Dank!!!

mfg aus Hamburg René

Edited by rene0905, 22 February 2008 - 12:41.


Stefan Krueger

Stefan Krueger

    InstallSite.org

  • Administrators
  • 13,269 posts

Posted 25 February 2008 - 13:00

QUOTE
Mir sind da leider etwas die Hände gebunden, da ich mit dem Microsoft Visual Studio .NET 2003 arbeiten muss.
Welchen Sinn hat das? Wenn's um's Geld geht: es gibt auch kostenlose Tools.

QUOTE
wenn ich das neue MSI-Paket installiere, die alte Software gelöscht wird, wenn ich das Update installiere
Das liegt daran, dass Visual Studio nur sog. Major Upgrades erstellen kann, für dich wäre aber vermutlich ein sog. Minor Upgrade besser, und zwar in Form eines Patches.

QUOTE
Mein Ziel ist es nur die "upzudatenden" Dateien ausliefern zu müssen.
Genau das macht ein Patch. in Patch (.msp) ist die Differenz zwischen der alten und der neuen .msi Datei, d.h. er enthält nur die geänderten Dateien, ggf. sogar nur die geänderten Bytes.

QUOTE
n dieser Stelle dann auch nur noch die Dateien der alten Version wieder "zurück kommen"?
Auch hier heißt die Lösung: Patch.

QUOTE
Kann das Studio die eine Patch-Datei ertstellen.
Nein.

rene0905

rene0905
  • Full Members
  • 10 posts

Posted 26 February 2008 - 09:13

Hallo Stefan wieder einmal vielen Dank!

Das Patch-Verfahren ist ja eine sehr mühsame Angelegenheit. Ich habe es erfolgreich mit dem Programm AKInstaller (Demo/Testversion) hinbekommen. Die kostenlose Varinate ist mir geläufig, jedoch möchte ich das auch mit dem Studio erledigen können. Ich weis es ist mehr oder minder umständlich, aber folgendes:

Ich habe mir wie in der Anlietung aus dem MSDN (http://msdn2.microso...816(VS.85).aspx) mir meine zwei .msi Dateien gebastelt und entsprechende Ordner angelegt. Diese gefüllt mit den jeweiligen .msi Dateien und den "Source"-Dateien. Die template.pcp umgeschrieben und versucht den Befehl:

Msimsp.exe -s C:\test\Update\My-Update.PCP -p C:\test\Update\My-Update.msp -l C:\test\Update\Mylog.log

heraus kam die Fehlermeldung Failed to create Patch. error-code: 0xc00e5116

im Log steht folgendes:

QUOTE

***** Log starting: 2008-02-26 08:33:37 *****

Input-PCP path                    = 'C:\test\Update\MY-Update.PCP'
Patch-MSP path                    = 'C:\test\Update\MY-Update.msp'
Temp Folder                        = 'C:\DOKUME~1\rschulz\LOKALE~1\Temp\~PCW_TMP.TMP\'
Patch GUID                        = '{00000001-0003-0000-0000-123456789ABC}'
ListOfPatchGUIDsToReplace          = '<none>'
ListOfTargetProductCodes          = '*'
PatchSourceList                    = 'PatchSourceList'
AllowProductCodeMismatches        = '1'
AllowProductVersionMajorMismatches = '1'
OptimizePatchSizeForLargeFiles    = '<blank>'
ApiPatchingSymbolFlags            = '0x00000000'
MsiFileToUseToCreatePatchTables    = '<blank>'
SqlCmdToCreatePatchTable          = '<blank>'
SqlCmdToCreatePatchPackageTable    = '<blank>'
SqlCmdToCreateMsiPatchHeadersTable = '<blank>'
DontRemoveTempFolderWhenFinished  = '1'
IncludeWholeFilesOnly              = '0'
MinimumRequiredMsiVersion          = '<blank>'
SEQUENCE_DATA_GENERATION_DISABLED  = '<blank>'
AllowRemoval                      = '<blank>'

Using internal SQL cmd to create 'Patch' table.
Using internal SQL cmd to create 'PatchPackage' table.
Using internal SQL cmd to create 'MsiPatchHeaders' table.

  ERROR: UpgradedImages.MsiPath 'C:\test\Update\Upgraded\MY-Update.msi' is marked as having compressed files (PID_WORDCOUNT property of Summary Information stream). PatchWiz is unable to patch files compressed in a cabinet.

***** Log finishing: 2008-02-26 08:33:37 *****


Ich hab deine Antwort darauf schon gefunden, jedoch wird aus ihr nicht ersichtlich,was ich direkt tun soll.
Muss ich nun mein Studio (oder anderes Authoring-tool) aufmachen und gucken ob ich nun im Debug, oder im Release-Modus die msi Dateien erstelle? - um ein erfolgreiches Erstellen des Patches zu gewährleisten? Und wenn es etwas anderes ist, bitte kläre mich und den Rest der Welt... rolleyes.gif

Des Weiteren stehe ich auch noch vor dem Rätsel, warum es mit AKInstaller funktioniert hat, dort habe ich nämlich die gleichen .msi-Dateien benutzt wie beim Versuch mit dem Studio.

Na ja, wie auch immer noch eine Frage zu den Einstellungen einer Patch-Datei:

Im Dialog "Software hinzufügen / entfernen" wird mein bisheriger Patch als Update angezeigt. Gut! Aber ich habe nicht die Möglichkeit nur die Patch wieder zu Deinstallieren. Es gibt dafür einfach keinen Button. Weist du welche Häkchen umgelegt bzw. welche Tabellen in der Template.pcp gefüllt sein müssen, damit die Buttons "Ändern" & "Entfernen" erscheinen?

mfg René





rene0905

rene0905
  • Full Members
  • 10 posts

Posted 26 February 2008 - 10:22

Hallo Stefan ich bins noch einmal.

Ich habs mehr oder weniger geschafft manuell eine .msp-Datei zu erstellen.

Nutzt man das Studio 2003 muss man in den Eigenschaften des Setup folgend einstellen:

"Projekt-->Eigenschaften von Setupname"
Paketdateien = als lose dekomprimierte Dateien
Bootstrapper = keine
Komprimierung = keine

Dann funktioniert das Erstellen einer .msp Datei, aber ich erhalte folgende Fehlermeldung beim ausführen meiner datei: sad.gif
"es wurde keine gültige Reihenfolge für die Patches gefunden"

Nanu, wo in der pcp muss ich das nun wieder einstellen?

QUOTE
Das liegt daran, dass Visual Studio nur sog. Major Upgrades erstellen kann, für dich wäre aber vermutlich ein sog. Minor Upgrade besser, und zwar in Form eines Patches.


Wenn ich meine Patch-Datei ausführe, kommt die Frage nach der Deinstallation oder nach Reparieren. heisst das, dass ich ein "small Update" erstellt habe? Wie erstelle ich dann ein "minor Upgrade"? Habe ich beim Minor-Update die selben Funktionalitäten und ist das dann auch noch ein Patch?

Edited by rene0905, 26 February 2008 - 11:22.


akerl

akerl
  • Full Members
  • 104 posts

Posted 26 February 2008 - 11:23

Sorry, dass ich mich auch einmische, aber ein gewisses Grundverständnis für die Update- und Patchverfahren mit MSI sollten vorhanden sein, bevor versucht wird, diese in Produktivszenarien umzusetzen. Wie Stefan schon angemerkt hat, enthält VS keine Option zum Erstellen von Patches, lediglich für die Basispakete. Das PCP ist selbst zu erstellen und wenn kein Frontend vorhanden ist, sind die Einstellungen selbst zu treffen. Die Sequenzreihenfolge der Patches wird normalerweise automatisch erzeugt, wenn die Patchwiz.dll in entsprechender Version vorhanden ist, und die Generierung im PCP nicht deaktiviert wurde. Der Aufbau der PCP ist hier http://msdn2.microso...590(VS.85).aspx beschrieben. Zusätzlich existiert ein Whitepaper in dem die gesamte Sequenzierung erläutert wird (http://www.microsoft.com/downloads/details.aspx?familyid=ad7ac91e-2493-4549-ae6f-bf5e007c12a3&displaylang=en).

Andreas

Andreas Kerl

Inside Windows Installer 4.5
ISBN 3-86645-431-7


rene0905

rene0905
  • Full Members
  • 10 posts

Posted 26 February 2008 - 14:46

Hi Andreas,

bitte entschuldige dich nicht dafür, dass du produktive Beiträge machts.

Zu dir eine Frage: was würdest du machen, wenn du keine Ahnung hast wie etwas funktioniert, du aber wissen wilsste wie es geht? Keine Posts schreiben?

Wie auch immer, ich stehe halt am Anfang und in meiner Firma kann mir da leider keiner helfen, weil deartiges noch nie praktiziert wurde.

Davon mal ganz abgesehen lese ich auch das MSDN und alles was ich in die Finger bekomme...

Nun zum Thema, auf dem Link den du gespostet hast stehet geschrieben, das die Patchwiz.dll in Version4.0 vorliegen muss, um UiCreatePatchPackageEx (Patchwiz.dll) zu nutzten. Ich habe Version 3.1.4000.1830, in der es auch möglich sein soll Patches zu erstellen. Ich dem letzten Post gehe ich (falls es denn so herüber kommt) hauptsächlich auf das Problem mit der Sequenzierung ein, da ich erstmal nur testweise einen Patch "manuell" erstellen will. Ich verstehe schon das diese Sequenzierung nötig ist, doch kann ich sie beeinflussen? Wie auch immer ich werde mir nachher meine .pcp die AKInstaller generiert hat nehmen und mit meiner vergleichen.

Wieso kan AKInstaller auch komprimierte .msi-Dateien "patchen". Gibt es einen eintrag in einer Tabelle der es Msimsp.exe ermöglicht komprimierte Dateien zu patchen?

René

rene0905

rene0905
  • Full Members
  • 10 posts

Posted 26 February 2008 - 15:21

Hi Andreas,

kurze Frage: Hast du AKInstaller entwickelt? wegen der witzigen Namensgleichheit: AK = Andreas Kern.... rolleyes.gif

akerl

akerl
  • Full Members
  • 104 posts

Posted 26 February 2008 - 18:14

Hi René,

zunächst - ich habe AKInstaller nicht entwickelt; ich schreibe zwar auch Tools für den MSI, aber die sind noch nicht fertig. Vorwiegend schreibe ich Bücher und Fachartikel zum MSI (http://windows-insta...et/default.aspx).

Zu Deiner Frage. Natürlich ist es richtig, dass Du fragst - ich wollte das auch keinerzeit in Frage stellen. Ich finde bloß dass das Thema Patching einfach sehr komplex ist (In meinem Buch ca. 250 Seiten) und mein derzeitiger Job bringt es mit sich, dass ich sehr häufig Probleme wieder geradeziehen muss, die durch eine unüberlegte Service-Strategie hervorgerufen werden. Wie gesagt, ich wollte lediglich darauf hinweisen, dass zum Thema Patching so viel zu beachten ist, dass Posts nicht unbedingt dafür geeignet sind.

Im Prinzip kann jedes Tool zum Erzeugen von Patches mit komprimierten Dateien umgehen. Die Tools prüfen ob Target- und UpgradeImage im komprimierten oder unkomprimierten Zustand vorliegen (Flag im Summary Information Stream). Falls komprimiert wird silent eine administrative Installation (msiexec.exe /a) gestartet und das Ergebnis als neues Image verwendet. Für Dein Szenario ist es ausreichend mit VS komprimierte Images zu erzeugen und anschließend diese administrativ zu installieren, bevor sie als neue Quellen verwendet werden.

Gruß Andreas

P.S. Ich sehe dass Du aus Hamburg kommst; ich ziehe in 3 Wochen von MUC nach HH; wir können gerne beim Glas Wein über MSI, Patches etc. philosophieren. Meine Mailadresse findest Du auf meiner Homepage. smile.gif

Andreas Kerl

Inside Windows Installer 4.5
ISBN 3-86645-431-7


rene0905

rene0905
  • Full Members
  • 10 posts

Posted 27 February 2008 - 09:43

Moin moin,

Oh nein, das war nicht so gemeint.. Ich wollte dich keines Falls in die Lage bringen dich zu rechtfertigen, tut mir Leid:

QUOTE
ich wollte das auch keinerzeit in Frage stellen. Ich finde bloß dass das Thema Patching einfach sehr komplex ist (In meinem Buch ca. 250 Seiten) und mein ...


Ich gebe dir Recht, dass ich auch merke, dass die Recherche im Internet alleine nicht all zu viel hergibt. (Danke, für die Doku...) Besonders zum Thema Installation, da hier eine große Menge an Fakten die bei der Weitergabe zu Fehlern führen, mit einbezogen werden müssen.

Das mit dem Glas Wein (oder auch Bier) ist sicher eine Überlegung wert!!!

mfg René

rene0905

rene0905
  • Full Members
  • 10 posts

Posted 27 February 2008 - 10:38

An dieser Stelle noch eine Frage: kann nach dem Patchverfahren, wie beim Installationsverfahren ein "Commit" ausführen, so dass eine von mir erstellte .exe Datei aufgerufen wird, nach dem der Patch erfolgreich installiert wurde...


mfg René

akerl

akerl
  • Full Members
  • 104 posts

Posted 27 February 2008 - 18:06

Hi René,

ja das ist natürlich möglich. Du must in das UpgradedImage eine CustomAction vom Typ CommitCA integrieren die aus der InstallExecuteSequence aufgerufen wird. Der erstellte Patch (zwischen TargaetImage(s) und UpgradeImage) enthält dann diese Aktion. Du darfst aber beim Erstellen des Patches im PCP-File das Property OptimizeCA nicht setzen, da sonst die CA heraus optimiert wird.

Gruß
Andreas

Andreas Kerl

Inside Windows Installer 4.5
ISBN 3-86645-431-7


rene0905

rene0905
  • Full Members
  • 10 posts

Posted 28 February 2008 - 10:44

Oh super werde ich gleich einmal ausprobieren... Vielen Dank für den Tip....