Beruflich Dokumente
Kultur Dokumente
Inhaltsverzeichnis
Einleitung
Fr wen ist dieses Buch gedacht?
Beispieldateien
Support
Danksagung
1. Grundlagen der Windows Installer-Technologie
berblick
Aufbau und Struktur des Installationspaketes
Physische Betrachtung
Logische Betrachtung
Installationsarten und Installationsphasen
Clientinstallation
Administrative Installation
Angekndigte Installation
Installationsphasen
Analyse des Installationsprozesses
Aktivitten des Client-Prozesses
Aktivitten im Server-Prozess
Inhalt der Skriptdateien
Individuelle Erweiterungen
Custom Action-Server
Grundlegende Betrachtungen
Fazit
2. Windows Installer-XML
Installation und Integration
Hierarchische Strukturen
Installation von Windows Installer-XML
Integration in Visual Studio
Dokumentenstruktur und Sprachmerkmale
Grundlegende Deklarationen
Manueller und automatisierter Buildprozess
Variablen und Prprozessoren
2
9
10
10
11
11
14
14
17
17
28
32
33
37
38
39
41
42
46
52
58
58
63
71
72
72
73
74
75
77
77
81
83
Inhaltsverzeichnis
Lokalisierte Installationspakete
Fragmente
Modularitt und Zusammenspiel
Erzeugen der Quelldateien
Kompilieren und Linken
Erweiterte Erstellvorgnge
Erweiterungsbibliotheken
Arten und Verwendung
Individuelle Erweiterungsbibliothek
Bibliothek zur Darstellung einer Benutzeroberflche
Komplexe Erweiterungsbibliotheken
Fazit
3. Windows Installer und 64-Bit-Betriebssysteme
Architekturen
Dateisystem und Systemregistrierung
WOW64-Subsystem
Verhalten bei der Installation
Eigenschaften
Allgemeine Hinweise
Benutzerdefinierte Aktionen
Richtlinien
Fazit
4. Deployment Tools Foundation
Allgemeine Informationen
Funktionalitt
Installation und Bestandteile
Struktur und Objektmodell
Datenbank und Session
Inventarisierung
Benutzerdefinierte Aktionen
Interne Ablufe
Erstellen einer benutzerdefinierten Aktion
Optimierung des Erstellungsvorgangs
Debuggen
Erweiterte Implementierungen
Fazit
5. Benutzerkontensteuerung in Windows Vista und Windows Server 2008
88
91
93
96
103
109
117
117
119
120
122
131
132
132
136
136
140
143
144
144
146
148
149
149
149
150
151
153
158
161
162
163
166
168
169
174
176
Inhaltsverzeichnis
berblick ber den Windows Installer 4.0
Sicherheit
Sicherheitskontext
Zugriffstoken unter Windows Vista
Anwendungen fr Windows Vista und Windows Server 2008
Absicherung des Systems
Virtualisierung
Installationen in geschtzten Umgebungen
Verwaltete und privilegierte Installationen
Installationen unter Windows Vista und Windows Server 2008
Interaktion mit der Benutzerkontensteuerung
Verwenden eines Bootstrappers
Standardbenutzerinstallationen
Anwenden von Windows Installer-Patches
Kompatibilitt mit lteren Installer-Versionen
Installation fr den Benutzer oder fr den Computer
Voraussetzungen fr die Installation
Absicherung der Installationsquellen
Benutzerdefinierte Aktionen
Windows Installer und der Schild
Identifizieren von Problemquellen
Fazit
6. Computerneustarts im Installationsprozess
Ursachen fr einen Computerneustart
Neustarts im Installationsprozess
Kontrollieren und berwachen des Neustartverhaltens
Neustart durch Dateien in Verwendung
Ersetzen von verwendeten Dateien
Startvorgang des Systems
Unterdrcken des Computerneustarts
Funktionsweise des Neustart-Managers
Identifikation der verwendeten Ressourcen
Beenden und Starten der Prozesse
Verwendung des Neustart-Managers durch den Windows Installer
Voraussetzungen fr die Verwendung des Neustart-Managers
Interaktion mit dem Windows Installer
Benutzerdefinierte Aktionen
176
178
179
184
188
191
197
201
204
208
208
210
212
216
224
224
227
230
230
233
238
241
243
243
245
245
251
255
256
258
260
264
268
272
273
279
282
Inhaltsverzeichnis
Problemfall Benutzerkontensteuerung
Bootstrapper
Fazit
7. Sicherheit, Sprachen und Troubleshooting
Windows-Ressourcenschutz
Funktionsweise
Programmtechnischer Zugriff
Installation
Installationsprotokoll
Protokollierung aus dem Paket
Informationen im Protokoll
Strategien fr die Fehlersuche
Mehrsprachige Benutzeroberflchen
Mehrsprachige Anwendung
Ressource-Bibliotheken
Erstellen des Installationspaketes
Fazit
8. Paketbergreifende Transaktionen
berblick ber den Windows Installer 4.5
Trends in der Softwareinstallation
Konkurrierende Installationen
Mergemodule
Bootstrapper
Funktionalitt des Chainers
Transaktionen
Transaktionalitt des Windows Installers
Phasen der Installation
Transaktionen mit dem Installer 4.5
Programmtechnische Implementierungen
Beschreibung der Funktionen
Installationen und Konfigurationen
Transaktionsklasse
Eingebetteter Chainer
Rollback- und Neustart Verhalten
Szenarien fr einen Rollback
Neustarts und Transaktionen
Einbindung der Benutzerkontensteuerung
288
290
291
293
293
294
295
297
298
299
301
305
307
308
310
314
318
320
320
323
323
325
327
334
338
339
340
343
345
346
349
351
353
357
358
362
366
Inhaltsverzeichnis
Fazit
9. Externe Benutzeroberflchen
Grnde fr die Verwendung
Vorgehensweise und Nutzung
Registrieren der externen Oberflche
Darstellung der internen Oberflche
Programmtechnische Umsetzung
Beeinflussung des Installationsprozesses
Darstellung der Informationen
Integrierte externe Benutzeroberflche
Integration
Beschreibung der Funktionen
32-Bit und 64-Bit
Deaktivieren der integrierten Benutzeroberflche
Interne Ablufe
Anwendungsszenarien
Fazit
10. Optimierungen im Servicemodell
Softwareaktualisierungen
Minimale Aktualisierungen
Komplexe Aktualisierungen
Struktur und Verwendung von Patchpaketen
Anwenden von Patches
Anatomie eines Patches
Anwendungsreihenfolge von Patches
Erstellen von Patches
Klassischer Lsungsansatz
Objektbibliothek patchwiz.dll
Programmtechnischer Zugriff auf die Metainformationen
Optimierungen
Pseudoinstallierte Patches
Deinstallation von Patches
Fazit
Anhang A: Glossar
Anhang B: Tools und Anwendungen fr den Windows Installer
Windows Installer-XML
Windows Installer-SDK
367
368
369
371
371
375
377
378
381
392
393
396
404
405
405
411
415
416
416
420
424
425
425
427
432
434
434
437
448
450
451
456
464
466
470
470
470
Orca
Deployment Tools Foundation
InstEd
Windows NT DocFile Viewer
SharpDevelop
Microsoft Cabinet Software Development Kit
Bootstrapper Manifest-Generator
IExpress
MSI LogfileAnalyzer
Windows Installer-Suite 2008
Windows Installer-Debugger 2008
Logo Testing Tools for Windows
Visual Studio 2008
Anhang C: Limitierungen
Anhang D: Aktualisierung von .NET Assemblies
Anhang E: Datenbanktabellen des Windows Installers 4.5
Anhang F: Systemrichtlinien
Computerkonfiguration
Benutzerkonfiguration
Anhang G: Automatische Reparaturen und das Microsoft Active Setup
Automatische Reparatur
Halbautomatische Vorgehensweise
Anhang H: Struktur und Inhalt des Beispielarchivs
Stichwortverzeichnis
Der Autor
470
470
470
470
471
471
471
471
471
471
471
471
472
473
475
478
487
487
490
492
492
493
495
498
511
Einleitung
Einleitung
9
10
11
11
Die Softwareinstallation hat sich seit dem Erscheinen des Windows Installers im Jahre 1999 extrem
gewandelt. Zum damaligen Zeitpunkt waren monolithische Anwendungen stark verbreitet, so dass zur
Installation auch groe und komplexe Installationspakete verwendet wurden. Hieraus ergab sich die bis
heute gltige Anwendungsstrategie des Windows Installers, die mit One-Package-One-Product
umschrieben wird. Diese Strategie besagt, dass ein Produkt durch ein Windows Installer-Paket
dargestellt wird, also zur Installation eines Produktes somit ein Paket bentigt wird. Aktuell sind neue
Trends in der Softwareinstallation zu verzeichnen. Ein Produkt besteht heutzutage nicht mehr nur aus
einem Paket, sondern aus einer Vielzahl von Paketen, die als Micro-Packages bezeichnet werden.
Einen weiteren gravierenden Wandel hat es im Sicherheitsbewusstsein der Anwender und der
Hersteller gegeben. Hieraus entstanden sind Betriebssysteme und Anwendungen die in der aktuellen
Generation ber einen sehr hohen Sicherheitsstandard verfgen, der natrlich auch im Rahmen des
Installationsprozesses zu bercksichtigen ist.
Dieses Buch widmet sich natrlich den sicherheitsrelevanten Implementierungen und den neuen
Funktionen des Windows Installer 4.5, wobei die als Multi-Package-Transaktion bezeichnete
Funktionalitt einen sehr hohen Stellenwert einnimmt. Aber begonnen wird an anderer Stelle. Im
ersten Teil des Buches geht es um allgemeine Informationen zum Windows Installer. Hier werden
Themen wie der Installationsprozess, das Installationspaket und benutzerdefinierte Aktionen erlutert.
Abgerundet wird dieser Teil des Buches mit einer detaillierten Betrachtung der Installationen auf 64Bit-Plattformen, sowie den Toolsammlungen Windows Installer-XML und Deployment Tools
Foundation. Der zweite Teil des Buches ist der Installation unter den Betriebssystemen Windows Vista
und Windows Server 2008 gewidmet. Hierbei werden Technologien wie die Benutzerkontensteuerung,
der Neustart-Manager und der Windows-Ressourcenschutz betrachtet und die Auswirkungen dieser
Funktionalitten auf den Installationsprozess skizziert. Darber hinaus werden an dieser Stelle auch
Szenarien fr eine effektive Problemanalyse vorgestellt und Lsungen fr die Erstellung und
Installation von mehrsprachigen Anwendungen erarbeitet. Der letze Teil dieses Buches befasst sich
schlielich mit den neuen Funktionen des Windows Installer 4.5. Den Schwerpunkt bilden hierbei
natrlich die paketbergreifenden Transaktionen mit all Ihren Ausprgungen und Facetten, wobei die
Verwendung einer zentralen Benutzeroberflche eine relevante Rolle einnimmt. Den Abschluss nicht
nur dieses Teils, sondern des ganzen Buches bilden die Windows Installer-Patches, wobei der
Schwerpunkt auf den Optimierungen im Servicemodell und im Erstellvorgang liegt. Zustzlich
erhalten Sie noch Informationen zu Technologien, die nicht direkt mit dem Windows Installer in
Verbindung stehen, diesen allerdings in bestimmten Szenarien ergnzen und somit den
Einleitung
Installationsprozess einfacher und effektiver gestalten.
Beispieldateien
Der Quellcode fr alle Rezepte des Buchs ist online unter http://www.microsoft-press.de/support.asp
verfgbar. Tragen Sie im Eingabefeld fr die ISBN-Nummer die Zahl 431 ein. Klicken Sie auf Suchen.
Nach kurzer Wartezeit erscheint das Suchergebnis. Klicken Sie im Suchergebnis auf den angezeigten
Link. Klicken Sie auf den Link neben Downloads und speichern Sie die Datei auf Ihrem Computer.
Whlen Sie dabei direkt den Ordner, in den Sie die bungsdateien installieren mchten.
Die Beispielanwendungen wurden mit Microsoft Visual Studio 2008 erstellt. Einige Beispiele wurden
so konfiguriert, dass sie mit dem Microsoft .NET Framework 2.0 verwendet werden knnen. Andere
Beispiele verwenden hingegen neue Funktionalitten, wie beispielsweise LINQ (Language Integrated
Query), so dass diese die Version 3.5 des Microsoft .NET Frameworks voraussetzen. Die
Installationsdateien wurden ausschlielich mit Anwendungen der Toolsammlung Windows InstallerXML erstellt, die wiederum auch das Microsoft .NET Framework 2.0 bentigt. Zur manuellem
Erstellung der Installationsausgaben ist es erforderlich, dass der Ordner, der die Binrdateien von
Windows Installer-XML enthlt, durch die Umgebungsvariable MSIWIX ansprechbar ist. Weiterhin ist
der Ordner ebenfalls der Umgebungsvariablen Path anzufgen.
Die Beispiele und bungen aus Teil A sind allgemeiner Natur und verlangen keine explizite Version
des Windows Installers und auch kein spezielles Betriebssystem. Anders verhlt es sich bei den
Szenarien aus Teil B. Hierfr sind die Betriebssysteme Windows Vista oder Windows Server 2008,
sowie der Windows Installer in der Version 4.0 und hher erforderlich. In Teil C werden letztlich die
Funktionalitten des Windows Installer 4.5 erlutert, so dass diese Version zur Verwendung der
Beispiele auch erforderlich ist. Als Betriebssysteme knnen hierbei Windows XP, Windows Vista,
Windows Server 2003 und Windows Server 2008 verwendet werden.
10
Einleitung
Support
Es wurden alle Anstrengungen unternommen, um die Korrektheit dieses Buches zu gewhrleisten.
Microsoft Press bietet Kommentare und Korrekturen fr seine Bcher im Web unter
http://www.microsoft-press.de/support.asp an.
Wenn Sie Kommentare, Fragen oder Ideen zu diesem Buch haben, senden Sie diese bitte per E-Mail an
presscd@microsoft.com oder per Post an:
Microsoft Press Deutschland
Konrad-Zuse-Strae 1
85716 Unterschleiheim
Bitte beachten Sie, dass ber diese Adressen kein Support fr Microsoft-Produkte angeboten wird.
Wenn Sie Hilfe zu Microsoft-Produkten bentigen, kontaktieren Sie bitte den Microsoft Online
Support unter http://support.microsoft.com. Wenn Sie Support fr die Tools von Drittanbietern
bentigen, wenden Sie sich bitte an den jeweiligen Hersteller des Tools. Verwenden Sie dazu die
Website, die auf der Download-Seite des entsprechenden Tools aufgefhrt ist.
Danksagung
Ein Buch zu schreiben ist sehr hufig eine einsame Angelegenheit, dennoch sind eine Vielzahl von
Personen daran beteiligt. Dieses Buch stellt da keine Ausnahme dar, denn es wre ohne die
Untersttzung von zahlreichen groartigen Personen nicht realisierbar gewesen. Das fngt zunchst auf
der technischen und fachlichen Ebene an, geht ber die gestalterische Ebene und endet letztlich auf der
sozialen Ebene.
Wie bei meinem letzten Buch mchte ich mich zunchst bei Carolyn Napier von der Microsoft
Corporation bedanken. Carolyn hat mir unermdlich alle Fragen zu der Windows InstallerTechnologie beantwortet und darber hinaus viele Lsungsanstze gegeben, die nirgendwo
dokumentiert waren und auf die man alleine nicht gekommen wre. Danke meinen Kolleginnen und
Kollegen vom Premier Support for Developers der Microsoft Deutschland GmbH, die mich in allen
Belangen untersttzt haben. Ein besonderes Dankeschn gilt Franz Robeller fr die Informationen zur
64-Bit-Technologie und Oliver Niehus fr die Antworten zu Windows Vista und zur
Benutzerkontensteuerung. Danke auch an Marcel Kulicke, der mich durch geschickte Fragen in den
letzten Monaten immer wieder gezwungen hat, mich noch intensiver mit bestimmten Themen zu
befassen. Vielen Dank an Hans Stanglmayr und Daniel von Wilcken, die mich immer untersttzt und
motiviert haben.
Ich danke allen Mitarbeitern von Microsoft Press, allen voran Thomas Braun-Wiesholler, Florian
Helmchen und Thomas Pohlmann, die mir geholfen haben dieses Buch zu schreiben und die mir
wertvolle Tipps fr die Gestaltung und den Aufbau des Buches gegeben haben. Ein Dank gilt auch
meinem Fachlektor Georg Weiherer, der es bereits bei meinen frheren Bchern verstanden hat, die
eigenwilligen Formulierungen, Gedankensprnge und Intentionen eines Programmierers in ein lesbares
Format umzuwandeln.
Danke auch meiner groartigen Tochter Daria, die mir aus der Entfernung immer wieder Mut
zugesprochen hat und dieses Mal, meine Nerven nicht zu sehr strapaziert hat. Ein besonderes und
11
Einleitung
riesen groes Danke gilt meiner ber alles geliebte Ehefrau, Partnerin und Freundin Ute, ohne deren
Hilfe dieses Buch nur in der Phantasie existieren wrde.
12
Teil A
Allgemeines zum
Windows Installer
Kapitel 1
berblick
Aufbau und Struktur des Installationspaketes
Installationsarten und Installationsphasen
Analyse des Installationsprozesses
Individuelle Erweiterungen
Fazit
14
17
32
41
58
71
Erstklassige Software zu entwickeln ist die eine Seite der Medaille, ein professionelles Setup dafr zu
erstellen ist hingegen die andere Seite. Hufig werden sehr viele Ressourcen und Innovationen in die
Entwicklung neuer Software investiert, aber die Erstellung eines professionellen Setups wird nicht mit
dem gleichen Engagement betrieben, obwohl das eigentlich erforderlich wre. Das Setup ist der erste
Berhrungspunkt des Kunden mit der neuen Software. Ein nicht funktionierendes oder einfach
ausgedrckt ein schlechtes Setup, lsst die beste Anwendung nur in einem migen Licht erstrahlen.
Das muss nicht so sein, denn mit Hilfe des Windows Installers und einiger zustzlicher Tools ist es
keine Hexerei, ein professionelles und zukunftsorientiertes Setup zu erstellen.
berblick
Der Windows Installer ist eine Technologie zur Verwaltung des Installationsstatus einer oder mehrerer
Anwendungen. Es ist damit mglich eine Anwendung erstmalig auf einem System zu installieren, den
Funktionsumfang der Anwendung zu verndern, die Installation zu reparieren und zu aktualisieren und
am Ende des Produktlebenszyklus dieses zu deinstallieren. Der Windows Installer wurde erstmalig
1999 zur Installation von Microsoft Office 2000 eingesetzt. Hierzu war es erforderlich, den Windows
Installer zunchst selbst zu installieren. Heutzutage ist der Windows Installer integraler Bestandteil des
Betriebssystems, wodurch er bei der Installation vorausgesetzt werden kann.
Derzeitig existieren unterschiedliche Versionen des Windows Installers mit unterschiedlichen
Funktionserweiterungen. Die Betriebssysteme Windows Vista und Windows Server 2008 enthalten
standardmig den Windows Installer der Version 4.0, die Betriebssysteme Windows XP und
Windows Server 2003 setzen hingegen standardmig den Windows Installer 3.1 ein. Fr alle die
gerade genannten Betriebssysteme steht der Windows Installer 4.5 als optionales Installationspaket zur
Verfgung. Fr Windows 2000 steht der Windows Installer 3.1 und fr die lteren Betriebssysteme
Windows NT 4.0 und Windows 9x die Windows Installer-Version 2.0 zur Verfgung. Eine
Aufstellung aller Windows Installer-Versionen zeigt Tabelle 1.1.
14
Kapitel 1
Release
Version
Anmerkungen
1.0.5104.0
1.10.1029.0
1.10.1029.1
1.11.1314.0
1.11.2405.0
1.20.1410.0
1.20.1827.1
2.0.2600.0
2.0.2600.1
2.0.2600.2
2.0.2600.1106
2.0.2600.1183
2.0.3754.0
3.0.3790.2180
3.1.4000.1823
3.1.4000.1830
3.1.4000.2435
4.0.6000.16386
4.0.6001.18000
4.5.6000.18000
4.5.6001.18000
Heutige Anwendungsinstallationen sind durch den Umstand geprgt, dass sie vornehmlich auf der
Windows Installer-Technologie basieren. Die Begeisterung fr diese Technologie hat in den letzten
Jahren extrem zugenommen, so dass sie heute durchaus als State of the Art bezeichnet werden kann.
Derzeitig existieren aber auch noch andere Installationsformen, die als skriptbasierte
Installationssysteme umschrieben werden knnen. Ein hierauf beruhender Installationsprozess ist
dadurch gekennzeichnet, dass die Installationssoftware eine eigenstndige Anwendung darstellt, die
sowohl die Installationslogik als auch die Beschreibung der Installationsttigkeiten enthlt. Eine
Persnliche Ausfertigung fr Martin Martinsson
15
Kapitel 1
eigenstndige Anwendung ist jedoch hinsichtlich des Zugriffs auf systeminterne Funktionen
beschrnkt und bietet auch nicht den Lsungsansatz fr ein systemweit konsistentes
Installationsspektrum. Jeder, der mit skriptbasierten Installationssystemen bereits zu tun hatte kennt die
Phnomene, dass durch die Deinstallation einer Anwendung eine andere Anwendung in einen nicht
funktionsfhigen Zustand versetzt wurde.
Die Windows Installer-Technologie beruht hingegen auf einer Trennung zwischen der
Installationslogik und der Beschreibung der Installationsttigkeiten. Die Installationslogik befindet sich
in einer Komponente des Betriebssystems, die als Windows Installer-Service bezeichnet wird. Der
Windows Installer-Service ist fr jede zu installierende Anwendung identisch und stellt damit sicher,
dass fr alle Installationen identische Regeln und Verfahren gelten. Er ist zudem das einzige Element
im Installationsprozess, das nderungen am System vornehmen kann. Die Beschreibung der
Installationsttigkeiten wird hingegen in einer Datei vorgenommen, die als Windows Installer-Paket
bezeichnet wird. Beim Windows Installer-Paket handelt es sich um den Baustein der Installation, der
den eigenen Vorgaben entsprechend angepasst werden kann. Das Paket enthlt eine Beschreibung der
durchzufhrenden Ttigkeiten und ebenfalls alle Ressourcen, die im Installationsprozess bentigt
werden.
Abbildung 1.1: Trennung von Code und Beschreibung beim Windows Installer
Durch die Verwendung einer Betriebssystemkomponente zur Installation und durch die Trennung der
Installationslogik von der Installationsbeschreibung wird die Stabilitt des Betriebssystems und der
Anwendungen in den Vordergrund gestellt. Darber hinaus bietet der Windows Installer weitere
interessante Funktionalitten, die ganz neue Mglichkeiten whrend der Installationsentwicklung und
im Installationsprozess erffnen. Diese Basisfunktionalitt des Installers lsst sich hierdurch bedingt
wie folgt skizzieren:
Transaktionalitt: Fr jede
durchgefhrt wird, wird
zurckzunehmen. Falls es
durchgefhrten nderungen
zurck versetzt.
Selbstheilung: Wird zur Laufzeit der Anwendung festgestellt, dass eine als kritisch eingestufte
Datei (Schlsseldatei) oder ein unbedingt erforderlicher Schlssel der Systemregistrierung fehlt,
kann der Windows Installer diese Datei oder diesen Schlssel wieder herstellen. Dieses kann
sowohl automatisch beim Starten der Anwendung geschehen oder manuell vom Benutzer
16
Kapitel 1
veranlasst werden.
Installation bei Bedarf: Hierbei wird ein Bestandteil der Anwendung nur installiert, wenn es auch
tatschlich bentigt wird. Ein Beispiel dafr wre die Rechtschreibberprfung von Microsoft
Office oder die Online-Dokumentation einer beliebigen Anwendung. In beiden Fllen wird diese
Funktionalitt standardmig nicht mit installiert, erst wenn der Benutzer die Dokumentation
aufruft oder die Rechtschreibung berprft, wird sie automatisch installiert.
Installation in gesperrten Umgebungen: In gesperrten Umgebungen fehlen einem
Standardbenutzer im Normalfall die erforderlichen Privilegien zum Durchfhren einer Installation.
In dem meisten Fllen hat ein solcher Benutzer keinen Schreibzugriff auf den Ordner
%ProgramFiles% oder den Systemregistrierungsschlssel HKEY_LOCAL_MACHINE. Mit dem
Windows Installer ist eine Installation in gesperrten Umgebungen dennoch mglich, da ein
Systemadministrator entsprechende Autorisierungen vornehmen kann. Hierdurch werden die
erhhten Systemprivilegien des Windows Installers, anstelle der eingeschrnkten Rechte des
Standardbenutzers verwendet.
Status-Management: Durch den Windows Installer werden eine Vielzahl von Funktionen
angeboten, mit denen der Status des Systems und somit der Anwendung abgefragt werden kann.
Hiermit wird es mglich, den aktuellen Installationsstatus zu bestimmen, die Reparatur einer
Anwendung durchzufhren und eine Anwendung in einen anderen Status zu berfhren.
Einige dieser Funktionalitten werden im Rahmen dieses Buches betrachtet, andere wiederum nicht.
Dieses Buch zielt schwerpunktmig auf die neuen Funktionen und die genderten Ablufe bei den
Windows Installer-Versionen 4.0 und 4.5 ab und setzt Kenntnisse der Windows Installer-Technologie
voraus. Dennoch mchte ich in diesem Kapitel auf allgemeine Informationen, Ablufe und
Verhaltensweisen des Windows Installers eingehen, wobei diese generisch zu betrachten sind und
somit auf alle Versionen des Windows Installers projiziert werden knnen.
Physische Betrachtung
Physisch betrachtet handelt es sich bei einem Windows Installer-Paket um ein Verbunddokument
(Compound Document). Dieses Dokumentformat lsst sich am einfachsten durch ein Dateisystem
innerhalb einer physischen Datei umschreiben, also um eine Datei, die aus Ordnern (Storages) und
Dateien (Streams) besteht. Die Struktur dieser Verbunddokumente wurde mit einer frhen Version von
Microsoft Office eingefhrt und sie bildete die Grundlage zur Speicherung von OLE-Informationen
(Object Linking and Embedding). Alle Versionen von Microsoft Office 1) verwenden noch immer
1
Microsoft Office 2007 untersttzt noch aus Kompatibilittsgrnden das Format, verwendet aber standardmig ein auf XML
17
Kapitel 1
Das Ergebnis des Funktionsaufrufs ist eine GUID, da in diesem Format die Kennzeichnungen definiert
werden. Die nachfolgende Tabelle 1.2 enthlt eine Auswahl von GUIDs, die zur Kennzeichnung von
Verbunddokumenten verwendet werden.
Art des Dokumentes
Kennzeichnung (GUID)
basierendes Format.
18
{00020906-0000-0000-c000-000000000046}
{00020820-0000-0000-c000-000000000046}
{64818d10-4f9b-11cf-86ea-00aa00b929e8}
{000C1084-0000-0000-C000-000000000046}
{000C1086-0000-0000-C000-000000000046}
{000C1082-0000-0000-C000-000000000046}
Kapitel 1
Das Windows Installer-Paket ist so strukturiert, dass alle fr den Installationsprozess bentigten
Informationen und Ressourcen innerhalb einer Datei abgelegt werden knnen. Zu diesem Zweck
enthlt das Windows Installer-Paket die folgenden Datenspeicher:
Summary Information Stream
Relationale Datenbank
Direkte oder indirekte Quelldateien
Ressourcen fr die Installation (Optional)
Transformationen (Optional)
Der Summary Information Stream ist ein Speicherbereich, den alle Verbunddokumente enthalten. Er
enthlt zustzlich zur Kennzeichnung der Art des Dokuments noch allgemeine und spezifische
Informationen. Die allgemeinen Informationen sind ausschlielich beschreibender Natur und knnen
auch ber den Dateieigenschaftendialog des Windows Explorers abgerufen werden. Die spezifischen
Informationen sind von der Art des Dokumentes abhngig. Bei einem Word-Dokument fallen in diese
Kategorie die Anzahl der Wrter oder Zeichen. Bei einem Windows Installer-Paket ist die Version des
Windows Installers hierzu zu zhlen, die zur Installation auf dem Zielsystem vorhanden sein muss. Das
Windows Installer-Paket enthlt weiterhin eine relationale Datenbank, die aktuell aus mehr als 80
Tabellen besteht. Im Rahmen des Installationsprozesses werden die Inhalte dieser Datenbank vom
Windows Installer-Service verwendet, um das Produkt wie beabsichtigt auf dem System abzubilden.
Das Paket enthlt natrlich auch die zu installierenden Ressourcen, die sich direkt in der physischen
Datei befinden knnen. Es ist auch mglich die Ressourcen als Extern zu kennzeichnen, so dass das
Paket nur Referenzen darauf enthlt. Die gerade vorgestellten Datenspeicher mssen in jedem
Installationspaket vorhanden sein. Darber hinaus ist es mglich weitere optionale Elemente in das
Paket zu integrieren. Dieses knnen Ressourcen sein, die fr die Installation bentigt werden, wie
Bilder die in der Benutzeroberflche angezeigt werden oder auch eingebettete Windows InstallerTransformationen wie dieses auch in Abbildung 1.2 dargestellt wird.
19
Kapitel 1
20
Kapitel 1
Die Relevanz des Summary Information Streams ergibt sich aus der frhzeitigen Ermittlung der
Installationsfhigkeit eines Paketes, ohne auf spezifische Windows Installer-Funktionen angewiesen
sein zu mssen. Die ersten Ttigkeiten des Installationsprozesses erstrecken sich auf eine Prfung, ob
das jeweilige Paket auf der aktuellen Plattform tatschlich installiert werden kann. Zu diesem Zweck
mssen Informationen im Windows Installer-Paket abgelegt werden, die explizit festlegen, welche
Plattform-Architektur und welche Windows Installer-Version erforderlich sind, um das Paket
verwenden zu knnen. Wren diese Informationen in Speicherbereichen zu finden, die ausschlielich
ber Funktionalitten des Windows Installers zugnglich wren, knnte dieses zu einigen Problemen
fhren. Es msste vorausgesetzt werden, dass das Paket von der installierten Windows InstallerVersion geffnet werden kann und die entsprechenden Informationen ermittelt werden knnen. Der
effektivere Weg ist hierbei die Verwendung eines Speicherbereichs, auf den immer zugegriffen werden
kann, da ein Zugriff keine speziellen Windows Installer-Funktionen erfordert, sondern durch
allgemeine Windows-Funktionen realisiert werden kann. Nachdem hierdurch die erforderlichen
Informationen ermittelt wurden, ist es sehr einfach zu prfen, ob es sich um ein gltiges Paket fr die
jeweilige Plattform handelt. In diesem Fall knnen fr den weiteren Ablauf im Installationsprozess
problemlos die notwendigen Windows Installer-Funktionen verwendet werden.
Windows Installer-Datenbank
Die Windows Installer-Datenbank ist relational aufgebaut und enthlt eine Vielzahl von Tabellen. In
der Datenbank werden die zu installierende Ressourcen, die Darstellungsobjekte der
Benutzeroberflche und die Aktionen des Installationsprozesses definiert. Wie bei relationalen
Datenbanken blich, steht eine Vielzahl der Tabellen miteinander in Beziehung, die durch identische
21
Kapitel 1
Werte in den Primr- und Fremdschlsselfeldern der jeweiligen Tabellen realisiert wird.
Fremdschlsselfelder sind in den Tabellen daran zu erkennen, dass der Feldname mit einem
Unterstrich endet.
Abbildung 1.4: Beziehungen der Tabellen innerhalb einer Windows Installer-Datenbank (Auszug)
Bei der Betrachtung der Tabellenschemas in Abbildung 1.4 ist auffllig, dass einige Tabellennamen
mit dem Prfix Msi beginnen. Dieses ist darauf zurck zufhren, dass Tabellen mit diesem Prfix
versehen werden, die seit dem Windows Installer 2.0 dem Datenbankschema hinzugefgt wurden.
22
Kapitel 1
Internes Tabellenformat
Die interne Betrachtung der Tabellen bezieht sich zwangslufig wieder auf das Verbunddokument und
die strukturierte Speicherung der erforderlichen Objekte. Jede Tabelle der Windows InstallerDatenbank wird durch ein Storage-Objekt dargestellt und persistiert. Jedes Storage-Objekt enthlt
mehrere separate Stream-Objekte in denen die enthaltenen Tabellendaten, die Tabellendefinition und
die Indizes gespeichert werden. In der Tabellendefinition sind Informationen zu den Spaltennamen,
Datentypen und der Feldgre abgelegt. Die Primr- und Fremdschlssel werden ber die
Indexauflistung persistiert. Die tatschlichen Tabellendaten werden in einem zweidimensionalen Array
abgelegt, das allerdings ausschlielich Daten vom Typ Short Integer aufnehmen kann. Eine Vielzahl
der Informationen in einer Windows Installer-Tabelle ist vom Typ Short Integer, so dass diese
Informationen problemlos in das Array bertragen werden knnen. Daten vom Typ Long Integer,
wie die Spalte FileSize der Tabelle File, knnen hingegen nicht direkt in das Array bertragen werden,
da der bentigte Wertebereich berschritten wird. Solche Daten werden aus diesem Grund in zwei
zusammenhngenden Spalten des Arrays abgelegt. Da sich die gltigen Werte fr dieses Array
ausschlielich auf Ganzzahlen erstrecken, handelt es sich bei Null um einen ungltigen Wert. Um
solche Werte ebenfalls in dem Array zu speichern, wird Null durch den Wert 0x8000 dargestellt.
Zeichenfolgen knnen ebenfalls nicht direkt in das Array bertragen werden, so dass sie in einem
speziellen Speicherbereich abgelegt werden mssen, der als Stringpool bezeichnet wird. Die Elemente
des Stringpools werden ber einen Index identifiziert, der wiederum in das Array bertragen wird.
Speicherbereich fr Zeichenfolgen
Die Installationsdatenbank enthlt einen Speicherbereich mit der Bezeichnung _StringData, in dem die
Zeichenfolgen aller Tabellen abgelegt werden und der demzufolge von allen Tabellen der Datenbank
gemeinsam verwendet wird. Durch diesen Mechanismus wird jede Zeichenfolge nur einmal in der
Datenbank gespeichert, wodurch die Datenbankgre minimiert und die Performance optimiert wird.
Es existiert ein weiterer Speicherbereich der als _StringPool bezeichnet ist und in dem die Lnge der
Zeichenfolgen und die Referenzen jeder Zeichenfolge abgelegt sind.
Auf den gemeinsamen Speicherbereich kann ber den Index zugegriffen werden, wobei der Index 0
fr einen Null-String reserviert ist, der jedoch statisch ist und somit nicht im Stringpool abgelegt
werden muss. An Stelle der Zeichenfolgeninformationen fr den Index 0 wird hier die Codepage
gespeichert, die fr die Darstellung der Zeichenfolgen verwendet werden soll. Zur Vermeidung von
Problemen, die auf einer ungltigen Codepage basieren, sollten nur Zeichenfolgen verwendet werden,
die aus Zeichen der neutralen Codepage zusammengesetzt sind. Ist es erforderlich auf Zeichen des
erweiterten Zeichensatzes zuzugreifen, muss zur fehlerfreien Darstellung die passende Codepage
festgelegt werden.
Zur Anzeige von Textinformationen verwendet der Windows Installer die nachfolgenden Regeln zur
Ermittlung der Codepage und die darauf aufbauende Bestimmung der kompatiblen Schriftarten und
des Zeichensatzes:
Daten, die mit dem System verknpft sind (Dateien und Eintrge in der Systemregistrierung):
Die Codepage des Benutzers wird verwendet.
Zeichenfolgen der Windows Installer-Datenbank, wobei die Datenbank-Codepage nicht neutral
(0) ist: Die Codepage der Windows Installer-Datenbank wird verwendet.
Zeichenfolgen der Windows Installer-Datenbank, wobei die Datenbank-Codepage neutral ist:
Die Codepage des Benutzers wird verwendet.
Steuerelemente die statischen Text enthalten: Standardmig wird die Datenbank-Codepage
Persnliche Ausfertigung fr Martin Martinsson
23
Kapitel 1
verwendet. Allerdings kann durch das Attribut UsersLanguage eines solchen Steuerelements die
Codepage des Benutzers verwendet werden.
Die Festlegung der Datenbank-Codepage kann bei der Erstellung des Installationspaketes erfolgen. Es
besteht auch die Mglichkeit diese nachtrglich zu verndern, wozu Tools wie Orca zu verwenden
sind.
Hinweis Beginn
Jede Windows Installer-Transformation verfgt ber einen eigenen Stringpool, so dass hierfr eine
eigene Codepage definiert werden kann. Whrend der Installation werden die Zeichenfolgen der
Datenbank unter Verwendung der Datenbank-Codepage dargestellt. Zur Darstellung der Zeichenfolgen
der Transformation wird hingegen die Codepage der Transformation verwendet.
Hinweis Ende
24
Kapitel 1
Das Manipulieren von Daten einer Windows Installer-Datenbank, die ber eine inkonsistente
Referenzzhlung verfgt, kann zu erheblichen Datenverlusten fhren.
Achtung Ende
Im ersten Bereich der Ausgabe finden Sie Hinweise auf die Zeichenketten, die in diesem Beispiel
Zeichen des erweiterten Zeichensatzes verwenden. Darunter folgt eine komplette Auflistung der
Zeichenketten des Stringpools mit der Anzahl der Referenzen und der IDs.
Installierbare Ressourcen
Die wesentliche Aufgabe im Rahmen der Installation erstreckt sich auf das Kopieren von Dateien auf
das Zielsystem. Hierzu ist es erforderlich, dass diese mit dem Installationspaket bereitgestellt werden.
Der Windows Installer bietet mehrere Mglichkeiten die zu installierenden Ressourcen in das
Windows Installer-Paket zu integrieren. Die Quelldateien knnen hierbei entweder im komprimierten
oder im nicht komprimierten Zustand verwendet werden. Auch eine Kombination dieser beiden
Optionen ist mglich. Die Einstellung ber die Art der verwendeten Quelldateien, sowie das Format
der Dateinamen wird ber die Eigenschaft PID_WORDCOUNT des Summary Information Streams
festgelegt.
Nicht komprimierte Quellen: Die Quelldateien werden in Ihrem nicht komprimierten Originalformat
verwendet und knnen sowohl mit kurzen (8.3) als auch mit langen Dateinamen benutzt werden. Die
Quelldateien werden in einer Ordnerstruktur abgelegt, die in der Tabelle Directory festgelegt werden
muss. Bei Verwendung von nicht komprimierten Quellen muss das Attribut fr komprimierte
Quelldateien aus der Eigenschaft PID_WORDCOUNT des Summary Information Streams entfernt oder
auf Dateiebene in der Tabelle File gesetzt werden.
Komprimierte Quellen: Bei der Verwendung von komprimierten Quelldateien, mssen sich diese in
einer Kabinett-Datei befinden. Dieses Kabinett kann entweder direkt in das Windows Installer-Paket
integriert oder als externe Datei verwendet werden. Bei der direkten Integration in das Windows
25
Kapitel 1
Installer-Paket wird die Kabinettdatei der Systemtabelle _Stream hinzugefgt. Bei der externen
Verwendung muss sich diese Datei im Stammverzeichnis der Ordnerstruktur der Dateiquelle befinden,
das in der Tabelle Directory definiert ist. Alle verwendeten Kabinettdateien mssen in der Tabelle
Media aufgelistet werden. Bei Verwendung von komprimierten Quellen muss das Attribut fr
komprimierte Quelldateien der Eigenschaft PID_WORDCOUNT des Summary Information Streams
hinzugefgt oder auf Dateiebene in der Tabelle File gesetzt werden.
Gemischte Verwendung: Sie knnen in einem Windows Installer-Paket auch komprimierte und nicht
komprimierte Quellen gemeinsam verwenden. Vergeben Sie in der Tabelle File das Attribut
msidbFileAttributesCompressed fr die Dateien, die im komprimierten Zustand, und das Attribut
msidbFileAttributesNoncompressed fr die Dateien, die im nicht komprimierten Zustand verwendet
werden sollen. Vergeben Sie dieses Attribut nur fr die Dateien, die von der Eigenschaft
PID_WORDCOUNT des Summary Information Stream abweichen. Wurde beispielsweise die
Eigenschaft PID_WORDCOUNT zur Verwendung von komprimierten Dateien gesetzt, mssen Sie fr
jede Datei, die im nicht komprimierten Zustand verwendet werden soll, das Attribut
msidbFileAttributesNoncompressed in der Tabelle File setzen. Diese Dateien mssen im
Stammverzeichnis, der in der Tabelle Directory definierten Ordnerhierarchie, abgelegt werden.
Erstellen von Kabinettdateien
Zur Verwendung von komprimierten Dateien mssen diese in einer Kabinettdatei gespeichert werden.
Groe Dateien knnen auf mehrere Kabinettdateien aufgeteilt werden. Bei einer solchen Aufteilung
drfen sich maximal 15 Dateien in einem Kabinett befinden, dass fortgesetzt wird. Werden
beispielsweise drei Kabinettdateien verwendet drfen das erste und das zweite Kabinett jeweils nur 15
Dateien enthalten. Die dritte Kabinettdatei ist hierdurch nicht eingeschrnkt, sondern muss die
generischen Limitierungen einhalten, die in Anhang C aufgefhrt sind.
Bei der Erstellung eines Installationspaketes werden die erforderlichen Kabinettdateien durch die
verwendeten Tools und Anwendungen normalerweise automatisch erzeugt. Fr manuelle Anstze
eignen sich Tools wie makecab.exe oder auch Visual Studio. Visual Studio stellt im Rahmen der Setup
und Weitergabeprojekte den Projekttyp CAB-Projekt hierfr zur Verfgung. Bei makecab.exe
handelt es sich um ein Befehlszeilentool fr diese Zwecke, dass im Windows Installer-SDK und im
Microsoft Cabinet Software Development Kit enthalten ist.
Verwenden von Kabinettdateien
Auch wenn die Erstellung der Kabinettdateien und die Verknpfung mit dem Installationspaket
automatisch erfolgen, mchte ich dennoch die erforderliche Vorgehensweise zur Erstellung eines
solches Archivs skizzieren. Weiterhin mchte ich auf die Beziehung zwischen dieser Datei und der
Windows Installer-Datenbank eingehen und die Mglichkeiten aufzeigen eine Kabinettdatei in ein
Windows Installer-Paket zu integrieren.
Verwenden Sie ein geeignetes Tool, um die Quelldateien zu komprimieren und diese in einer
Kabinettdatei zusammenzufassen.
Die Kabinettdatei muss entweder im Windows Installer-Paket oder zur externen Verwendung im
Stammverzeichnis der definierten Ordnerhierarchie gespeichert werden.
Legen Sie fest, ob alle Dateien im komprimierten Zustand verwendet werden sollen oder ob eine
gemeinsame Verwendung von komprimierten und nicht komprimierten Dateien fr Ihr Vorhaben
geeignet ist. Entsprechend mssen Sie das jeweilige Attribut in der Eigenschaft
PID_WORDCOUNT des Summary Information Streams setzen.
26
Kapitel 1
Fgen Sie fr jede in der Kabinettdatei enthaltene Datei, einen Datensatz der Tabelle File hinzu.
Verwenden Sie als Schlssel in der Tabelle exakt den gleichen Namen, unter dem diese Datei auch
in der Kabinettdatei gespeichert ist. Beachten Sie, dass der Schlssel zwischen Gro- und
Kleinschreibung unterscheidet. Stellen Sie sicher dass die Sequenznummer in der Tabelle File
identisch ist, mit der Sequenz im Kabinett.
Fgen Sie fr jedes verwendete Kabinett einen Datensatz der Tabelle Media hinzu. Legen Sie den
Wert fr das Feld DiskID fest; beachten Sie, dass dieser Wert grer ist als der hchste Wert der
bereits erfassten Datenstze dieser Tabelle. Geben Sie den Namen der Kabinettdatei in das
entsprechende Datenfeld ein. Beachten Sie, dass Sie bei der Verwendung eines internen Kabinetts,
dem Kabinettnamen das Zeichen # voranstellen mssen. Bei der Namensvergabe bei internen
Kabinettdateien muss die Gro- und Kleinschreibung beachtet werden. Bei der Verwendung von
externen Kabinettdateien ist dies nicht der Fall.
Bestimmen Sie die grte Sequenznummer, indem Sie die Spalte Sequence der Tabelle File
berprfen. Geben Sie diesen Wert in das Feld LastSequence der Tabelle Media ein.
Im letzten Schritt muss die Kabinettdatei in das Windows Installer-Paket integriert werden. Hierzu
bietet sich die Verwendung von Tools aus dem Windows Installer-SDK an. Verwenden Sie zu
diesem Zweck das Tool msidb.exe. Um eine Kabinettdatei mit der Bezeichnung cab1.cab in ein
Installationspaket mit der Bezeichnung rtm.msi zu integrieren, ist der folgende Befehl zu
verwenden:
msidb.exe -d rtm.msi -a cab1.cab
Hierbei wird die Kabinettdatei unter der Bezeichnung cab1.cab in einem Speicherbereich des
Windows Installer-Paketes abgelegt.
Tipp Beginn
Das Windows Installer-SDK enthlt die Skriptdatei WiMakCab.vbs, die es ermglicht, eine
Kabinettdatei auf Grundlage der Informationen eines Windows Installer-Paketes zu erstellen.
Tipp Ende
Die maximale Anzahl von Dateien, die in der Tabelle File angegeben werden knnen ist 32.767. Zur
Erstellung grerer Pakete mssen Modifikationen an der Datenbankstruktur vorgenommen werden.
Hinweis Ende
27
Kapitel 1
Zur Verdeutlichung mchte ich das folgende Beispiel verwenden. Zur Verwendung sollen zwei
Quellmedien kommen, wobei auf Disk 1 nicht komprimierte Dateien und eine Kabinettdatei und auf
Disk 2 lediglich eine nicht komprimierte Datei zu finden sind. In diesem Fall mssen die nicht
komprimierten Dateien und die Dateien des Kabinetts kleinere Sequenznummern aufweisen, als die
Dateien auf Disk 2. Die Tabelle Media dieses Beispiels ist in Tabelle 1.3 dargestellt.
DiskId
LastSequence
DiskPrompt
10
15
Cabinet
VolumeLabel
Disk 1
cab1.cab
Disk 1
Disk 2
Die Zuordnung der Dateien zu einem Medium wird durch die Sequenznummern realisiert, die in der
Spalte Sequence der Tabelle File festgelegt werden.
File
Sequence
F1
F2
F3
F4
11
Die Betrachtung der gerade dargestellten Tabellen ergibt, dass sich die Dateien F1 und F2 im nicht
komprimierten Zustand auf dem Quellmedium Disk 1 befinden. Die Datei F3 befindet sich in der
externen Kabinettdatei cab1.cab ebenfalls auf Disk 1. Die Datei F4 befindet sich hingegen im nicht
komprimierten Zustand auf Disk 2.
Logische Betrachtung
Die physische oder interne Betrachtung eines Installationspaketes bezieht sich immer auf die
notwendigen Ressourcen oder Einstellungen, die zur Durchfhrung des Installationsprozesses bentigt
werden. Die logische Sichtweise ermglicht hingegen die strukturierte Gestaltung des
Installationspaketes. Eine logische Betrachtung ist erforderlich, um die nachfolgenden Fragen zu
beantworten, die Grundlage eines jeden Installationsdesigns sein sollten. Dieses ist in sofern relevant,
da bei der Durchfhrung der Installation ein deklarativer Ansatz gefahren wird. Das bedeutet, dass im
Installationspaket nicht beschrieben wird, wie bestimmte Szenarien umgesetzt werden sollen, sondern
lediglich das Ergebnis der Installation modelliert wird.
Was soll alles installiert werden?
Welche Abhngigkeiten bestehen zwischen den zu installierenden Elementen?
Sind alle Elemente zur Programmausfhrung notwendig oder kann der Benutzer bestimmte
Programmteile optional installieren?
Die Beantwortung der Fragen ist in vielen Fllen nicht trivial, da im Entwicklungsprozess viele
Informationen zum Zeitpunkt der logischen Grundgestaltung des Installationspaketes noch nicht
vorliegen. Zu diesem Zweck verwendet der Windows Installer zur strukturierten Gestaltung des
28
Kapitel 1
Installationspaketes ein uerst flexibles und erweiterbares Modell, das auf mehreren logischen
Kategorien basiert.
Ressourcen
Ressourcen sind alle Objekte, die whrend des Installationsprozesses dem Zielsystem hinzugefgt
werden knnen. Hierzu zhlen Dateien, Registrierungseintrge, Dateiverknpfungen, ODBCDatenquellen, Betriebssystemdienste und andere vergleichbare Objekte. Eine besondere Art von
Ressourcen stellen die so genannten Aktivierungspunkte (Entry Points) dar. Hierbei handelt es sich um
eine besondere Art von Ressource, die fr die Installation bei Bedarf und die Selbstheilung bentigt
werden, wie auch Anhand D verdeutlicht. Zu den Aktivierungspunkten gehren:
Dateiverknpfungen
Dateinamenerweiterungen
CLSID
Die Installation bei Bedarf wird durch eine Benutzeraktion ausgelst. Der Benutzer aktiviert
beispielsweise eine Dateiverknpfung, die whrend des Installationsvorganges zur Installation bei der
ersten Verwendung markiert worden ist. In diesem Fall handelt es sich bei der Dateiverknpfung um
den Aktivierungspunkt, der die Installation der entsprechenden Ressourcen veranlasst. Ein
Aktivierungspunkt ist immer mit einem Feature verknpft, so dass bei einer Aktivierung immer die
Ressourcen des jeweiligen Features installiert werden.
Komponenten
Bei den Windows Installer-Komponenten handelt es sich um Elemente, die die grundlegenden
Informationen fr die Installation enthalten. Eine Komponente fasst Dateien, Registrierungseintrge,
Verknpfungen und weitere Ressourcen zu einer logischen Einheit zusammen, die nur gemeinsam
installiert und deinstalliert werden knnen. Komponenten sind fr den Endanwender nicht sichtbar.
Eine Versionsberprfung wird immer gegen Komponenten ausgefhrt, so dass Sie sicherstellen
sollten, dass eine Ressource niemals von mehr als einer Komponente verwendet wird. Soll eine Datei
von mehreren Anwendungen genutzt werden, sollte die entsprechende Komponente in ein Windows
Installer-Mergemodul ausgelagert werden, so dass jedes Installationsprogramm die gleichen
Installationsoptionen dafr verwendet.
Eine Komponente wird immer vollstndig installiert oder deinstalliert. Komponenten enthalten keine
Versionskennungen, so dass eine Ressource dieser Komponente entsprechende Informationen zur
Verfgung stellen muss. Eine Datei, die diese Informationen fr die Komponente bereitstellt, wird als
Schlsselressource bezeichnet. Das Festlegen einer solchen Datei erfolgt ber die
Komponenteneigenschaft KeyPath. Typischerweise wird fr diese Schlsselressource eine Datei
verwendet; es knnen jedoch auch Registrierungseintrge und ODBC-Datenquellen verwendet werden.
Als Installationspfad der Komponente wird immer der Pfad zu der Schlsselressource zurckgegeben.
Der Windows Installer-Dienst prft das Vorhandensein der Schlsselressource, um den
Installationsstatus der Komponente festzustellen. Wird die Schlsselressource nicht gefunden, handelt
es sich aus Sicht des Windows Installers um eine fehlerhafte Komponente und die Reparatur wird
automatisch gestartet.
Das fehlerfreie Verwalten von Anwendungen, also die Installation, Deinstallation und das Einspielen
von Updates setzt eine gewisse Disziplin im Umgang mit Komponenten voraus. Komponenten sind die
kleinste installierbare Einheit einer Installation. Ressourcen werden in Komponenten zusammengefasst
29
Kapitel 1
und diese werden durch eine eindeutige ID gekennzeichnet, die als ComponentId bezeichnet wird. Bei
dieser ID handelt es sich um eine GUID, wodurch die Eindeutigkeit garantiert wird. Komponenten mit
identischer ComponentId mssen identische Ressourcen beinhalten, um eine effektive Verwaltung
bereits installierter Ressourcen seitens des Windows Installers zu gewhrleisten. Wird eine
existierende Komponente verndert, sei es durch das Austauschen, Hinzufgen oder Entfernen einer
Datei oder des Festlegens eines anderen Standardzielverzeichnisses muss die ComponentId verndert
werden. Aus Sicht des Windows Installers handelt es sich dann um eine neue Komponente.
Im Gegensatz zu anderen Installationstechnologien verwaltet der Windows Installer niemals Dateien
oder andere Ressourcen direkt. Der Windows Installer-Dienst verwaltet Anwendungen auf Basis der
Komponenten, was bedeutet, dass zwei Ressourcen, die in einer Komponente zusammengefasst sind,
niemals separat installiert oder deinstalliert werden knnen. Die berwachung von Komponenten, die
von mehreren Anwendungen verwendet werden, wird nicht durch Referenzzhler vorgenommen. Der
Windows Installer speichert fr jede Komponente die Identifikationsmerkmale der Produkte, von
denen diese verwendet wird. Die Komponente wird erst vom Computer entfernt, wenn kein Produkt
diese Komponente mehr verwendet. Die berwachung installierter Ressourcen ist durch diese
Vorgehensweise nicht nur auf Dateien beschrnkt, sondern erstreckt sich auf beliebige Ressourcen.
Windows Installer-Komponenten werden in der Tabelle Component der Windows Installer-Datenbank
definiert.
Features
Ein Windows Installer-Feature ist die kleinste installierbare Einheit aus Sicht des Benutzers. Bei den
Features handelt es sich um eine Zusammenfassung von Windows Installer-Komponenten, die der
Benutzer einzeln zur Installation auswhlen kann. Whlt ein Anwender die benutzerdefinierte
Installationsoption, wird ein Dialogfeld zur Auswahl der zu installierenden Programmelemente
dargestellt. Jedes hier aufgelistete Element korrespondiert mit einem Windows Installer-Feature. Ein
Feature kann auch weitere Features enthalten, wodurch es ermglicht wird, ein installierbares Produkt
hierarchisch zu gliedern. Das Installationspaket von Microsoft Office enthlt beispielsweise ein
Feature mit der Bezeichnung Korrekturhilfen, das wiederum untergeordnete Features fr
verschiedene Sprachen enthlt. Falls ein Benutzer ein solches Feature zur Installation markiert, werden
alle zugeordneten Windows Installer-Komponenten installiert. Die folgende Abbildung 1.5 stellt diese
Auswahlmglichkeit dar,
30
Kapitel 1
Wie bereits an vorheriger Stelle verdeutlicht, werden alle Verwaltungsaufgaben des Windows
Installers auf Komponentenebene durchgefhrt. Auf Basis dieser Implementierung ist es nicht
erforderlich, eindeutige Windows Installer-Features zu definieren, vielmehr besteht die Mglichkeit
eine Komponente einem oder mehreren Features zuzuordnen. Dieses ist uerst relevant, denn eine
ordentlich konzipierte Feature - Komponentenstruktur stellt die Basis fr robuste und erweiterbare
Windows Installer-Pakete dar.
Produkt
Ein Windows Installer-Produkt stellt eine einzelne Anwendung wie Microsoft Project oder eine
Gruppe von Anwendungen wie Microsoft Office dar. Produkte bestehen aus einem oder mehreren
Windows Installer-Features und stellen somit die grte installierbare Einheit dar. Produkte werden
durch die Eigenschaft ProductName bezeichnet und durch einen eindeutigen ProductCode
identifiziert. Bei dem ProductCode handelt es sich ebenfalls um eine GUID, die in der Tabelle
Property der Windows Installer-Datenbank abgelegt ist.
Ein Produkt ist eine Gruppierung von Features, und somit natrlich auch eine Sammlung von
Windows Installer-Komponenten, die wiederum aus Ressourcen zusammengesetzt sind. Abbildung
1.6 enthlt einen Teilausschnitt aus der logischen Struktur des Installationspaketes von Microsoft
Office 2007. In dieser Abbildung ist das Zusammenspiel der Features und Komponenten sehr gut zu
erkennen. Es existiert hierbei eine gemeinsame Komponente, die automatisch bei der Auswahl eines
der bergeordneten Features installiert wird. Im Weiteren sind die unterschiedlichen Sichtweisen
erkennbar. Die Komponenten mit den enthaltenen Ressourcen spiegeln die Sichtweise des Entwicklers
des Installationspaketes wieder. Das Produkt und die untergeordneten Features reprsentieren letztlich
31
Kapitel 1
Bei der Installation eines Produktes wird der Auswahlstatus der Features geprft, und letztlich die
zugeordneten Komponenten installiert. Bei der Installation der Windows Installer-Komponenten wird
geprft, ob sich diese bereits auf dem System befinden. Ist dies der Fall, wird der ProductCode des zu
installierenden Produkts der Auflistung der Produkte, die diese Komponente verwenden, hinzugefgt.
Ist die Komponente noch nicht installiert, wird fr die Komponente ein Eintrag in die
Systemregistrierung geschrieben, und der ProductCode diesem Eintrag angefgt. Bei der
Deinstallation wird der ProductCode von den entsprechenden Komponenten entfernt und diese ggf.
gelscht. Der ProductCode wird vom Windows Installer auch bentigt um festzustellen, ob dieses
Produkt bereits auf dem System installiert wurde. Die installierten Produkte werden ebenfalls unter
einem Registrierungsschlssel gespeichert.
Hinweis Beginn
Bei der Erstellung eines Installationspaketes und der Konstruktion einer Feature- und
Komponentenstruktur sind bestimmte Limitierungen zu beachten, die in Anhang C aufgezeigt sind.
Hinweis Ende
32
Kapitel 1
werden soll. Zur Auswertung dieser Informationen und der letztlichen Umsetzung wird schlielich der
Windows Installer-Service bentigt. Wie bereits angedeutet handelt es sich hierbei um einen
Betriebssystemdienst, der fr die Installation, Deinstallation, Modifikation und Aktualisierung von
Anwendungen bentigt wird. Dieser Betriebssystemdienst trgt die Bezeichnung MSIServer und
wird im Wesentlichen durch die ausfhrbare Datei msiexec.exe reprsentiert. Der Dienst wird nicht
automatisch vom System gestartet, sondern muss manuell durch einen Aktivierungsmechanismus
aufgerufen werden. Diese Aktivierung kann auf unterschiedliche Arten erfolgen:
Durch die Verwendung der Befehlszeilenoptionen des Windows Installers.
Durch das Doppelklicken auf eine MSI-Datei oder MSP-Datei, da diese Dateinamenerweiterungen
mit dem Windows Installer verknpft sind.
Durch die Funktionen der Programmierschnittstelle des Windows Installers.
Durch Softwareverteilungstechnologien wie Microsoft Systems Management Server (SMS) und
Microsoft System Center Configuration Manager (SCCM) oder die auf Gruppenrichtlinien
basierenden Technologien, die in Windows 2000 Server, Windows Server 2003 und Windows
Server 2008 integriert sind (Active Directory).
Durch die Option Software der Systemsteuerung von Windows 2000, Windows XP, Windows
Server 2003, Windows Vista und Windows Server 2008.
Durch Anwendungen, die Windows Installer-Technologien direkt nutzen.
Unabhngig davon, auf welche Weise der Windows Installer aufgerufen und somit der
Installationsprozess gestartet wurde, wird beim Aufruf immer eine Referenz auf das zu verwendende
Installationspaket bergeben. Die ersten Schritte im Installationsprozess erstrecken sich auf die
Auswertung der Informationen des Summary Information Streams. So wird an dieser Stelle zunchst
geprft, ob das Installationspaket auf dem aktuellen System berhaupt verwendet werden kann, indem
die definierte Version des Windows Installers und die jeweilige Plattform-Architektur auf
bereinstimmung geprft werden. Im Anschluss wird das Installationspaket in den Arbeitsspeicher
geladen, so dass direkt auf die notwendigen Informationen der Windows Installer-Datenbank
zugegriffen werden kann. Nachfolgend werden nun die Aufrufparameter ausgewertet und darber
hinaus geprft, ob sich das Produkt bereits auf dem System befindet. Anhand dieser Informationen
wird die tatschliche Installationsart festgelegt. In Abhngigkeit zu der ermittelten Installationsart
werden Windows Installer-Patches und Windows Installer-Transformationen auf das Paket
angewendet, weitere Systemkonfigurationen geprft und schlielich die in der Windows InstallerDatenbank definierten Installationsabfolgen ausgefhrt.
Dieser sehr schematische Installationsablauf wird an spterer Stelle in diesem Kapitel weiter przisiert.
Allerdings sind diese Informationen fr den Moment ausreichend um die Aufrufmglichkeiten der
einzelnen Installationsarten zu erlutern.
Clientinstallation
Die Clientinstallation ist die am hufigsten verwendete Installationsart. Es handelt sich hierbei um den
bekannten Prozess, in dem Ressourcen vom Quellmedium auf den Zielcomputer bertragen werden,
mit dem Ziel eine funktionsfhige Anwendung zu erhalten. Eine spezielle Form der Clientinstallation
ist der Wartungsmodus. In diesen Modus wird automatisch verzweigt, falls eine Clientinstallation
gestartet wird und das jeweilige Produkt auf dem System bereits vorhanden ist. Der Wartungsmodus
wird ebenfalls verwendet, falls eine Aktualisierung des Produktes ausgefhrt, eine Reparatur des
Produktes veranlasst oder das Produkt deinstalliert wird. Im Installationsprotokoll lsst sich eine
Persnliche Ausfertigung fr Martin Martinsson
33
Kapitel 1
Clientinstallation am einfachsten an der Eigenschaft ACTION erkennen, die bei dieser Installationsart
ber den Wert INSTALL verfgen muss.
Property(S): ACTION = INSTALL
Wird eine Clientinstallation von einem administrativen Installationspunkt ausgefhrt (Post-AdminInstall), so wird whrend der Installation die Eigenschaft IsAdminPackage auf den Wert 1 festgelegt.
Diese Information kann ebenfalls der Eigenschaftsauflistung des Installationsprotokolls entnommen
werden.
Basisinstallation
Zum Durchfhren einer Clientinstallation ist dem Befehlszeilenaufruf das Argument /i (Install) oder
/package anzufgen. In beiden Fllen ist zustzlich eine Referenz auf das zu verwendende
Installationspaket erforderlich. Bei einer Basisinstallation ist hierzu der vollstndige Pfad zum
Installationspaket nach dem folgenden Schema zu verwenden. Diese Referenz kann auch als UNCName (Universal Naming Convention) oder als URL (Uniform Resource Locator) bergeben werden.
Ein Doppelklick auf eine MSI-Datei resultiert immer in einer Basisinstallation, da durch die
Erweiterungen der Windows-Shell automatisch diese Argumente gesetzt werden.
msiexec.exe /i <Pfad zum Installationspaket>
msiexec.exe /package <Pfad zum Installationspaket>
Im Installationsprotokoll ist die Durchfhrung einer Basisinstallation anhand der nachfolgenden
Eintragungen zu erkennen:
MSI (s) (40:54) [15:58:41:665]: Product not registered: beginning first-time install
MSI (s) (40:54) [15:58:41:665]: PROPERTY CHANGE: Adding ProductState property. Its value is '-1'.
Beschreibung
34
Kapitel 1
/qn+
/qb
Verwendet die Basisdarstellung. Die Option /qb! kann verwendet werden, um die
Schaltflche Abbrechen zu deaktivieren. Anstelle von /qb! kann auch /passive
verwendet werden, wobei zustzlich der Eigenschaft REBOOTPROMPT der Wert S
zugewiesen wurde.
/qb+
Verwendet die Basisdarstellung und zeigt einen Dialog am Ende der Installation. Der
Dialog wird nicht angezeigt, wenn der Anwender die Installation abbricht. Die Optionen
/qb+! oder /qb!+ knnen verwendet werden, um die Schaltflche Abbrechen zu
deaktivieren.
/qb-
Verwendet die Basisdarstellung allerdings ohne modale Dialoge. Das bedeutet, dass nur
die Fortschrittsanzeige angezeigt wird. Beim Auftreten von Fehlern oder Warnungen
wird kein Dialog angezeigt, sondern die Informationen dem Protokoll (falls verwendet)
angefgt. Die Optionen /qb-! oder /qb!- knnen verwendet werden, um die
Schaltflche Abbrechen zu deaktivieren.
/qr
Verwendet die reduzierte Benutzeroberflche. Ein Dialog am Ende der Installation wird
nicht angezeigt.
Eine Basisinstallation kann auch programmtechnisch durchgefhrt werden, indem die Funktion
MsiInstallProduct() der Windows Installer-Programmierschnittstelle aufgerufen wird. Die Darstellung
der Benutzeroberflche kann in diesem Zusammenhang durch MsiSetInternalUI() festgelegt werden.
Wartungsmodus
Als Ergnzung zu der Clientinstallation verfgt der Windows Installer ber die Mglichkeit,
nachtrgliche Modifikationen an der installierten Basis vorzunehmen. Diese Modifikationen knnen
sich auf drei Bereiche erstrecken:
Der Anwender mchte neue Programmteile hinzufgen oder bereits installierte Teile entfernen.
Der Anwender mchte die Anwendung reparieren, da diese ein Problem verursacht.
Der Anwender mchte die Anwendung deinstallieren.
Diese drei Mglichkeiten sind unter dem Begriff der Wartungsmodus oder Maintenance Installation
zusammengefasst. In den Wartungsmodus wird automatisch verzweigt, falls die Installation nach dem
vorherigen Schema gestartet wird und das Produkt sich bereits auf dem System befindet. Optional
kann hierbei anstelle des Pfades zum Installationspaket auch der ProductCode des jeweiligen
Produktes angegeben werden. Darber hinaus ist es auch mglich, eine Reparatur oder eine
Reinstallation des Produktes ber einen Befehlszeilenaufruf zu starten, der letztlich wieder im
Wartungsmodus mndet. Der Reparaturmodus wird hierbei durch das Argument /f (Fix) eingeleitet
und um die durchzufhrenden Reparaturoptionen ergnzt wird.
msiexec.exe /f[Reparatur Optionen] <Pfad zum Paket oder ProductCode>
Die Festlegung der Reparaturoptionen wird durch eine Verkettung der in Tabelle 1.6 dargestellten
Zeichen ermglicht.
Persnliche Ausfertigung fr Martin Martinsson
35
Kapitel 1
Argument
Beschreibung
Reinstallation, wenn eine Datei fehlt oder in einer lteren Version vorliegt.
Reinstallation von fehlenden Dateien oder von Dateien, deren Versionsnummer kleiner oder
gleich ist.
Reinstallation von fehlenden Dateien oder von Dateien mit abweichenden Versionsnummern.
Reinstallation von fehlenden Dateien oder von Dateien, bei denen die gespeicherte Checksumme
nicht mit dem berechneten Wert bereinstimmt. Dies gilt nur fr Dateien, bei denen das Attribut
msidbFileAttributesChecksum in der Tabelle File gesetzt worden ist.
Erzwingt das erneute Ausfhren vom Originalmedium und aktualisiert das im Cache vorhandene
Windows Installer-Paket.
Die Reparatur eines Produktes kann darber hinaus durch die Funktion MsiReinstallProduct() der
Windows Installer-Programmierschnittstelle realisiert werden. Weiterhin ist es mglich, durch
Optionen innerhalb des Dialogs Software der Systemsteuerung, die Reparatur eines installierten
Produktes durchzufhren. In diesem Fall wird die Reparatur unter Verwendung der Optionen
ocmusv ausgefhrt.
Die Verwendung des Wartungsmodus lsst sich anhand des Installationsprotokolls feststellen. Die
relevanten Eintragungen sind in den Protokolleintrgen des Server-Prozesses zu finden. Diese sind an
dem Prfix MSI (s) zu erkennen. Die verwendeten Reparaturoptionen knnen der Eigenschaft
REINSTALLMODE entnommen werden, die dem Eintrag mit dem Prfix Command Line: angefgt
ist. Weiterhin werden sie auch in der Eigenschaftsauflistung am Ende des Protokolls angezeigt. Ein
weiterer wichtiger Indikator ist die Eigenschaft REINSTALL. Diese enthlt die Auflistung an Features,
die repariert werden sollen oder die Zeichenfolge ALL, die die Reparatur aller Features
kennzeichnet. Dieses ist darauf begrndet, dass eine Reparatur oder Reinstallation immer auf Ebene
der Features und nicht der Komponenten durchgefhrt wird. Dieses Verfahren basiert auf der
Annahme, dass ein Feature ein in sich konsistentes Gebilde ist, so dass die enthaltenen Elemente
bereinstimmen mssen. Das vornehmste Ziel einer Reparatur ist das Versetzen der Anwendung in
einen funktionsfhigen Zustand, wobei diese Annahme zu bercksichtigen ist.
MSI (s) (40:68) [16:13:17:751]: Command Line: REINSTALL=ALL REINSTALLMODE=omus CURRENTDIRECTORY=D:\Setup
CLIENTUILEVEL=2 CLIENTPROCESSID=1704
Property(S): REINSTALLMODE = omus
Property(S): REINSTALL = ALL
36
Kapitel 1
Der Wartungsmodus ist darber hinaus explizit durch die Zeichenfolge entering maintenance mode
gekennzeichnet.
MSI (s) (40:68) [16:13:17:751]: Product registered: entering maintenance mode
MSI (s) (40:68) [16:13:17:751]: PROPERTY CHANGE: Adding ProductState property. Its value is '5'.
Sie erhalten sogar die notwendigen Informationen, ob das Produkt im Benutzer- oder
Maschinenkontext installiert wurde. Hierzu jedoch mehr im Kapitel 5.
MSI (s) (40:68) [16:13:17:752]: Determined that existing product (either this product or the product being
upgraded with a patch) is installed per-machine.
Interessant ist auch die Eigenschaft Installed, die das Installationsdatum des Produktes enthlt.
Property(S): Installed = 2008/09/01 16:13:17
Hinweis Beginn
Die Reparaturmglichkeit eines Produktes durch die Optionen im Dialog Software kann nur
angewendet werden, falls bei der Produktinstallation die Eigenschaft ARPNOREPAIR nicht gesetzt
wurde.
Hinweis Ende
Deinstallation
Die Deinstallation eines Produktes wird durch die Argumente /x oder /uninstall realisiert, wobei
die Referenz auf das Produkt durch die Pfadangabe zum Installationspaket oder den ProductCode
festgelegt werden kann.
msiexec.exe /x <Pfad zum Installationspaket oder ProductCode>
msiexec.exe /uninstall <Pfad zum Installationspaket oder ProductCode >
Die Deinstallation eines Produktes ist ebenfalls anhand des Installationsprotokolls zu erkennen. Der
relevante Eintrag wird wiederum vom Server-Prozess erstellt und durch den Prfix Command Line:
eingeleitet. Das wesentliche Argument ist hierbei die Eigenschaft REMOVE, die auf den Wert ALL
festgelegt wird.
MSI (s) (4C:E8) [17:16:45:830]: Command Line: REMOVE=ALL CURRENTDIRECTORY=D:\Setup CLIENTUILEVEL=2
CLIENTPROCESSID=3456
Die Deinstallation kann ebenfalls ber die Funktion MsiInstallProduct() der Windows InstallerProgrammierschnittstelle ausgefhrt werden. Hierzu ist es erforderlich, die Zeichenfolge
REMOVE=ALL der Eigenschaftsauflistung der Funktion anzufgen. Weiterhin knnen hierfr auch
die Funktionen MsiConfigureProduct() und MsiConfigureProductEx() verwendet werden.
Administrative Installation
Bei einer administrativen Installation wird die Anwendung in keinen ausfhrbaren Zustand versetzt,
sondern ein administratives Abbild wird angelegt. Das bedeutet, dass das Installationspaket und die
zugehrenden Dateien in ein Zielverzeichnis kopiert werden. Von diesem Punkt aus kann direkt die
37
Kapitel 1
Clientinstallation gestartet werden. Whrend der administrativen Installation ndert der Windows
Installer bestimmte Eigenschaften der Datenbank. Weiterhin werden Dateien die sich im
komprimierten Zustand befinden extrahiert und in einer Ordnerstruktur abgelegt. Eine administrative
Installation kann von der Befehlszeile mit Hilfe des Arguments /a gestartet werden.
msiexec.exe /a <Pfad zum Paket> TARGETDIR=<Zielverzeichnis> /qb
Wird eine administrative Installation im unbeaufsichtigten Modus oder unter Verwendung der
Basisdarstellung durchgefhrt, muss das Zielverzeichnis ber die Befehlszeile angegeben werden.
Dieses ist erforderlich da keine Dialoge zum Festlegen angezeigt werden. Falls dieses nicht beachtet
wird, wird automatisch das Stammverzeichnis des Laufwerks mit dem meisten verfgbaren
Speicherplatz als Zielverzeichnis verwendet.
Im Installationsprotokoll lsst sich eine administrative Installation wiederum anhand der Eigenschaft
ACTION erkennen. Bei dieser Installationsart wird die Eigenschaft auf den Wert ADMIN gesetzt.
Property(S): ACTION = ADMIN
Eine administrative Installation kann durch die Funktion MsiInstallProduct() der Windows InstallerProgrammierschnittstelle ausgefhrt werden. Hierzu ist es erforderlich, die Zeichenfolge
ACTION=ADMIN der Eigenschaftsauflistung der Funktion anzufgen.
Angekndigte Installation
Die angekndigte Installation bezeichnet die Mglichkeit Installationsteile anzumelden, ohne aktuell
bentigte Dateien physisch zu installieren. Hierbei wird zwischen dem Zuweisen (Assign) und dem
Verffentlichen (Publish) unterschieden. Um ein Produkt anzukndigen, ist das Argument /j mit
Angabe zustzlicher Parameter und Angabe des Windows Installer-Paketes zu verwenden. Ein
wesentlicher Punkt ist hierbei die Angabe des Kontexts, fr den das Produkt angekndigt werden soll.
Aus diesem Grund ist das Argument /j weiter zu qualifizieren, um dadurch den Benutzer- oder
Maschinenkontext zu bestimmen. Die mglichen Befehlszeilenaufrufe knnen wie folgt definiert
werden.
msiexec.exe /j[u|m] <Pfad zum Paket>
msiexec.exe /j[u|m] <Pfad zum Paket> /t <Transformation>
msiexec.exe /j[u|m] <Pfad zum Paket> /g <Sprach-ID>
Zu erkennen ist hierbei dass die Installation bei Bedarf immer mit dem Argument /j eingeleitet wird,
wobei das j fr Just-In-Time steht. Hieran muss der Kontext angefgt werden, wobei u fr
User steht und somit den aktuellen Benutzer kennzeichnet und m (maschine) den
Maschinenkontext. Im Installationsprotokoll lsst sich eine Installation bei Bedarf anhand der
Eigenschaft ACTION erkennen. Bei dieser Installationsart wird die Eigenschaft auf den Wert
ADVERTISE gesetzt.
Property(S): ACTION = ADVERTISE
Eine Installation bei Bedarf kann darber hinaus durch die Funktionen MsiAdvertiseProduct() und
38
Kapitel 1
Installationsphasen
Nach dem Aufruf des Installationspaketes beginnt der Windows Installer die notwendigen
Informationen zur Durchfhrung der Installation zu sammeln. Dieser Abschnitt der Installation wird
als Acquisition-Phase bezeichnet. Nach dieser Phase werden die gesammelten Daten an den ServerProzess bergeben, der anschlieend die entsprechenden Installationsskripte generiert und die
eigentliche Installation durchfhrt. Dieser Abschnitt der Installation wird als Execution-Phase
bezeichnet. Wird die Execution-Phase fehlerfrei durchlaufen, findet der Wechsel in die Commit-Phase
statt, in der die Installation abgeschlossen wird. Kommt es jedoch im Rahmen der Installation zu
Problemen, wird die Rollback-Phase ausgefhrt, wodurch der Computer wieder in den ursprnglichen
Zustand zurckgesetzt wird. Das Zusammenspiel der Acquisition- und der Execution-Phase wird in
Abbildung 1.7 dargestellt.
Die erwhnte Rollback- und Commit-Phase werden an dieser Stelle nicht betrachtet. Eine Erluterung
folgt in Kapitel 8.
Acquisition-Phase
Die Acquisition-Phase dient im Wesentlichen dazu, Informationen fr den Installationsprozess zu
beschaffen und diese dem Ausfhrungsmodul (Execution Engine) zur Verfgung zu stellen. Die
Acquisition-Phase wird immer mit den Privilegien des aktuellen Benutzers durchgefhrt. Die
Zuweisung von Systemprivilegien ist fr diese Phase nicht mglich.
Sehen Sie zunchst das folgende Beispiel: Der Benutzer fhrt im Windows-Explorer einen Doppelklick
auf eine MSI-Datei durch. Dateien mit einer solchen Endung sind standardmig mit dem Windows
Installer-Dienst verknpft, so dass hierdurch die folgende Befehlszeile konstruiert und aufgerufen
Persnliche Ausfertigung fr Martin Martinsson
39
Kapitel 1
wird:
%windir%\system32\msiexec.exe /i <Pfad zum Installationspaket>
Es wird zunchst der Client-Prozess gestartet und diesem ein Verweis auf das Installationspaket
bergeben. Optional sind hierbei auch die bergabe von Windows Installer-Patches oder
Transformationen mglich. Der Client-Prozess ldt das Installationspaket in den Arbeitsspeicher und
wendet alle Patches und Transformationen darauf an, die der Befehlszeile angefgt wurden und fr
dieses Paket gltig sind. Im Folgenden wird die Initialisierung ausgefhrt, in der unter Anderem der
Speicherbedarf ermittelt und der Status der Features berprft wird. Anschlieend wird die
Benutzeroberflche angezeigt und es findet die Interaktion mit dem Benutzer statt. Nachdem alle
Eingaben vorgenommen wurden, wird der Server-Prozess gestartet. Diesem Prozess werden alle
bereits ermittelten Informationen in Form einer Befehlszeile bergeben. In einem Installationsprotokoll
ist diese Aktion als Switching to server bezeichnet.
MSI (c) (1C:E8) [16:14:09:186]: Switching to server: INSTALLLOCATION="C:\Program Files (x86)\Football 2008\"
TARGETDIR="F:\" CURRENTDIRECTORY="D:\Setup" CLIENTUILEVEL="0" CLIENTPROCESSID="2332"
USERNAME="Andreas Kerl" COMPANYNAME="Microsoft Deutschland GmbH" SOURCEDIR="D:\Setup\" ACTION="INSTALL"
EXECUTEACTION="INSTALL" ROOTDRIVE="F:\" INSTALLLEVEL="1" WIXUI_INSTALLDIR_VALID="1" SECONDSEQUENCE="1"
ADDLOCAL=Application
Sie erkennen in dem Ausschnitt des Installationsprotokolls, dass ausschlielich die ffentlichen
Eigenschaften an den Server bergeben werden. Verfgt der Benutzer ber administrative Privilegien
werden alle ffentlichen Eigenschaften bergeben. Handelt es sich bei dem Benutzer um keinen
Administrator und wird die Installation mit erhhten Anwenderprivilegien ausgefhrt, werden nur die
als sicher erachteten Eigenschaften (SecureCustomProperties) bergeben.
Hinweis Beginn
Wird die Installation mit der Standardbenutzeroberflche (Basic-UI) oder ohne Anzeige einer
Benutzeroberflche durchgefhrt, wird der Server-Prozess direkt aufgerufen.
Hinweis Ende
Zusammenfassend betrachtet lsst sich erkennen, dass die Acquisition-Phase sowohl im Client- als
auch im Server-Prozess ausgefhrt wird. Das Ergebnis des Client-Prozesses ist eine Befehlszeile, die
an den Server bergeben wird. Das Resultat des Server-Prozesses ist ein Installationsskript, das an dem
Konfigurationsmanager zugewiesen wird.
40
Kapitel 1
Execution-Phase
Die Execution-Phase ist der Teil des Installationsprozesses in dem das Zielsystem physisch modifiziert
wird. Dem Konfigurationsmanager wird das Installationsskript vom serverseitigen Installationsmodul
bergeben. Das Ausfhrungsmodul wird geladen und die Operationsanweisungen des Skriptes werden
ausgefhrt. In dieser Phase werden die Modifikationen am Dateisystem und in der Systemregistrierung
vorgenommen.
Die Execution-Phase wird im Kontext des lokalen Systemkontos ausgefhrt, da hierdurch
sichergestellt werden kann, dass der Installationsprozess die bentigten Rechte besitzt, um
Eintragungen in allen Bereichen der Systemregistrierung und des Dateisystems vorzunehmen. Dieses
bedeutet nicht, dass die vollstndige Installation mit Privilegien ausgefhrt wird, ber die der aktuelle
Benutzer nicht verfgt. Vielmehr wird fr die Execution-Phase ein Identittswechsel auf den aktuellen
Benutzer ausgefhrt, falls es sich um einen Standardbenutzer handelt. Die Installationsaufgaben
werden demzufolge mit den Anwenderprivilegien ausgefhrt. Der Windows Installer legt jedoch
zustzliche Konfigurationsdaten in Bereichen des Zielsystems ab, auf die ein Standardbenutzer keinen
Zugriff hat. Diese Konfiguration wird mit den Privilegien des lokalen Systems vorgenommen.
Hinweis Beginn
Der Administrator kann veranlassen, dass eine Installation mit erhhten Anwenderprivilegien
ausgefhrt wird. Diese erhhten Privilegien beziehen sich ausschlielich auf die Execution-Phase.
Hinweis Ende
41
Kapitel 1
In der Abbildung ist auch erkennbar, dass noch weitere Prozesse mit der Bezeichnung msiexec.exe
ausgefhrt werden. Bei den zustzlichen Prozessen handelt es sich um sogenannte Custom ActionServer. Zur Unterscheidung des regulren Installationsprozess von dem Custom Action-Server, muss
die Befehlszeile ausgewertet werden. Die Custom Action-Server verfgen hierbei ber das Argument
-Embedding, dem eine GUID angefgt ist.
Fr die Erluterung der Ablufe im Installationsprozess wird davon ausgegangen, dass die Installation
unter Verwendung einer vollstndigen oder reduzierten Benutzeroberflche durchgefhrt wird. Dieses
ist in sofern relevant, da nur hierbei der Client-Prozess vollstndig verwendet wird. Bei der Installation
im unbeaufsichtigten Modus oder unter Verwendung der Basisdarstellung ist dieses nicht der Fall. Der
Client-Prozess existiert in diesem Szenario zwar, aber die hierauf abzielenden Aktionen im
Installationspaket, werden nicht ausgefhrt. Dieses wird auch im Installationsprotokoll durch die
folgende Eintragung vermerkt.
MSI (c) (B4:E4) [09:00:21:040]: Client-side and UI is none or basic: Running entire install on the server.
Der Client-Prozess wird in diesen Szenarien lediglich als Reprsentationsebene bentigt. Bei
Installation unter Verwendung der Basisdarstellung werden die Dialoge durch den Server-Prozess
verwaltet. Allerdings luft der Server-Prozess in einer anderen Session, so dass diese Dialoge auf
Anforderung des Server-Prozesses durch den Client-Prozess dargestellt werden. Im Weiteren ist der
Client-Prozess in diesen Szenarien fr die Protokollierung zustndig. Das bedeutet auch hier, dass der
Server-Prozess den Client-Prozess anweist, Eintragungen im Protokoll vorzunehmen.
Kapitel 1
43
Kapitel 1
und Physische Speicher, der Prozessor oder die verwendete Plattform abgerufen. Die Datenbank wird
im schreibgeschtzten Modus geffnet, um ein berschreiben der definierten Werte zu verhindern.
Damit trotzdem Modifikationen an den definierten Eigenschaften vorgenommen werden knnen, wird
eine temporre Tabelle zur Aufnahme der Eigenschaften mit der Bezeichnung _Property im Speicher
abgelegt. Das Installationsmodul prft die Gltigkeit des Schemas des Installationspaketes, also ob die
bentigte Windows Installer-Version auf dem System vorhanden ist und ob es sich um eine gltige
Systemarchitektur handelt. Die Installation eines 64-Bit Paketes auf einem 32-Bit Windows wird somit
an dieser Stelle abgebrochen.
Als nchstes werden die Eigenschaften ausgewertet, die im Speicherbereich AdminProperties abgelegt
wurden. Dieser Speicherbereich wird im Installationspaket im Rahmen einer administrativen
Installation erstellt. Im Folgenden berprft das Installationsmodul, ob die notwendigen Privilegien zur
Installation des Produktes vorhanden sind, ob die Installation mit erhhten Anwenderprivilegien
erfolgen soll und ob die Installation nicht durch die Systemrichtlinie DisableMsi verhindert wird.
Nachdem die Transformationen und Patches angewendet wurden, werden die weiteren Eigenschaften
der Befehlszeile auf das Produkt angewendet. Dieses bedeutet, dass die bergebenen Werte in die
temporre Tabelle _Property bertragen werden. Wird die Installation mit erhhten Privilegien
ausgefhrt, sind hierbei nur die Eigenschaften zulssig, die als sicher erachtet werden. Als sicher
erachtete Eigenschaften mssen in der Eigenschaft SecureCustomProperties der Tabelle Property
definiert werden. Der Windows Installer verfgt bereits ber einen Standardvorrat an Eigenschaften,
die bereits als sicher erachtet werden. Diese Einschrnkung kann durch die Eigenschaft
EnableUserControl oder durch die gleichnamige Systemrichtlinie auer Kraft gesetzt werden. In
diesem Fall werden alle ffentlichen Eigenschaften an den Server-Prozess bergeben. Nachdem noch
einige weitere Eigenschaften verarbeitet wurden ist die Initialisierungsphase des Client-Prozesses
abgeschlossen.
Eine Benutzeroberflche ist whrend der Produktankndigung (ADVERTISE) nicht verfgbar. Die
Tabelle AdvtUISequence enthlt aus diesem Grund keine Eintragungen.
Hinweis Ende
44
Kapitel 1
45
Kapitel 1
Aktivitten im Server-Prozess
Die Initialisierung des Server-Prozesses geschieht auf eine hnliche Weise wie die des Clients. Die
primre Komponente dieses Prozesses ist der Konfigurationsmanager. Der Konfigurationsmanager
empfngt die Installationsaufforderung vom Client, wozu ihm der ProductCode, die Top-LevelAktion, die Befehlszeile, Informationen zur Protokollierung und eine Referenz auf den UI-Handler
bergeben werden. Zunchst wird erneut geprft ob der Mutex _MSIExecute existiert. Im Anschluss
wird das Installationsmodul erstellt und der Installationsprozess gestartet. Weiterhin wird der
Systemstatus analysiert und eine berprfung des Paketes hinsichtlich der Richtlinien fr
Softwareeinschrnkungen (SAFER) durchgefhrt. Falls das Produkt noch nicht installiert ist, wird das
Installationspaket im Verzeichnis %windir%\installer gespeichert.
Der Server-Prozess kann keine Benutzeroberflche darstellen. Aus diesem Grund werden Meldungen
zum Client gesendet, die dann vom clientseitigen UI-Handler ausgewertet und dargestellt werden.
Ausgenommen hiervon ist die unbeaufsichtigte Installation; hierbei werden keine Dialoge durch den
Client angezeigt und es wird somit die Mglichkeit gegeben auch Installationen durchzufhren, ohne
dass ein interaktiver Benutzer am System angemeldet ist. Benutzerspezifische Eintragungen werden in
einem solchen Fall im Systemprofil (%windir%\system32\config\systemprofile) abgelegt.
Der Client-Prozess bergibt dem Server neben vielen Informationen auch die aktuelle Top-LevelAktion. In Abhngigkeit zu dieser Aktion wird die Tabelle fr die Ausfhrungssequenz bestimmt und
die darin enthaltenen Aktionen ausgefhrt. Folgende Tabellen werden hierzu in Abhngigkeit zur TopLevel-Aktion verwendet (Siehe auch Abbildung 1.9):
INSTALL: InstallExecuteSequence
ADMIN: AdminExecuteSequence
ADVERTISE: AdvtExecuteSequence
Wie im clientseitigen Prozess werden zunchst die Aktionen zur Bestimmung der
Installationsinformationen ausgefhrt. Im ersten Teil werden hier die Systemvoraussetzungen
(LaunchCondition) geprft und nach abhngigen Ressourcen gesucht (AppSearch). Es knnen auch
benutzerdefinierte Aktionen in diesem Teil zur Anwendung kommen. Im weiteren Verlauf werden die
Aktionen zur Berechnung des Speicherbedarfs (CostInitialize, FileCost und CostFinalize) ausgefhrt
46
Kapitel 1
Speicherplatz nicht vorhanden ist. Bei dieser Prfung ist die Kenntnis der Zielverzeichnisse uerst
relevant. Aus diesem Grund werden zu diesem Zeitpunkt auch die symbolischen Verzeichnisnamen
innerhalb des Paketes gegen die absoluten Pfade ausgetauscht. Somit werden innerhalb dieser Phase
zwei wesentliche Aktivitten verrichtet, dessen Realisierung durch die folgenden Objekte erfolgt:
SelectionManager: Verwaltet den Status der Features und Komponenten, die im Installationspaket
definiert wurden. Hierbei werden der Systemstatus und die individuelle Konfiguration der Features
bercksichtigt.
DirectoryManager: Bestimmt die tatschlichen Zielverzeichnisse anhand der Systemkonfiguration
und der Definition im Installationspaket.
Bei der Berechnung des Speicherbedarfs wird sichergestellt, dass das Zielsystem ber ausreichend
Speicherplatz auf den Datentrgern verfgt. Hierbei werden Szenarien fr die lokale Installation von
Komponenten, die Ausfhrung von Komponenten vom Quellmedium und fr Komponenten, die nicht
installiert werden sollen, getrennt bercksichtigt. Die Werte werden jeweils fr Rollback-Szenarien
und fr Szenarien in denen kein Rollback ausgefhrt wird, berechnet. Zur Ermittlung des tatschlichen
Installationsumfangs und somit der Bestimmung des erforderlichen Festplattenspeichers werden die
folgenden Informationen zu den betreffenden Komponenten bentigt:
Installationsstatus (InstallState): Der bisherige Status der Komponente auf dem Zielsystem.
Anforderungsstatus (RequestState): Der Status der Komponente, der nach der Installation
hergestellt sein soll.
Aktionsstatus (ActionState): Die Aktion, die ausgefhrt werden muss, um die Komponente vom
Installationsstatus in den Anforderungsstatus zu berfhren.
Nachdem der bentigte Speicherbedarf ermittelt wurde, wird whrend der Aktion InstallValidate
geprft, ob ausreichend Festplattenspeicher zur Verfgung steht. Weiterhin wird geprft, ob zu
ersetzende Dateien in Verwendung sind. Die Aktion InstallInitialize schliet die Initialisierungsphase
letztlich ab, wie auch der Auszug aus dem Protokoll zeigt.
Action ended 12:06:30: CostFinalize. Return value 1.
MSI (s) (3C:80) [12:06:30:123]: Feature: Application; Installed: Absent; Request: Local; Action: Local
MSI (s) (3C:80) [12:06:30:123]: Component: C__Football.exe; Installed: Absent; Request: Local; Action: Local
MSI (s) (3C:80) [12:06:30:123]: Component: __C__Football.exe65; Installed: Null; Request: Local; Action:
Local
MSI (c) (5C:E0) [12:06:30:137]: RESTART MANAGER: Detected that application with id 4620,
friendly name 'Football2008', of type RmMainWindow and status 1 holds file[s] in use.
MSI (s) (3C:80) [12:06:30:138]: RESTART MANAGER: Successfully shut down all applications in
the service's session that held files in use.
MSI (c) (5C:E0) [12:06:30:138]: RESTART MANAGER: Successfully shut down all applications
that held files in use.
Bei der Betrachtung des Protokolls fallen einige Eintrge besonders auf. Zu Beginn finden sich die
Persnliche Ausfertigung fr Martin Martinsson
47
Kapitel 1
Statusinformationen zu den Features und Komponenten und danach wird der Abschluss des
Berechnungsprozesses signalisiert, indem die Eigenschaft CostingComplete auf den Wert 1 gesetzt
wurde. Im Folgenden geht es um die Ermittlung von bereits verwendeten Dateien, wozu der NeustartManager verwendet wird. Beim Neustart-Manager handelt es sich um eine neue Technologie in
Windows Vista und Windows Server 2008, der ein eigenes Kapitel in diesem Buch gewidmet wurde.
Aber nochmal zurck zum Beginn des Protokollauszugs. Bei Betrachtung der Komponenten ist
auffllig, dass die Komponente C__Football.exe zustzlich in einer augenscheinlich modifizierten
Darstellung dort aufgefhrt ist, obwohl eine Komponente mit der Bezeichnung
__C__Football.exe65 im Installationspaket nicht vorhanden ist. Diese zustzliche virtuelle
Komponente ist fr die Berechnung des Speicherplatzes erforderlich. Grundstzlich ist eine
Komponente mit einem Installationsverzeichnis verknpft, so dass dieses Installationsverzeichnis in
die Speicherberechnung einfliet. Nun gibt es Szenarien, in denen zustzliche
Installationsverzeichnisse in die Berechnung einflieen mssen, da sie indirekt verwendet werden.
Eine Komponente enthlt beispielsweise eine Datei und eine Dateiverknpfung. Das
Installationsverzeichnis wird durch die Spalte Directory_ der Tabelle Component bestimmt und fliet
in die Berechnung direkt ein. Die Dateiverknpfung wird hingegen in einem anderen Verzeichnis wie
beispielsweise dem Windows-Desktop erzeugt. Somit muss auch dieses Verzeichnis in den
Berechnungsprozess einbezogen werden.
Fr jedes alternative Verzeichnis erzeugt der Windows Installer eine temporre Komponente. Die
Bezeichnung beginnt mit einem doppelten Unterstrich, dem die ersten 40 Zeichen der Bezeichnung der
primren Komponente folgen. Abgeschlossen wird die Bezeichnung mit einer Nummer, die bei 65
beginnt und bei jeder Unter-Komponente erhht wird.
MSI (s) (3C:80) [12:06:30:123]: Component: Simple7890123456789012345678901234567890123456789012345;
Installed: Absent; Request: Local; Action: Local
MSI (s) (3C:80) [12:06:30:123]: Component: __Simple789012345678901234567890123456789065;
Installed: Null; Request: Local; Action: Local
Dieser Mechanismus wird als Cost-Linking bezeichnet und wird bei Gebrauch der Tabellen Shortcut,
RemoveFile, MoveFile (Fr Quell- und Zielverzeichnisse), DuplicateFile, Registry, IniFile und
ReserveCost verwendet. Weiterhin kommt er auch bei der Installation von globalen Assemblies und
bei der Verwaltung des Baseline-Caches fr Windows Installer-Patches zum Einsatz.
Kapitel 1
Die Installation wird nun mit den Aktionen (InstallFiles, WriteRegistryValues etc.) fortgesetzt, die
Operationsanweisungen erstellen. Unter einer Operationsanweisung wird die nicht mehr weiter zu
unterteilende Teilaufgabe verstanden, die zur Durchfhrung einer Aktion erforderlich ist. Das bedeutet,
dass beispielsweise der Kopiervorgang einer Datei in einzelne Aktionen wie dem Festlegen der
Ordner, dem Wechsel des Quellmediums und letztlich dem tatschlichen Kopieren unterteilt wird.
SetTargetFolder(Folder=C:\Program Files (x86)\Football 2008\)
SetSourceFolder(Folder=1\qadx0pjx\|Football 2008\)
ChangeMedia(,MediaPrompt=Please insert the disk: ,MediaCabinet=Data.cab,BytesPerTick=32768,CopierType=2,
ModuleFileName=C:\Windows\Installer\c62407.msi,,,,,IsFirstPhysicalMedia=1)
FileCopy(SourceName=Football.exe,SourceCabKey=F__Football.exe,DestName=Football.exe,Attributes=512,
FileSize=44032,PerTick=32768,,VerifyMedia=1,,,,, ,Version=1.0.0.0,Language=0,InstallMode=58982400,,,)
Die Operationsanweisungen werden einem Skript angefgt, dass im Ordner %windir%\installer erstellt
wird. Der Dateiname wird aus einer temporren Zeichenfolge mit dem Prfix Msi gebildet. Der Typ
der Skriptdatei ist abhngig vom jeweiligen Ausfhrungsmodus der Installation. Als erste Eintragung
wird der Skriptdatei die Operationsanweisung Header angefgt, deren Inhalte in Tabelle 1.7
dargestellt werden.
Name
Beispiel
Beschreibung
Signature
Signature = 1397708873
Version
Version = 405
Timestamp
Timestamp = 957117450
Zeitstempel
LangId
LangId = 1031
Platform
Platform = 0
Plattform
ScriptType
ScriptType = 1
49
Kapitel 1
ScriptMajorVersion und
ScriptMinorVersion
ScriptMajorVersion = 21,
ScriptMinorVersion = 4
ScriptAttributes
ScriptAttributes = 0
Nach dem Header werden Informationen zum Produkt und zum verwendeten Installationspaket dem
Skript angefgt, wie dieses auch nachfolgend dargestellt wird.
Header(Signature=1397708873,Version=405,Timestamp=958626599,LangId=1033,Platform=0,ScriptType=1,
ScriptMajorVersion=21,ScriptMinorVersion=4,ScriptAttributes=1)
ProductInfo(ProductKey={0BC4E7F4-8840-4D23-9AF9-C68CFFDC7C0E},ProductName=Football 2008,
PackageName=FB001.msi,Language=1033,Version=16777216,Assignment=1,ObsoleteArg=0,
ProductIcon=I__Football.exe,,PackageCode={74D8403A-F2A5-47DB-B819-78316452A1B3},,,InstanceType=0,
LUASetting=1,RemoteURTInstalls=0,ProductDeploymentFlags=3)
Nun aber zurck zu der Verarbeitung der Aktionen der Sequenztabelle. Das Installationsmodul enthlt
ein Objekt zum Auswerten der Bedingungen von Standardaktionen. Gibt eine Bedingung den Wert
True zurck, wird fr diese Aktion eine Operationsanweisung in das Skript bertragen. Die
Operationsanweisung wird in Abhngigkeit zum Installationsstatus, zum Anforderungsstatus und zum
Aktionsstatus der Features und Komponenten aus einem Satz von vordefinierten Anweisungen fr
diese Aktion bestimmt. Allerdings verfahren nicht alle Standardaktionen nach diesem Schema. So
existieren durchaus einige Standardaktionen, die zwischen InstallInitialize und InstallFinalize
angeordnet sind, aber dennoch keine Eintragungen im Skript vornehmen, sondern direkt die
entsprechende Aktion ausfhren.
InstallExecute und InstallExecuteAgain: Die Aktion InstallExecute und InstallExecuteAgain mssen
zwischen den Aktionen InstallInitialize und InstallFinalize definiert werden. Durch den Aufruf von der
Aktionen werden alle im Skript befindlichen Aktionen seit dem Start der Installation oder dem letzten
Aufruf von InstallExecute oder InstallExecuteAgain ausgefhrt und das System wird hierdurch
aktualisiert ohne jedoch die Transaktion zu beenden. Die Aktion InstallExecuteAgain ist identisch mit
der Aktion InstallExecute. Es wurde lediglich einen andere Bezeichnung gewhlt, da es aufgrund einer
Schlsselverletzung nicht mglich ist, eine Aktion mehrfach in einer Tabelle zu definieren.
Diese beiden Aktionen sind in bestimmten Situationen uerst kritisch zu betrachten. Wird eine dieser
Aktionen ausgefhrt, wird das bisher generierte Skript verwendet und das System wird physisch
modifiziert. Kommt es im Folgenden zu einem Fehler innerhalb der Commit-Phase, werden nur die
nderungen zurckgenommen, die nach InstallExecute und InstallExecuteAgain durchgefhrt wurden.
Die Modifikationen, die davor durchgefhrt wurden bleiben bestehen. Dieses teilweise problematische
Verhaltensmuster wurde mit dem Windows Installer 4.5 verndert; hiermit werden alle Modifikationen
wie erwartet zurckgenommen.
ScheduleReboot und ForceReboot: Die Aktion ScheduleReboot veranlasst einen Computerneustart
nach dem Abschluss der Installation. Die Aktion ForceReboot hingegen, veranlasst einen umgehenden
Neustart des Systems. Dem Anwender wird hierzu eine Dialogbox angezeigt, falls die
Darstellungsform der Benutzeroberflche dies erlaubt. Beim Ausfhren von ForceReboot werden alle
vorherigen im Skript befindlichen Aktionen abgeschlossen. Der Installer erstellt den
Registrierungsschlssel
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunOnce und fgt den
Produktcode oder den Namen des Installationspaketes als Wert hinzu. Der Installer erstellt ebenfalls
50
Kapitel 1
eine Befehlszeile, die diesem Schlssel als Wert hinzugefgt wird. Diese Befehlszeile verfgt ber den
folgenden Aufbau:
AFTERREBOOT=1 RUNONCEENTRY=[Name des Eintrages]
Der Eintrag RUNONCEENTRY enthlt einen Verweis auf einen speziellen RunOnce-Schlssel fr den
Windows
Installer,
der
unter
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Installer\RunOnceEntries
angelegt wird. Diese Informationen werden bentigt, um die Installation auf Basis der IPI-Datei nach
dem Neustart fortzusetzen.
Wichtig Beginn
Bei der Verwendung der paketbergreifenden Transaktionen mit den Windows Installer 4.5 existieren
abweichende Verhaltensmuster bei den Aktionen ForceReboot und ScheduleReboot, die im Kapitel 8
detailliert erlutert werden.
Wichtig Ende
Zur Realisierung des transaktionalen Verhaltens erstellt der Konfigurationsmanager ein weiteres
Ausfhrungsmodul um das Rollback-Skript auszufhren, falls dieses nicht deaktiviert wurde
(DISABLEROLLBACK). Wird die Installation abgebrochen oder durch einen Fehler beendet, werden
Persnliche Ausfertigung fr Martin Martinsson
51
Kapitel 1
die Aktionen des Rollback-Skriptes ausgefhrt. Wird die Installation fehlerfrei durchgefhrt werden
die Commit-Aktionen ausgefhrt, die sich ebenfalls im Rollback-Skript befinden.
Wichtig Beginn
Bei der Verwendung von paketbergreifenden Transaktionen mit dem Windows Installer 4.5, kommt
es zu einem genderten Ablauf, da die Commit-Phase erst nach der Installation aller Pakete aufgerufen
wird. Detaillierte Informationen dazu sind im Kapitel 8 zu finden.
Wichtig Ende
Installation abschlieen
Nachdem die Modifikation des Zielsystems abgeschlossen wurde, wird die Erstellung des
Wiederherstellungspunktes beendet. Weiterhin wird die Sperrung des Installationsmoduls aufgehoben,
indem der Schlssel InProgress der Systemregistrierung und die IPI-Datei gelscht werden. Diese
Aktionen werden im Kontext des lokalen Systemkontos ausgefhrt. Das Installationsmodul wird
anschlieend terminiert. Die Terminierung wird jedoch aufgeschoben, bis alle benutzerdefinierten
Aktionen abgeschlossen sind, die asynchron ausgefhrt wurden. Benutzerdefinierte Aktionen, die eine
ausfhrbare Datei verwenden (Typ 2, 18, 50, 51), sind hiervon jedoch ausgenommen.
Der Rckgabewert der Skriptausfhrung wird ausgewertet, um festzustellen, ob ein Computerneustart
erforderlich ist. Die Anforderung fr den Neustart wird an den Client bertragen und dem Benutzer in
einer Dialogbox angezeigt. Wird die Installation ohne Darstellung einer Benutzeroberflche
ausgefhrt, erfolgt der Computerneustart automatisch. Dieses gilt jedoch nur, falls der Neustart nicht
durch die Eigenschaft REBOOT unterdrckt wurde. Anschlieend werden das Installationsskript und
alle temporren Kabinettdateien gelscht. Wurde im Rahmen der Installation ein entsprechendes
Produkt deinstalliert, werden diese Daten ebenfalls entfernt. Die Aktionen zum Entfernen der Daten
werden auch unter dem lokalen Systemkonto ausgefhrt. Wurde festgestellt, dass ein
Computerneustart erforderlich ist, empfngt der Server die Anforderung hierzu und fhrt schlielich
den Computerneustart aus.
52
Kapitel 1
Anhand dieser Anweisung wird die korrekte Version des Ausfhrungsmoduls geprft und die zu
verwendenden Privilegien werden ermittelt. Das Argument ScriptType legt die Art des
Installationsskriptes fest. Die mglichen Werte sind in Tabelle 1.8 aufgefhrt.
ScriptType
Beschreibung
Standardinstallation (Install).
Rollback-Installation (Rollback)
Das Argument ScriptAttributes legt unter anderem fest, ob die Installation mit den Privilegien des
Persnliche Ausfertigung fr Martin Martinsson
53
Kapitel 1
aktuellen Benutzers oder des lokalen Systemkontos (Elevated Installation) ausgefhrt wird. Hierbei
handelt es sich um ein Bit-Feld, in dem die Installation mit Systemprivilegien durch den Wert 1
ausgedrckt wird.
ProductInfo
Bei der Operationsanweisung ProductInfo handelt es sich immer um die zweite Anweisung im
Installationsskript. Die Anweisung enthlt Informationen zu dem Produkt, das installiert werden soll
und ist wie folgt aufgebaut:
ProductInfo(ProductKey, ProductName, PackageName, Language, Version, Assignment, ObsoleteArg,
ProductIcon, PackageMediaPath, PackageCode, AppCompatDB, AppCompatID, InstanceType, LUASetting,
RemoteURTInstalls, ProductDeploymentFlags)
Die Informationen werden vom Ausfhrungsmodul bentigt, um den Installationstyp zu ermitteln und
hierdurch den Ort festzulegen, an dem die Informationen zur Produktverffentlichung und zur
Registrierung eventueller COM-Komponenten abgelegt werden. Der Installationstyp wird auf Basis
des Argumentes Assignment festgelegt. Gltige Werte hierfr sind in Tabelle 1.9 aufgefhrt:
Assignment
Beschreibung
Anwenderbezogene Installation
Maschinenbezogene Installation
Verfgt das Argument Assignment ber den Wert 1, wird zunchst geprft, ob das Produkt fr
diesen Installationstyp (Computer) bereits auf dem lokalen System angekndigt wurde. Ist dieses nicht
zutreffend, wird geprft, ob der aktuelle Benutzer ber administrative Privilegien verfgt, oder ob der
Installationsprozess mit erhhten Rechten ausgefhrt wird. Ist eine der Bedingungen zutreffend,
werden die Daten zur Produktverffentlichung in der Systemregistrierung unter
HKLM\Software\Classes\Installer abgelegt. Informationen von COM-Komponenten werden unter
HKLM\Software\Classes gespeichert. Im Ordner %windir%\installer\<Productcode> werden
Symboldateien fr Dateiverknpfungen und alle Arten von Transformationen gespeichert. Ist keine der
Bedingungen zutreffend wird der Benutzer informiert, dass seine Berechtigungen fr diese
Installationsart nicht ausreichend sind und die Installation wird vom Ausfhrungsmodul abgebrochen.
Wurde das Argument Assignment hingegen auf den Wert 0 festgelegt, wird ebenfalls geprft, ob das
Produkt fr diesen Installationstyp (Benutzer) bereits angekndigt wurde. Ist dieses nicht zutreffend,
wird geprft, ob der Installationsprozess mit erhhten Rechten ausgefhrt wird. In diesem Fall wird die
Installation Per-User-Managed ausgefhrt und die Daten zur Produktverffentlichung werden unter
HKLM\Software\Microsoft\Windows\CurrentVersion\Installer\Managed\<User-SID>\Installer
gespeichert. COM-Komponenten werden hierbei unter HKCU\Software\Classes abgelegt. Wird der
Installationsprozess hingegen mit den Privilegien des Benutzers ausgefhrt, handelt es sich um eine
Per-User-Unmanaged Installation. Die Daten zur Produktverffentlichung werden unter
HKCU\Software\Microsoft\Installer und die COM-Informationen unter HKCU\Software\Classes
abgelegt. In beiden Fllen werden Symboldateien fr Dateiverknpfungen und fr Transformationen,
die nicht als sicher erachtet werden, im Ordner %appdata%\Microsoft\Installer\<Productcode>
gespeichert.
54
Kapitel 1
End
Die Operationsanweisung End markiert das Ende des jeweiligen Skriptes und ist somit die letzte
Anweisung im Skript. Diese Operationsanweisung verfgt ber keine Argumente.
Zugriffssteuerungslisten (Access Control List, ACL) von vorhandenen Schlsseln, werden whrend
des Schreibens der Registrierungswerte gespeichert.
Hinweis Ende
Bei einer Installation mit erhhten Rechten wird kein Identittswechsel durchgefhrt, wenn auf
HKEY_CURRENT_USER zugegriffen werden muss. Der Windows Installer ldt den Stamm des
aktuellen Benutzers als eigenen HKEY_CURRENT_USER Stamm.
Im Installationsskript findet sich eine Vielzahl von Eintrgen, mit denen die Registrierung aufgehoben
wird. Ein Auszug davon wird nachfolgend angefgt.
RegOpenKey(Root=-2147483646,
Key=Software\Classes\Installer\Products\4F7E4CB0048832D4A99F6CC8FFCDC7E0,,BinaryType=1,)
RegRemoveValue(Name=DeploymentFlags,Value=#3,)
RegRemoveValue(Name=AuthorizedLUAApp,Value=#1,)
RegRemoveValue(Name=InstanceType,Value=#0,)
RegRemoveValue(Name=ProductIcon,
Value=C:\Windows\Installer\{0BC4E7F4-8840-4D23-9AF9-C68CFFDC7C0E}\I__Football.exe,)
55
Kapitel 1
RegRemoveValue(Name=AdvertiseFlags,Value=#388,)
RegRemoveValue(Name=Assignment,Value=#1,)
RegRemoveValue(Name=Version,Value=#16777216,)
RegRemoveValue(Name=Language,Value=#1033,)
RegRemoveValue(Name=PackageCode,Value=A3048D475A2FBD748B91871346251A3B,)
RegRemoveValue(Name=ProductName,Value=Football 2008,)
RegOpenKey(Root=-2147483646,
Key=Software\Classes\Installer\Products\4F7E4CB0048832D4A99F6CC8FFCDC7E0,,BinaryType=1,)
RegRemoveKey()
Es existiert aber dennoch die Operationsanweisung ProductUnregister. Diese wird allerdings nur fr
die Deinstallation verwendet und nicht fr einen Rollback. Zu den relevanten Operationsanweisungen
dieser Kategorie gehren somit ProductRegister, ProductUnregister, ProductPublish,
ProductUnpublish, FeaturePublish und ComponentPublish.
Kapitel 1
Patch enthlt. Die Anzahl der Patches die auf diese Datei angewendet werden sollen, wurde bereits
durch FileCopy ermittelt und wird nun bentigt, um bestimmte Aktionen fr diese Datei zu
berspringen. Dieses ist erforderlich falls die Datei bereits in Teilen gepatcht wurde.
Im Folgenden wird der Patch zunchst in einen Sicherungsordner gespeichert und anschlieend auf die
Datei angewendet. Das Ergebnis, also die gepatchte Datei, wird ebenfalls in dem Sicherungsordner
abgelegt. Alle weiteren Patches werden nun auf diese temporre Datei angewendet. Nachdem alle
erforderlichen Patches angewendet wurden, wird die Datei in das eigentliche Zielverzeichnis kopiert.
Beschreibung
Argumente
CustomActionSchedule
CustomActionCommit
CustomActionRollback
Benutzerdefinierte Aktionen mit verzgerter Ausfhrung werden in so genannten Custom ActionServern ausgefhrt, die von der Art der benutzerdefinierten Aktion und vom Installationskontext
abhngig
sind.
Nur
benutzerdefinierte
Aktionen
die
mit
dem
Attribut
msidbCustomActionTypeNoImpersonate markiert wurden, werden bei einer Installation vom Typ PerUser-Managed oder Per-Machine von dem Custom Action-Server ausgefhrt, der im Kontext des
lokalen Systemkontos ausgefhrt wird. In allen anderen Szenarien wird der benutzerdefinierte Code in
dem
impersonierten
Custom
Action-Server
ausgefhrt.
Die
Operationsanweisungen
CustomActionCommit und CustomActionRollback werden immer im Rollback-Skript abgelegt. Die
Anweisung CustomActionRollback wird ausschlielich in Rollback-Szenarien ausgefhrt, whrend
CustomActionCommit nur ausgefhrt wird, wenn die Installation erfolgreich abgeschlossen wurde.
Wichtig Beginn
57
Kapitel 1
Individuelle Erweiterungen
Der Windows Installer stellt fr die normalen Installationsttigkeiten einen Vorrat an Aktivitten zur
Verfgung, die als Standardaktionen bezeichnet werden. In Verbindung mit den Sequenztabellen der
Windows Installer-Datenbank werden hiermit die Ablufe im Installationsprozess modelliert. Die
Zielsetzung heutiger Installationsszenarien geht jedoch weit ber diese Ttigkeiten hinaus und verlangt
vielfach die Ausfhrung von individuellen Codefragmenten, um zielgerichtete Anforderungen zu
ermglichen. Zur Realisierung dieser Anforderungen stellt der Windows Installer eine Schnittstelle zur
Verfgung, durch die eine eigene Programmlogik in den Installationsablauf integriert werden kann.
Custom Action-Server
Die Ausfhrung von benutzerdefinierten Aktionen zhlt unbestreitbar zu den komplexesten und
kritischsten Vorgngen im gesamten Installationsprozess. Dieses resultiert zum einen aus der
Forderung individuellen Programmcode in unterschiedlichen Formaten zu untersttzen und zum
anderen die Stabilitt des Installationsprozesses nicht zu beeintrchtigen. Zur Realisierung dieser
Anforderung wurden speziellen Objekte in den Windows Installer-Service integriert, die es
ermglichen, individuellen Programmcode in einer geschtzten Umgebung unter Verwendung
unterschiedlicher Sicherheitsmodelle auszufhren. Diese speziellen Objekte werden als Custom
Action-Server bezeichnet. Custom Action-Server knnen nach dem verwendeten Sicherheitsmodell
wie folgt kategorisiert werden:
Impersoniert: Der individuelle Programmcode wird in einem solchen Custom Action-Server
immer im Kontext des Benutzers ausgefhrt, auch wenn die Installation mit erhhten Rechten
erfolgt.
Elevated: Falls die Installation im privilegierten Kontext ausgefhrt wird, wird der Programmcode
in einem solchen Custom Action-Server ebenfalls mit erhhten Rechten ausgefhrt. Wird die
Installation in einem nicht privilegierten Kontext ausgefhrt, erfolgt die Ausfhrung der
benutzerdefinierten Aktionen, wie beim impersonierten Server, ebenfalls im Kontext des
Benutzers.
Wie bereits dargestellt, versteht man unter einem Custom Action-Server einen Host-Prozess, in dem
benutzerdefinierter Code im Rahmen des Installationsvorgangs ausgefhrt wird. In vielen Fllen ist es
hierbei erforderlich, auf die Informationen der aktiven Installationssession zuzugreifen und somit
Einstellungen fr die Ausfhrung der benutzerdefinierten Aktion zu erhalten. Die Problematik ergibt
sich hierbei durch die Mglichkeit, individuellen Code in unterschiedlichen Formaten zu verwenden,
wodurch bestimmte Einschrnkungen bei der Kommunikation zwischen den Prozessen vorgegeben
sind. Tabelle 1.11 zeigt die Zugriffsmglichkeit auf die aktive Installationssession durch die
58
Kapitel 1
Einsprungpunkt
Interaktion
Objektbibliothek (.dll)
VBScript / JScript
Anwendung (.exe)
Befehlszeile
Zu erkennen sind die unterschiedlichen Formate, die vom Custom Action-Server zur Ausfhrung von
individuellem Programmcode untersttzt werden. Der Windows Installer verwendet die Custom
Action-Server jedoch nicht nur zum ausfhren von individuellen Programmcode, sondern auch zur
Ausfhrung von nativen Operationen, die durch Standardaktionen abgebildet werden, wie das
Registrieren von COM-Komponenten (SelfReg) und von ODBC-Datenquellen.
Architektur
Der Windows Installer verwendet einen isolierten Prozess im dem benutzerdefinierten Aktionen vom
Typ Objektbibliothek und Skript ausgefhrt werden. Auf einer 64-Bit-Plattform knnen maximal sechs
dieser Prozesse vorhanden sein, auf einer 32-Bit-Plattform lediglich drei, die wie folgt skizziert
werden:
Impersoniert im Client-Prozess (32-Bit und 64-Bit)
Impersoniert im Server-Prozess (32-Bit und 64-Bit)
Elevated im Server-Prozess (32-Bit und 64-Bit)
Von diesen Custom Action-Servern wird lediglich der Elevated Server im Kontext des lokalen
Systemkontos ausgefhrt. Alle anderen Custom Action-Server werden immer im Kontext des aktuellen
Benutzers ausgefhrt, wie dieses auch in Abbildung 1.11 dargestellt wird.
59
Kapitel 1
Der komplizierteste Vorgang zur Ausfhrung von individuellem Programmcode liegt in der Erstellung
des Custom Action-Servers und der Zuordnung des neuen Servers zu dem aufrufenden Prozess. Fr
einen solchen Server der mit den Privilegien des Benutzers ausgefhrt gestaltet sich der Vorgang wie
folgt:
1. Der gesamte Prozess zum Erzeugen eines Custom Action-Server wird durch das Installationsmodul
eingeleitet. Dieses prft beim Abarbeiten der Tabelle InstallExecuteSequence die einzelnen
Aktionsarten. Handelt es sich um eine benutzerdefinierten Aktion, wird der Typ abgerufen und der
Custom Action-Manager aufgefordert, diese benutzerdefinierte Aktion auszufhren. Das folgende
Szenario bezieht sich auf eine 32-Bit-Objektbibliothek, die sich im Binr-Stream des
Installationspaketes befindet und im Kontext des Benutzers ausgefhrt werden soll.
2. Der Custom Action-Manager prft daraufhin ob ein impersonierter 32-Bit-Custom Action-Server
bereits existiert. In einem solchen Fall, sind keine weiteren Aktionen erforderlich.
60
Kapitel 1
3. Im anderen Fall fordert der Custom Action-Manager den Konfigurationsmanager auf, einen
impersonierten 32-Bit-Custom Action-Server zu erstellen.
4. Der Konfigurationsmanager erstellt daraufhin den Custom Action-Server, wozu er die Funktion
CreateProcessAsUser() verwendet. Hierdurch wird der Server im Sicherheitskontext des aktuellen
Benutzers ausgefhrt. Allerdings werden beim Erzeugen des Servers die folgenden Faktoren
bercksichtigt:
Bei dem erstellten Prozess handelt es sich um eine zustzliche Instanz von msiexec.exe.
Bei dem verwendeten Token handelt es sich um den Token des Benutzers, der jedoch zur
Untersttzung der SAFER-Infrastruktur modifiziert wird.
Die Befehlszeile enthlt ein Argument um msiexec.exe mitzuteilen, dass die Ausfhrung als
Custom Action-Server erfolgt. Weiterhin wird der Befehlszeile ein zufllig generierter Cookie
angefgt, wodurch der Server bei spteren Aufrufen identifiziert werden kann. Ein Beispiel
dafr wre msiexec.exe -Embedding 7156B6D0201299D4C0BB0553B7FB17C1.
Die Umgebungsvariablen (Environment Block) des Benutzers werden verwendet, wobei die
Variable PATH des Systemumgebungsblocks verwendet wird.
Die Sicherheitsbeschreibung (Security Descriptor) wird angepasst, um den Zugriff des
Benutzers auf diesen Prozess einzuschrnken.
5. Der Custom Action-Server wird gestartet und fr den aufrufenden Prozess registriert. Hierbei
werden der Cookie, der Typ der benutzerdefinierten Aktion und ein Interface-Pointer auf das
Remote-API dem Custom Action-Server bergeben.
6. Der Custom Action-Manager fordert im Anschluss den neu erstellten Custom Action-Server auf,
die benutzerdefinierte Aktion auszufhren.
Die dargestellte Beschreibung bezog sich auf einen impersonierten Custom Action-Server, der vom
Server-Prozess aufgerufen wird. Bei den anderen Arten der Custom Action-Server ist der Vorgang
zum Erstellen nahezu identisch, allerdings sind an einigen Position Abweichungen festzustellen.
Beim Elevated Custom Action-Server wird der Aufruf der Funktion CreateProcessAsUser()
abweichend ausgefhrt. Hierbei wird nicht der Token des Benutzers bergeben, sondern ein
modifizierter Token des lokalen Systemkontos. Die Modifikation ist hierbei wieder in Bezug auf die
Untersttzung der SAFER-Infrastruktur zurckzufhren. Zustzlich wird der Token des aktuellen
Benutzers an den Custom Action-Server bergeben, der diesen an einen sicheren Ort
zwischenspeichert und ihn in bestimmten Anwendungsfllen, wie das Registrieren von ODBCKomponenten und die Ausfhrung in einer Terminal-Session, verwenden kann.
Die Erstellung des Custom Action-Servers des Client-Prozesses funktioniert exakt so wie die
Erstellung des impersonierten Servers des Server-Prozesses. Auch hierbei wird die Erstellung des
Custom Action-Servers durch den Konfigurationsmanager initiiert, wozu die Aufforderung natrlich
vom Client-Prozess erfolgt. Die Registrierung erfolgt letztlich fr den Client-Prozess, wodurch der
Interface-Pointer auf das Remote-API des Client-Prozesses dem Custom Action-Server bergeben
wird.
61
Kapitel 1
Die Verwendung einer benutzerdefinierten Aktion, die mit dem Produkt installiert wird, offenbart viele
potentielle Fehlerquellen. Aus diesem Grund ist hiervon abzuraten und die Integration als BinrStream anzustreben.
Wichtig Ende
Nachdem die jeweilige Objektbibliothek ermittelt wurde, muss schlielich noch der Einsprungpunkt
identifiziert werden. Bei dem Einsprungpunkt handelt es sich um die aufzurufende Funktion der
Bibliothek, die nach folgendem Schema definiert sein muss:
UINT __stdcall CustomAction(MSIHANDLE hInstall)
Die Ermittlung des Einsprungpunktes ist relativ einfach, da dieser direkt aus der Tabelle CustomAction
des Installationspaketes abgelesen werden kann. Nachdem die entsprechende Objektbibliothek
ermittelt und der Einsprungpunkt identifiziert wurde, werden diese Informationen an den Custom
Action-Manager bermittelt. Gleichzeitig erfolgt die Aufforderung zur Ausfhrung der
benutzerdefinierten Aktion.
Ausfhren der Aktion
In Abhngigkeit zur Art der benutzerdefinierten Aktion, wird deren Ausfhrung entweder durch das
Installationsmodul oder durch das Ausfhrungsmodul veranlasst. Hierzu wird eine spezifische
Funktion im Custom Action-Manager aufgerufen, wobei der Pfad zu der jeweiligen Objektbibliothek,
der Name des Einsprungpunktes und der Typ des erforderlichen Custom Action-Servers mit bergeben
werden. Der Custom Action-Manager prft daraufhin die Existenz eines verwendbaren Custom
Action-Servers. Im Folgenden wird die Ausfhrung der benutzerdefinierten Aktion, durch einen
Funktionsaufruf im Custom Action-Server veranlasst. Diesem Funktionsaufruf werden der Pfad zu der
Objektbibliothek und der Name des Einsprungpunktes angefgt. Der Custom Action-Server ldt
daraufhin die Objektbibliothek in den Speicherbereich und ermittelt die Adresse des festgelegten
62
Kapitel 1
Einsprungpunktes durch die Funktion GetProcAdresss(). Im Anschluss wird die ermittelte Funktion
aufgerufen, wobei das Handle auf die aktive Installationssession bergeben wird.
Falls eine Anwendung ber das Windows Installer-API mit einer Installationssession kommuniziert,
werden das Handle und alle weiteren Session-Informationen fr den aktuellen Prozess erstellt, so dass
sich alle Funktionsaufrufe auf den tatschlichen Installationsprozess beziehen. Im Falle einer
benutzerdefinierten Aktion ist dieses kein gewnschtes Verhalten, da hierdurch auf den Prozess
zugegriffen wird in dem der Custom Action-Server ausgefhrt wird und nicht auf den Prozess der
Installationssession. Aus diesem Grunde wird ein Mechanismus verwendet, der als Remote-API
bezeichnet wird und durch den die Interprozesskommunikation stattfinden kann. Beim Remote-API
handelt es sich schlielich um eine Schnittstelle, durch die Funktionsaufrufe aus einer
benutzerdefinierten Aktion, mit zustzlichen Metainformationen versehen und an den jeweiligen
Installationsprozess weiter geleitet werden. Diese Schnittstelle wird allen Custom Action-Servern nach
deren Erstellung vom Konfigurationsmanager zur Verfgung gestellt.
Abschlieen der Ausfhrung
Nachdem die Ausfhrung der benutzerdefinierten Aktion abgeschlossen ist, wird ein Rckgabewert an
den aufrufenden Prozess gegeben. Die Objektbibliothek wird anschlieend entladen. Der Custom
Action-Server wird hingegen nicht terminiert, sondern fr weitere benutzerdefinierte Aktionen der
identischen Installationssession weiter verwendet. Erst nach Abschluss der tatschlichen
Installationssession werden alle Custom Action-Server zerstrt.
Zur Ausfhrung von benutzerdefinierten Aktionen vom Typ Skript ist der Windows Scripting Host
(WSH) nicht erforderlich. Der Windows Installer verwendet zur Ausfhrung ausschlielich die
Systemdateien vbscript.dll und jscript.dll, die jedoch die Systemdatei scrrun.dll zur Ausfhrung
bentigen.
Hinweis Ende
Grundlegende Betrachtungen
Es wurde bereits darauf hingewiesen, dass der Installationsprozess in die Acquisition-Phase und die
Execution-Phase unterteilt ist. Whrend der Execution-Phase findet die tatschliche Modifikation des
Zielsystems statt whrend die Acquisition-Phase lediglich zur Beschaffung von Informationen fr den
Installationsprozess bentigt wird. Die Execution-Phase wird ausschlielich durch den Server-Prozess
gesteuert, die Acquisition-Phase ist sowohl im Client- als auch im Server-Prozess zu finden. Das
63
Kapitel 1
Ergebnis der Acquisition-Phase des Client-Prozesses ist eine Befehlszeile, die an den Server-Prozess
bergeben wird. Das Ergebnis der Acquisition-Phase des Server-Prozesses ist ein Installationsskript,
das an das Ausfhrungsmodul bergeben wird. Diese Phasen sind uerst relevant fr die Verwendung
von benutzerdefinierten Aktionen im Installationsprozess.
64
Kapitel 1
wobei
die
Tabellen
AdminUISequence,
InstallUISequence,
AdminExecuteSequence,
AdvtExecuteSequence und InstallExecuteSequence verwendet werden knnen. Darber hinaus ist es
auch mglich, die Ausfhrung einer solchen Aktion durch das Steuerelementereignis DoAction oder
den Funktionsaufruf MsiDoAction() zu veranlassen.
Benutzerdefinierten Aktionen mit sofortiger Ausfhrung, knnen auf alle Elemente der aktiven
Installationssession zugreifen und nderungen an den Einstellungen fr den Installationsprozess
vornehmen. Dieser Zugriff wird realisiert, da der benutzerdefinierten Aktion eine Referenz auf die
aktuelle Installationssession bergeben wird, wobei die Art der Referenz von dem jeweiligen Format
der benutzerdefinierten Aktion abhngig ist. Wird ein Skript als benutzerdefinierte Aktion verwendet,
verweist das Objekt Session auf die tatschliche Installationssession. Dieses Objekt enthlt eine
Vielzahl von Eigenschaften um den Installationsprozess zu beeinflussen. So ermglich beispielsweise
die Eigenschaft Session.Property den Zugriff auf die Eigenschaft der Installationssession, um diese
abzurufen oder auch erneut festzulegen.
Bei der Verwendung von Objektbibliotheken gestaltet sich die Gestaltung von benutzerdefinierten
Aktionen abweichend, da hierbei das Windows Installer-API zum Zugriff auf die Informationen der
Installationssession verwendet wird. Wie bereits zu Beginn dieses Abschnitts erlutert, muss die
Funktionsdefinition einer Objektbibliothek nach dem folgenden Schema erfolgen:
UINT __stdcall CustomAction(MSIHANDLE hInstall)
Das Handle wird beim Aufruf der Aktion durch den Windows Installer automatisch zugewiesen, so
dass hierber auf die Informationen der Installationssession zugegriffen werden kann.
Verzgerte Ausfhrung (msidbCustomActionTypeInScript)
Benutzerdefinierte Aktionen mit verzgerter Ausfhrung (Deferred Execution) werden auch als
Aktionen beschrieben, die whrend der Skriptausfhrung verarbeitet werden. Nachdem der Windows
Installer das Installationsskript erstellt hat, wird mit der Abarbeitung dieses Skripts begonnen. Die
gesamte Skriptausfhrung erfolgt innerhalb der Aktion InstallFinalize. Whrend dieser Phase werden
benutzerdefinierte Aktionen mit verzgerter Ausfhrung, zusammen mit allen Standardaktionen
aufgerufen, die ins Installationsskript eingetragen wurden. Die Aktionen werden in der Reihenfolge
ausgefhrt, in der sie im Skript whrend der Erzeugungsphase abgelegt wurden, allerdings nur, wenn
ihre Bedingung zum Zeitpunkt der Skripterzeugung erfllt gewesen ist. Da diese Phase von einem
separaten Modul ausgefhrt wird, knnen benutzerdefinierte Aktionen mit verzgerter Ausfhrung
nicht direkt auf Eigenschaftswerte der Installations-Session zugreifen. Benutzerdefinierte Aktionen mit
verzgerter Ausfhrung knnen nur whrend der Execution-Phase ausgefhrt werden, so dass sie nur
aus den Tabellen AdminExecuteSequence, AdvtExecuteSequence und InstallExecuteSequence
aufgerufen werden knnen, wenn sie zwischen den Aktionen InstallInitialize und InstallFinalize
angeordnet wurden.
Der abweichenden Verwendung von benutzerdefinierten Aktionen mit verzgerter Ausfhrung kommt
bei der tatschlichen Entwicklungsttigkeit eine besondere Bedeutung zu. Kann bei den Aktionen zur
sofortigen Ausfhrung auf alle Informationen der aktiven Installationssession zugegriffen werden, ist
bei verzgert ausgefhrten Aktionen nur ein Teilzugriff mglich. Dieses begrndet sich darin, dass die
Ausfhrung dieser benutzerdefinierten Aktionen vom Ausfhrungsmodul und nicht vom
Installationsmodul gesteuert wird. Dem Ausfhrungsmodul stehen jedoch nur Informationen des
Installationsskriptes zur Verfgung, so dass Informationen, die von der benutzerdefinierten Aktion
bentigt werden, ebenfalls dem Installationsskript hinzugefgt werden mssen. Diese Vorgehensweise
ist relativ einfach zu realisieren und lsst sich durch mehrere Mechanismen durchfhren. Hierbei muss
Persnliche Ausfertigung fr Martin Martinsson
65
Kapitel 1
einer Eigenschaft eine Zeichenfolge bergeben werden, die die bentigten Informationen enthlt. Der
Name der Eigenschaft muss identisch mit dem Namen der benutzerdefinierten Aktion mit verzgerter
Ausfhrung sein. Soll beispielsweise durch die benutzerdefinierte Aktion CreateUser ein
Benutzerkonto dem lokalen System hinzugefgt werden, so mssen der Eigenschaft CreateUser zuvor
die bentigten Werte zugewiesen werden. Durch diese Vorgehensweise werden die jeweiligen
Informationen der Operationsanweisung zur Ausfhrung der benutzerdefinierten Aktion als Argument
angefgt. Eine benutzerdefinierte Aktion mit verzgerter Ausfhrung wird im Installationsskript als
CustomActionSchedule gekennzeichnet, wie der nachfolgende Auszug eines solchen Skriptes zeigt.
CustomActionSchedule(Action=CreateUser,ActionType=3073,Source=BinaryData,Target=AddAccount,
CustomActionData=Name=MSI;Description=Windows Installer-Testaccount)
Es ist zu erkennen, dass der Name fr das Benutzerkonto und eine entsprechende Beschreibung, der
Eigenschaft CustomActionData angefgt werden. Vom Programmcode der benutzerdefinierten Aktion
muss nun auf diese Eigenschaft zugegriffen werden, damit die bentigten Informationen fr die
Ausfhrung der Aktion verwendet werden knnen. Allerdings steht hierzu nur ein eingeschrnkter
Funktionsvorrat zur Verfgung, der in Tabelle 1.12 zusammengefasst ist.
Funktion
Methode
Beschreibung
MsiGetProperty()
Session.Property
MsiFormatRecord()
Session.FormatRecord
MsiGetMode()
Session.Mode
MsiGetLanguage()
Session.Language
MsiProcessMessage()
Session.ProcessMessage
Tabelle 1.12: Eingeschrnkter Funktionsvorrat bei der Verwendung von benutzerdefinierten Aktionen mit
verzgerter Ausfhrung
Die wahrscheinlich am hufigsten verwendete Funktion innerhalb einer benutzerdefinierten Aktion mit
verzgerter Ausfhrung ist MsiGetProperty(). Hierdurch ist es mglich die zur Verfgung gestellten
Informationen aus dem Installationsskript zu lesen. Allerdings kann hierbei nur auf die Eigenschaften
ProductCode und CustomActionData zugegriffen werden. Die Eigenschaft CustomActionData enthlt
hierbei die zuvor zugewiesenen Informationen, die als Zeichenfolge abgelegt werden. Hieraus lsst
sich ableiten, dass in die benutzerdefinierte Aktion eine Logik implementiert werden muss, um die
Zeichenfolge wieder in Ihre einzelnen Elemente zu zerlegen.
Wie bereits zuvor erlutert, stehen fr den Server-Prozess sowohl ein impersonierter als auch ein
Elevated Custom Action-Server zur Verfgung. Eine benutzerdefinierte Aktion mit verzgerter
66
Kapitel 1
An dieser Stelle gibt es Abweichungen, falls die Installation bei aktivierter Benutzerkontensteuerung
unter den Betriebssystemen Windows Vista und Windows Server 2008 ausgefhrt wird. Nhere Infos
finden Sie daher im Kapitel 5.
Hinweis Ende
Die bisherige Betrachtung der benutzerdefinierten Aktion mit verzgerter Ausfhrung bezog sich
bisher auf den normalen Installationsprozess. Der Windows Installer stellt zustzlich zwei
Sonderformen dieses Aktionstyps zur Verfgung, die fr bestimmte Einsatzszenarien konzipiert
wurden.
Rollback-Ausfhrung
(msidbCustomActionTypeRollback):
Beim
Ausfhren
jeder
Operationsanweisung des Installationsskriptes wird eine gegenstzliche Anweisung in das RollbackSkript geschrieben, um im Falle eines Installationsabbruchs, die durchgefhrten nderungen
zurckzusetzen. Diese Eintragungen im Rollback-Skript beziehen sich jedoch nur auf
Standardaktionen, da die interne Implementierung einer benutzerdefinierten Aktion fr den Windows
Installer nicht bekannt ist und somit keine gegenstzlichen Aktionen erzeugt werden knnen. Der
Windows Installer stellt jedoch eine Mglichkeit zur Verfgung, eine benutzerdefinierte Aktion so zu
kennzeichnen, dass sie ausschlielich whrend des Rollbacks verwendet wird.
Grundstzlich stellt sich jedoch an dieser Stelle die Frage, ob eine solche benutzerdefinierte Aktion
berhaupt erforderlich ist. Die Antwort auf diese Frage ist wiederum von der Methode abhngig, durch
die das Zielsystem modifiziert wird. Wird das Zielsystem auf direkte Art modifiziert, ist eine
benutzerdefinierte Aktion fr die Rollback-Ausfhrung erforderlich, findet hingegen eine indirekte
Modifikation statt, ist eine solche Implementierung nicht erforderlich. Zur Verdeutlichung dieser
Modifikationsarten soll ein kleines Beispiel dienen.
Sie erstellen ein Installationspaket das zustzlich zu den normalen Installationsvorgngen individuelle
Eintragungen in der Systemregistrierung vornehmen soll. Diese Eintragungen sind abhngig von
bestimmten Systeminformationen, die durch eine benutzerdefinierte Aktion abgerufen werden. Die
hieraus resultierenden Eintragungen der Systemregistrierung knnen nun durch eine benutzerdefinierte
Aktion mit verzgerter Ausfhrung vorgenommen werden, indem die Systemregistrierung durch die
entsprechenden Windows-Funktionen modifiziert wird. In diesem Fall findet eine direkte Modifikation
des Zielsystems statt, so dass eine gegenstzliche Aktion erstellt werden muss, die beim Rollback
verwendet wird. Ein anderes Realisierungskonzept verwendet hierfr eine benutzerdefinierte Aktion
zur sofortigen Ausfhrung. Diese Aktion hat einen vollstndigen Zugriff auf die aktuelle
Installationssession und somit auch auf die Windows Installer-Datenbank. Unter Verwendung der
spezifischen Windows Installer-Funktionen knnen die erforderlichen Informationen nun der Tabelle
Registry temporr angefgt werden. Die tatschliche Modifikation des Zielsystems findet hingegen
durch die Standardaktion WriteRegistryValues statt, fr die der Windows Installer gegenstzliche
Persnliche Ausfertigung fr Martin Martinsson
67
Kapitel 1
Aktionen ins Rollback-Skript einfgt. Bei dieser indirekten Modifikation ist die Erstellung einer
benutzerdefinierten Aktion fr den Rollback nicht erforderlich
Es ist zu erkennen, dass bei einer direkten Modifikation des Zielsystems durch eine benutzerdefinierte
Aktion mit verzgerter Ausfhrung unbedingt eine gegenstzliche Aktion fr den Rollback erstellt
werden muss. Eine solche Aktion ist bei der Definition besonders zu kennzeichnen und in der
jeweiligen Sequenztabelle unmittelbar vor der korrespondierenden Aktion einzufgen. Bei der
Kennzeichnung ist wiederum darauf zu achten, dass der Ausfhrungskontext ebenfalls der
gegenstzlichen Aktion entspricht.
Commit-Ausfhrung
(msidbCustomActionTypeCommit):
Diese
besondere
Art
von
benutzerdefinierten Aktionen wird nur ausgefhrt, wenn die Ausfhrung des Installationsskriptes
erfolgreich abgeschlossen wurde. Sie eignen sich hervorragend um Ttigkeiten auszufhren, die keinen
Einfluss auf den Installationserfolg haben, wie das Entfernen von temporren Daten im
Installationsprozess. Ttigkeiten, die von Commit-Aktionen durchgefhrt werden, knnen durch
Rollback-Aktionen nicht zurckgenommen werden. Dieses begrndet sich darauf, dass CommitAktionen nicht ins Installationsskript, sondern ins Rollback-Skript eingetragen werden und die
Skripterstellung bei der Ausfhrung der Commit-Aktionen bereits abgeschlossen ist. Wie auch die
Rollback-Aktionen sind Commit-Aktionen besonders zu kennzeichnen, wobei wiederum der
Ausfhrungskontext festgelegt werden kann.
Hinweis Beginn
Rollback-Aktionen und Commit-Aktionen werden nicht ausgefhrt, falls auf dem Zielcomputer der
Rollback deaktiviert wurde (DisableRollback).
Hinweis Ende
Rckgabewerte
Eine benutzerdefinierte Aktion kann einen Rckgabewert an den aufrufenden Prozess geben und
diesen darber informieren, ob die Ausfhrung der Aktion erfolgreich war oder nicht. Bei der
Definition einer benutzerdefinierten Aktion wird festgelegt, ob der Rckgabewert fr den weiteren
Installationsprozess relevant ist und ob entsprechend reagiert werden soll. Wird der Rckgabewert als
Relevant eingestuft, wird der Installationsprozess beendet, sobald die Funktion einen Fehler oder einen
Abbruch durch den Benutzer zurckliefert. Bei der Verwendung einer Objektbibliothek als
benutzerdefinierte Aktion sind die folgenden Rckgabewerte mglich:
Rckgabewert
Wert
Beschreibung
ERROR_FUNCTION_NOT_CALLED
1626
ERROR_SUCCESS
ERROR_INSTALL_USEREXIT
1602
ERROR_INSTALL_FAILURE
1603
ERROR_NO_MORE_ITEMS
259
Beachten Sie, dass ausfhrbare Dateien einen Wert von 0 bei erfolgreicher Ausfhrung zurckgeben
mssen. Alle anderen Werte werden als fehlerhafte Ausfhrung interpretiert.
68
Kapitel 1
Hinweis Ende
Ebenso wie bei den gerade dargestellten Rckgabewerten von Objektbibliotheken knnen auch
Skriptfunktionen entsprechende Rckgabewerte liefern. Bei der Verwendung von Skriptcode wird das
Windows Installer-Automationsmodell verwendet, das die folgenden Konstanten bereitstellt:
Konstante
Wert
Beschreibung
msiDoActionStatusNoAction
msiDoActionStatusSuccess
msiDoActionStatusUserExit
msiDoActionStatusFailure
msiDoActionStatusSuspend
msiDoActionStatusFinished
Die Rckgabewerte aller Aktionen werden dem Installationsprotokoll angefgt. Hierbei gilt es zu
beachten, dass der Windows Installer die Rckgabewerte beim Anfgen ins Installationsprotokoll
umwandelt, so dass eine erfolgreiche Aktion durch den Wert 1 im Protokoll gekennzeichnet wird.
Eine vollstndige Auflistung der umgewandelten Werte sind in Tabelle 1.15 zu finden.
Konstante
Rckgabewert
Wert im Protokoll
Beschreibung
ERROR_FUNCTION_NOT_CALLED
1626
ERROR_SUCCESS
Aktion wurde
ordnungsgem
beendet.
ERROR_INSTALL_USEREXIT
1602
ERROR_INSTALL_FAILURE
1603
Nicht behebbarer
Fehler ist aufgetreten.
ERROR_INSTALL_SUSPEND
1604
Aktion wurde
unterbrochen und wird
spter fortgesetzt.
ERROR_SUCCESS
Aktion wurde
ordnungsgem
beendet.
ERROR_INVALID_HANDLE_STATE
1609
Ungltiger Status fr
das Handle.
ERROR_INVALID_DATA
1626
69
Kapitel 1
Condition
Sequence
RemoveAccounts
$C__Account=2
6025
RollbackAccounts
$C__Account>2
6035
InstallAccounts
$C__Account>2
6045
CommitAccount
$C__Account>2
6055
Die Ausfhrung smtlicher benutzerdefinierter Aktionen der Tabelle ist abhngig vom Aktionsstatus
der Komponente C__Account. Der Aktionsstatus legt fest, welche Ttigkeit fr die Komponente im
Installationsprozess erfolgen soll. Die Definition der Bedingung erfordert demzufolge die Verwendung
des Prfix fr den Aktionsstatus $, den Namen der Komponente und die Zuordnung der jeweiligen
Ttigkeit. Die Aktion RemoveAccounts verfgt ber die Bedingung $C__Account=2, wobei der Wert
2 angibt, dass die Komponente entfernt wird (INSTALLSTATE_ABSENT). Alle anderen Aktionen
wurden mit der Bedingung $C__Account>2 versehen, so dass die Bedingung erfllt ist, wenn die
Komponente lokal installiert (INSTALLSTATE_LOCAL) oder zur Ausfhrung vom Quellmedium
(INSTALLSTATE_SOURCE) konfiguriert wird. Selbstverstndlich ist es auch mglich, die Ausfhrung
einer benutzerdefinierten Aktion von dem Wert einer Umgebungsvariablen abhngig zu machen.
Hierzu muss der Name der Umgebungsvariablen mit dem Prfix % als Bedingung angegeben
werden.
Hinweis Beginn
Auf das Thema der benutzerdefinierten Aktionen werde ich im weiteren Verlauf dieses Buches
mehrfach zurckkommen. So enthlt das Kapitel 2 zustzliche Erluterungen zu vordefinierten
Aktionen, die mit der Toolsammlung Windows Installer-XML bereitgestellt werden. Kapitel 3 befasst
sich mit der 64-Bit-Architektur, wobei auch benutzerdefinierte Aktionen betrachtet werden. In Kapitel
4 wird schlielich die Erstellung und Integration von benutzerdefinierten Aktionen erlutert und
Kapitel 5 stellt abweichende Verhaltensmuster bei der Verwendung von Windows Vista und Windows
Server 2008 heraus.
Hinweis Ende
70
Kapitel 1
Fazit
Der Windows Installer verwendet zwei Prozesse, um eine Produktinstallation auszufhren. Der ClientProzess wird hierbei immer mit den Privilegien des aktuellen Benutzers ausgefhrt. Durch diesen
Prozess werden die Interaktion und die Kommunikation mit dem Benutzer sichergestellt. Die
tatschlichen Installationsaufgaben, also das Kopieren von Dateien oder das Eintragen von Werten in
die Systemregistrierung werden vom Server-Prozess ausgefhrt. Dieser Prozess generiert zunchst ein
Installationsskript, in das die auszufhrenden Aktionen eingetragen werden. Im Anschluss wird dieses
Skript vom Ausfhrungsmodul verarbeitet, wobei gegenstzliche Aktionen in ein Rollback-Skript
bertragen werden. Dieses Rollback-Skript wird ausgefhrt, falls die Installation nicht fehlerfrei
beendet wurde, um die durchgefhrten nderungen rckgngig zu machen. Die durchzufhrenden
Aktivitten sind im Windows Installer-Paket beschrieben und knnen noch durch eigene
Implementierungen erweitert werden, so dass der Flexibilitt kaum Grenzen gesetzt werden.
71
Kapitel 2
Windows Installer-XML
Windows Installer-XML
72
77
93
117
131
Die Anzahl der verfgbaren Tools und Anwendungen zum Erstellen von Windows Installer-Paketen
und anderen Windows Installer-Dateien hat in den letzten Jahren stndig zugenommen. Es sind Tools
verfgbar, die nahezu allen Anforderungen und Vorlieben entgegen kommen. Alle Tools verfgen
ber komfortable und intuitive Benutzeroberflchen, so dass die Erstellung von Windows InstallerDateien auf einfache Weise realisierbar ist. Was auf den ersten Blick als durchaus positiv angesehen
werden kann, offenbart beim nheren Hinsehen doch problematische Elemente. Der Entwickler kann
den Build-Vorgang gar nicht oder nur eingeschrnkt beeinflussen, wodurch ihm viele
Implementierungen und Umsetzungen verborgen bleiben. Hierdurch wird es im Fehlerfall sehr
schwierig, die eigentliche Problemquelle zu identifizieren und das Problem effektiv zu beheben.
Weiterhin ist es in der heutigen Zeit vielfach erforderlich, die Erstellung der entsprechenden Windows
Installer-Dateien in einem automatisierten Build-Prozess zu integrieren. Der Nachteil der verfgbaren
Tools liegt in der unzureichenden Untersttzung solcher automatisierter Prozesse, so dass eine
individuelle Lsung entwickelt werden msste. Das Erstellen einer solchen Lsung ist durch das
Windows Installer-API zwar mglich, allerdings ist die Implementierung mit sehr viel Aufwand
verbunden, wozu auch ein hohes Ma der Technologieverstndnisse erforderlich ist.
Windows Installer-XML
Kapitel 2
Entwicklung, so dass die einzelnen Releases noch als unstable gekennzeichnet sind. Auch wenn die
Version 3 noch keinen finalen Zustand erreicht hat, wird diese Version bei der weiteren Betrachtung
innerhalb dieses Buches verwendet. Anzumerken ist auch, dass die nchste Version der
Entwicklungsumgebung Visual Studio (Codename: Rosario) ber eine eingeschrnkte Version von
Windows Installer-XML verfgen wird. Hier ist es geplant Windows Installer-XML, Version 3
zustzlich zu den bereits bekannten Setup-Projekten zu integrieren.
Hierarchische Strukturen
Bevor ich auf die sehr umfangreiche Funktionalitt der Toolsammlung Windows Installer-XML
eingehe, mchte ich noch einen Problempunkt aufgreifen, der mir beim Design von
Installationspaketen immer wieder begegnet. Hiermit gemeint ist die Speicherung der Daten in einem
relationalen Format. Dieses ist dadurch kompliziert, dass in der realen Welt berwiegend hierarchische
Strukturen vorliegen, wie das beispielsweise im Dateisystem und in der Systemregistrierung der Fall
ist. Die berfhrung von hierarchischen Strukturen in eine relationale Darstellung ist hufig nur sehr
schwer nachvollziehbar und anwendbar. Jeder der mit dem Windows Installer-Tabelleneditor Orca
bereits versucht hat, die Tabelle Directory eines komplexen Installationspaketes zu analysieren, wird
mir hier zustimmen. Anders ist das mit Windows Installer-XML, denn hier wird zur Beschreibung der
Installation ein wohlgeformtes XML-Dokument verwendet. Der Vorteil ist offensichtlich ein
wohlgeformtes XML-Dokument ist selbst hierarchisch aufgebaut, so dass die Aufnahme hierarchischer
Daten einfacher, bersichtlicher und effektiver realisierbar ist. Zur Verdeutlichung soll die
Ordnerstruktur Windows Installer XML v3 aus Abbildung 2.12 betrachtet werden.
Die Ordnerstruktur und die Ablage der Dateien sind in der Abbildung sehr gut nachvollziehbar. Anders
verhlt es sich bei der Umsetzung dieser Struktur im nativen Format des Windows Installers, wie
dieses in Tabelle 2.17 gezeigt wird.
Directory
Directory_Parent
DefaultDir
APPLICATIONFOLDER
TARGETDIR
BinDir
APPLICATIONFOLDER
bin
DocDir
APPLICATIONFOLDER
doc
73
Kapitel 2
Windows Installer-XML
SdkDir
APPLICATIONFOLDER
SDK
SdkDir_x64
SdkDir
x64
SdkDir_x86
SdkDir
x86
SdkIncDir
SdkDir
inc
SdkLibDir
SdkDir
lib
TARGETDIR
SourceDir
Es wird deutlich, dass die bersichtlichkeit und die Lesbarkeit der Daten leidet und die tatschliche
berfhrung der Daten in eine hierarchische Struktur einiges an Aufwand bedeutet. Es gilt zu
bedenken, dass die im Beispiel verwendete Struktur nicht sehr komplex ist, dennoch gilt zu
bercksichtigen, dass bei steigender Komplexitt natrlich auch die Problemfaktoren entsprechend
anwachsen werden. Im Gegensatz dazu zeigt Listing 2.2 die Ordnerstruktur innerhalb eines XMLDokumentes. Das Dokument ist sofort lesbar und die definierte Struktur lsst sich problemlos auf ein
reales Dateisystem berfhren.
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="APPLICATIONFOLDER" Name="Windows Installer XML v3" ShortName="WIX30">
<Directory Id="BinDir" Name="bin"/>
<Directory Id="DocDir" Name="doc"/>
<Directory Id="SdkDir" Name="SDK">
<Directory Id="SdkIncDir" Name="inc"/>
<Directory Id="SdkLibDir" Name="lib"/>
<Directory Id="SdkDir_x86" Name="x86"/>
<Directory Id="SdkDir_x64" Name="x64"/>
</Directory>
</Directory>
</Directory >
Windows Installer-XML
Kapitel 2
der Webseite zum Download angeboten. Auf der Webseite finden sie weiterhin den Quellcode von
Windows Installer-XML und die Binrdateien. Die Binrdateien werden ohne Installationsprogramm
angeboten, so dass auch die Einrichtung auf Computern ohne Visual Studio mglich ist, wie das
beispielsweise bei speziellen Build-Systemen der Fall sein knnte.
Nach der Installation knnen die WXS-Dokumente direkt in der Entwicklungsumgebung bearbeitet
werden, wobei die Eingabe der erforderlichen Informationen durch IntelliSense und Quellcodefrbung
vereinfacht wird. Zustzlich werden verschiedene Projekttypen angeboten, bei deren Verwendung die
notwendigen Schritte zur Erzeugung des Installationspaketes automatisiert werden. Die neuen
Projekttypen sind in Abbildung 2.14 zu finden. Verwenden Sie die Vorlage WiX Project um ein
Windows Installer-Paket (.msi) oder ein Patch Creation Property File (.pcp) zu erstellen; verwenden
Sie das WiX Merge Module Project zur Erzeugung eines Windows Installer-Mergemoduls (.msm).
Durch die Verwendung des Projekttyps WiX Library Project wird hingegen keine Windows
Installer-Datei erzeugt, sondern eine vorkompilierte Bibliothek (.wixlib) fr Windows Installer-XML.
75
Kapitel 2
Windows Installer-XML
Ganz entscheidend und enorm hilfreich ist jedoch, dass die von Visual Studio erzeugte Projektdatei
(.wixproj) oder die Projektmappendatei (.sln) kompatibel mit der Microsoft Build Engine (msbuild.exe)
sind, so dass automatisierte Builds hiermit oder auch mit dem Visual Studio Team Foundation Server
sehr einfach realisierbar sind. Darber hinaus kann zur Entwicklung der Anwendungen und des
Installationsprogramms die gleiche Oberflche verwendet werden, so dass keine neue
Einarbeitungszeit erforderlich ist. Vereinfachend ist in diesem Zusammenhang auch der modulare
Aufbau von Windows Installer-XML, der eine ideale Integration in den regulren
Softwareerstellungsprozess ermglicht.
76
Windows Installer-XML
Kapitel 2
Grundlegende Deklarationen
Nachdem die Projektvorlage WiX Project ausgewhlt wurde, wird automatisch ein entsprechendes
Projekt fr Visual Studio angelegt und die Datei wixproject1.wxs im Quellcodeeditor angezeigt. Das
Persnliche Ausfertigung fr Martin Martinsson
77
Kapitel 2
Windows Installer-XML
Stammelement in diesem Dokument lautet <Wix/> und das untergeordnete Element lautet
<Product/>, da es sich bei der Ausgabedatei um ein Windows Installer-Paket (.msi) handelt. Mgliche
Elementtypen an dieser Stelle wren noch <Module/>, <Patch/>, <PatchCreation/> und
<Fragment/>. Es ist erkennbar, dass das Element <Product/> ber zahlreiche Attribute verfgt, mit
deren Hilfe das zu erzeugende Zielprodukt modelliert wird. Das bedeutet, dass diese Attributwerte in
die Tabelle Property des fertigen Installationspaketes bertragen werden. Das Attribut Name entspricht
hierbei der Eigenschaft ProductName und die Id entspricht dem ProductCode, der im Format einer
GUID vorliegt. Ein weiteres wichtiges aber hufig verkanntes Attribut ist Codepage, das zur
Festlegung der Datenbank-Codepage erforderlich ist. Wird dieses Attribut nicht angegeben wird der
Datenbank die neutrale Codepage zugewiesen. Das bedeutet dass nur Zeichen des
Standardzeichensatzes in die Windows Installer-Datenbank bertragen werden; Zeichen aus dem
erweiterten Zeichensatz werden durch Platzhalter ersetzt, was vielfach zu Problemen fhren kann.
Da es sich bei Windows Installer-XML um keine Prozedursprache handelt, sondern um eine
Deklarationssprache, mssen nicht die Schritte beschrieben werden, die ausgefhrt werden mssen, um
die Installation zu realisieren. Vielmehr muss in dem WXS-Dokument das Ergebnis der erfolgreichen
Installation modelliert werden. Hierzu ist es auch erforderlich, sehr viele Elemente mit einem
eindeutigen Identifizierungsmerkmal zu versehen, wozu der Windows Installer eine GUID vorsieht.
Da die Erzeugung einer GUID und das Einfgen an eine bestimmte Position sehr hufig durchgefhrt
werden muss, empfiehlt es sich diese Aktionen zu automatisieren, wozu das in Listing 2.3 dargestellte
Visual Studio-Makro verwendet werden kann.
Sub InsertGuid()
Dim textSelection As EnvDTE.TextSelection
textSelection = CType(DTE.ActiveDocument.Selection(), EnvDTE.TextSelection)
textSelection.Text = System.Guid.NewGuid().ToString()
End Sub
Das Element <Product/> kann mehrere Unterelemente aufnehmen, von denen <Package/> eine
wichtige Rolle einnimmt, da es die Inhalte des Summary Information Streams bestimmt. Die
Richtlinien zum Design von Installationspaketen sehen vor, dass die Eigenschaft PackageCode bei
jeder Modifikation des Paketes zu verndern ist. Windows Installer-XML kann aus diesem Grund
angewiesen werden, den PackageCode bei jedem Kompiliervorgang neu zu generieren. Hierzu ist es
ausreichend dem Attribut Id des Elementes <Package/> die Zeichenfolge * zuzuweisen. Diese
automatische Generierung ist ebenfalls fr die Identifizierungsmerkmale der Elemente <Component/>,
<Patch/> und <Product/> anwendbar. Eine weitere wichtige Rolle kommt dem Summary Information
Stream in Verbindung mit der Benutzerkontensteuerung von Windows Vista und Windows Server
2008 zu, wie in einem spteren Kapitel noch verdeutlicht wird. An dieser Stelle wird definiert, ob zur
Installation des Paketes administrative Privilegien erforderlich sein mssen oder ob die Rechte des
Standardbenutzers ausreichend sind. Im WXS-Dokument ist hierfr das Attribut InstallPrivileges
zustndig; die mglichen Werte sind elevated und limited.
<?xml version="1.0" ?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<!-- Produktdefinition -->
<Product UpgradeCode="2501DE56-6CC9-4078-B87E-F6664896125F" Manufacturer="Microsoft Deutschland GmbH"
Language="1031" Version="1.00.0000" Name="MSI Demo" Id="7BF40BDA-E554-4949-8A6E-10297BD30BB6"
Codepage="1252">
78
Windows Installer-XML
Kapitel 2
79
Kapitel 2
Windows Installer-XML
</Product>
</Wix>
Nahezu jedes Installationsprogramm legt auf dem Zielsystem mindestens eine Datei an. Da Windows
Installer-XML mit einem deklarativen Ansatz arbeitet, wird in dem WXS-Dokument die
Beschaffenheit der Verzeichnisstruktur definiert, wie sie spter auf dem Zielsystem zu finden sein soll.
Theoretisch mssten der skizzierten Verzeichnisstruktur die zu installierenden Dateien nun angefgt
werden. Dieses ist jedoch nicht so einfach mglich, da der Windows Installer komponentenbasiert
arbeitet. Dass bedeutet, dass eine oder mehrere Ressourcen zu einer Gruppe zusammengefasst werden,
die als Komponente bezeichnet wird. Hierbei ist die Art der Ressource nicht relevant, so dass eine
Komponente beispielsweise aus einer Datei, einer Dateiverknpfung und einem Eintrag der
Systemregistrierung bestehen kann. Der Vorteil dieser Funktionalitt liegt klar auf der Hand; der
Windows Installer betrachtet die Komponente als Einheit und verwaltet daher die einzelnen
Ressourcen als zusammenhngendes Gebilde. Fr die Definition im WXS-Dokument bedeutet dieses,
dass zunchst die Komponente innerhalb der Ordnerstruktur anzulegen ist, wozu das Element
<Component/> bentigt wird. Zur Definition der Komponente sind die Attribute Id und Guid
unbedingt erforderlich. Innerhalb der Komponente knnen nun die Ressourcen angelegt werden, wie
dieses auch in Listing 2.4Fehler! Verweisquelle konnte nicht gefunden werden. dargestellt wird.
Eine Datei wird hierbei durch das Element <File/> beschrieben; der Dateiname wird mit Hilfe des
Attributs Name definiert. An dieser Stelle hat es im Vergleich zur Version 2 von Windows InstallerXML eine gravierende nderung gegeben. Bei der Version 2 musste der Dateiname dem Attribut
Name immer im kurzen Format (8.3) bergeben werden, optional konnte ein langer Dateiname dem
Attribut LongName zugewiesen werden. In Version 3 ist diese komplizierte und unzeitgeme
Vorgehensweise nicht mehr erforderlich, da ein kurzer Dateiname automatisch erzeugt wird, falls
dieses erforderlich ist. Es ist somit ausreichend dem Attribut Name den Dateinamen zuzuweisen,
wobei dieser 260 Zeichen nicht berschreiten darf. Handelt es sich hierbei um einen langen
Dateinamen, wird whrend des Build-Vorgangs automatisch ein kurzer Dateiname generiert, falls
dieser nicht explizit durch das Attribut ShortName festgelegt wurde. Es wird an dieser Stelle hufig die
Frage gestellt, warum der kurze Dateiname direkt oder indirekt (durch Automatismus) berhaupt noch
anzugeben ist, da ja die aktuelle Betriebssystemgeneration vollstndig lange Dateinamen untersttzt.
Grundstzlich ist dieses richtig, aber das Zielsystem kann so konfiguriert sein, dass bestimmte Teile
des Dateisystems sich auf einem File-Server befinden, der nur kurze Dateinamen kennt. Um auch
solche Szenarien effektiv zu untersttzen verlangt der Windows Installer seit jeher die Angabe der
Dateinamen in dem folgenden Format:
Short Filename|Long FileName
Diese Formatierung gilt nicht nur fr Dateinamen, sondern ist analog auch auf Ordnernamen
anzuwenden, wie die Beispiele in Tabelle 2.17 auch zeigen. Was noch fehlt ist die Zuordnung einer
Datei zu einem Installationsmedium, wozu das Element <Media/> bereitgestellt wird. Die Zuordnung
kann entweder auf Datei- oder auf Komponentenebene erfolgen. Die Verwendung mehrerer MediaElemente ermglicht die Verteilung der zu installierenden Ressourcen auf mehrere Datentrger.
Noch ein Wort zu den Komponenten. Jede Komponente erwartet ein eindeutiges
Identifizierungsmerkmal in Form einer GUID. Dieser als ComponentId bezeichnete Identifikator ist
fr die Modellierung spterer Updates uerst relevant. Aus diesem Grund existieren Regeln, die
festlegen, wann eine solche GUID zu verndern ist. Da es whrend der Entwicklungsphase sehr hufig
80
Windows Installer-XML
Kapitel 2
zu einer nderung der GUID kommen kann, besteht die Mglichkeit, diese nderung automatisch bei
jeder Kompilierung vorzunehmen, wie bereits zuvor angedeutet. Hierzu ist es erforderlich dem Attribut
Guid des Elementes <Component/> die Zeichenfolge * zuzuweisen. Allerdings funktioniert diese
Automatik nicht fr alle Komponentenstrukturen; die folgenden Limitierungen sind daher zu beachten:
Es wir nur eine Datei pro Komponente untersttzt, die auch als Schlssel-Ressource (KeyPath=yes)
festgelegt sein muss. Die Komponente kann diverse andere Arten von Ressourcen, mit Ausnahme
von ODBC-Datenquellen, zustzlich enthalten.
Mehrere Komponenten, die eine identische Datei installieren werden nicht untersttzt.
Was zur Erzeugung eines funktionsfhigen Installationspaketes noch fehlt ist die Definition der
Feature-Struktur. Unter einem Feature versteht man den kleinsten installierbaren Teil des
Softwareproduktes aus Sicht des Endanwenders. Dem entgegenzusetzen ist die Komponente; hierunter
ist der kleinste installierbare Teil des Produktes aus Sicht des Entwicklers zu verstehen. Es ist somit
erforderlich eine Zuordnung von Komponenten zu Features vorzunehmen, wozu die Elemente
<ComponentRef/> oder <ComponentGroupRef/> zu verwenden sind. Hierdurch wird letztlich
bestimmt welche Komponente physisch installiert werden muss, wenn der Anwender ein bestimmtes
Feature zur Installation vorsieht. Die Auswahl der zu installierenden Features erfolgt standardmig in
einem dafr definierten Dialog im Installationsprozess der auch in Abbildung 2.13 zu erkennen ist.
81
Kapitel 2
Windows Installer-XML
Windows Installer-XML
Kapitel 2
vorgenommen werden muss. Eine Mglichkeit dazu wre die direkte Verwendung der Binrdateien
von der Webseite. Einfacher ist es jedoch, die bentigten Dateien von einem Computer zu verwenden,
auf dem Windows Installer-XML installiert wurde.
Installieren Sie hierzu Windows Installer-XML auf dem Entwicklungssystem
Erstellen Sie im Quellcodeverwaltungssystem einen Ordner, in dem die Tools von Windows
Installer-XML gespeichert werden knnen.
Kopieren Sie den Inhalt des Ordners %ProgramFiles%\Windows Installer XML v3\bin in dieses
neu angelegte Verzeichnis.
Verfahren Sie mit dem Verzeichnis %ProgramFiles%\MSBuild\Microsoft\WiX\v3.0 auf identische
Weise.
Weiterhin sind die jeweiligen Projektdateien anzupassen, damit beim Buildvorgang auch die
erforderlichen Dateien gefunden werden. Hierzu ist die entsprechende Projektdatei mit einem
Texteditor zu ffnen und die folgenden Informationen sind dem Element <Project/> anzufgen.
Hierbei ist zu beachten, dass dieses vor dem Element <Import/> erfolgen muss. Um die notwendige
Flexibilitt zu erreichen, sollten keine absoluten Pfadangaben verwendet werden. Es empfiehlt sich die
erforderliche Ordnerstruktur an die Gegebenheiten des Build-Systems anzupassen. So sollte bei der
Verwendung der Microsoft Build Engine auf variable Ordnerbezeichnungen wie
MSBuildExtensionsPath oder MSBuildBinPath zurckgegriffen werden.
<Project>
<PropertyGroup>
<WixToolPath>$(MSBuildExtensionsPath)\wix\3.0.4311.0</WixToolPath>
<WixTargetsPath>$(WixToolPath)\Wix.targets</WixTargetsPath>
<WixTasksPath>$(WixToolPath)\wixtasks.dll</WixTasksPath>
</PropertyGroup>
<Import Project="" />
</Project>
Listing 2.5: Anpassen einer Projektdatei zur Verwendung auf einem Build-Server
Identisches gilt fr Build-Vorgnge mit dem Visual Studio Team Foundation Server. Nachdem
Windows Installer-XML auf dem Server eingerichtet wurde, kann der Team Foundation Server auch
diese Projekte erzeugen. Die Anpassung sollte auf identische Weise erfolgen, wobei spezifische
Umgebungsvariablen wie BinariesRoot verwendet werden knnen.
Tipp Beginn
In der Dokumentation von Windows Installer-XML sind die einzelnen Tasks und Parameter erlutert,
mit denen der Buildprozess unter Verwendung der Microsoft Build Engine gesteuert werden kann.
Tipp Ende
83
Kapitel 2
Windows Installer-XML
Die verwendete Variable muss zuvor im Dokument definiert werden, wozu das Element <? define ?>
nach dem folgenden Schema zu verwenden ist:
<?define SourceFolder = ".\Binaries\" ?>
= "079D5F69-A2B5-4760-AEF9-6644F8F246A0" ?>
= "4E7D6BDD-6B35-4731-9474-1C028F446F65" ?>
<?define ProductId
<?define AppBinariesGuid
<?define LibBinariesGuid
= "C418DE3A-7B13-426A-A054-E9793DD583FA" ?>
= "17F1A33F-BF41-4681-8E4E-2DA613244015" ?>
= "26518869-8F1F-4A9F-9EB1-AF6E240423D8" ?>
<?define BinaryFolder
= ".\Binaries\Debug\" ?>
<?else ?>
<?define ProductName
84
Windows Installer-XML
Kapitel 2
<?define ProductId
<?define AppBinariesGuid
<?define LibBinariesGuid
= "4916154D-6FA2-4729-945B-C34018467549" ?>
= "B7656789-A32E-463D-B7E7-9920BB9765AE" ?>
= "82B76300-2A08-4B6A-8773-1CACD9D1D8D1" ?>
<?define BinaryFolder
= ".\Binaries\Release\" ?>
<?endif ?>
</Include>
Listing 2.6 zeigt ein Beispiel fr eine Includedatei, in der die benutzerdefinierte Variable
$(var.Config) zur Festlegung von Anwendungseinstellungen verwendet wird. Der Wert dieser
Variablen ist in dem Beispiel jedoch nicht definiert, sondern wird erst beim tatschlichen
Kompiliervorgang gesetzt. Bei der Verwendung von Visual Studio ist es erforderlich den
entsprechenden Wert in den Projekteinstellungen fr den Compiler zu definieren, wie dieses auch in
Abbildung 2.16 dargestellt wird. Ich werde an spterer Stelle noch auf die einzelnen Tools von
Windows Installer-XML eingehen. An dieser Stelle mchte ich nur darauf hinweisen, dass die
Erzeugung einer entsprechenden Ausgabedatei auch durch Befehlszeilentools mglich ist. Zum
Kompilieren ist die Anwendung candle.exe und zum Linken die Anwendung light.exe zu verwenden.
Hieraus folgt auch, dass beim Kompilieren ber die Befehlszeile, der entsprechende Wert einer
Variablen dem Befehlszeilenaufruf angefgt werden muss:
candle.exe
wixproject1.wxs -dConfig=debug
Windows Installer-XML enthlt in der Version 3 eine weitere Variablen-Form, die als WiXVariable
bezeichnet wird. Der groe Vorteil dieser Variablen liegt in der Flexibilitt, da sie bereits im WXSDokument definiert und mit einem Standardwert belegt werden kann. Dieser Standardwert kann jedoch
berschrieben werden, indem der neue Wert dem Befehlszeilenaufruf des Linkers angefgt wird. Es ist
ebenfalls mglich diesen neuen Wert in den Projekteinstellungen von Visual Studio zu definieren.
Nachfolgend wird die Definition einer WiXVariblen, sowie deren Verwendung im weiteren Projekt
verdeutlicht.
<!-- WIX-Varible, die per Kommandozeile von light.exe berschrieben werden kann -->
<WixVariable Id="TargetFolder" Value="Demo" Overridable="yes"/>
Es ist zu beachten, dass im Gegensatz zu den bisher erluterten Variablen, eine WixVariable durch
!(wix.<Variable>) im Dokument zu referenzieren ist. Im Vergleich mit den bisherigen Variablen
bleibt zu bemerken, dass diese bereits whrend des Kompilierens bentigt wurden; ein aktualisierter
Wert fr die WiXVariable muss hingegen erst beim Linken vorhanden sein. Hieraus ergeben sich
interessante Anwendungsformen, da auf Basis einer Objektdatei mehrere individuelle Zielprodukte
erstellt werden knnen.
Zustzlich zu den Variablen stehen unter Windows Installer-XML auch die Prprozessor-Elemente
Bedingung und Iteration zur Verfgung, wobei Iterationen durch For-Each-Statements realisiert
werden knnen. Zur Definition von Bedingungen knnen die folgenden Elemente verwendet werden:
85
Kapitel 2
Windows Installer-XML
<?if ?>
<?ifdef ?>
<?ifndef ?>
<?else?>
<?elseif ?>
<?endif?>
Durch die Verwendung der Bedingungen ist es beispielsweise mglich, den Umfang der zu
installierenden Ressourcen anhand bestimmter Konfigurationseinstellungen einzuschrnken oder zu
erweitern:
<!-- Falls Debug die Symboldatei einbinden -->
<?if $(var.Config) = "debug" ?>
<File Id="SymbolFile" Source="$(var.BinaryFolder)" Name="Demo.pdb" KeyPath="no" DiskId="1" />
<?endif ?>
Zustzlich knnen auch Fehlermeldungen oder Warnungen ausgegeben werden, bei denen die
Voraussetzungen auf Basis der Bedingungen geprft werden. In dem vorherigen Beispiel kann geprft
werden, ob die Variable Config berhaupt definiert wurde. Ist das nicht der Fall, wird der
Kompiliervorgang beendet und eine entsprechende Fehlermeldung ausgegeben.
<?ifndef Config ?>
<?error Erforderliche Variable 'Config' wurde nicht definiert ?>
<?endif?>
Weitere Prprozessor-Elemente ergeben sich bei der Verwendung in Visual Studio. Hier besteht die
Mglichkeit das WIX-Projekt in eine Projektmappe zu integrieren und Elemente der anderen Projekte
zu referenzieren. Voraussetzung hierfr ist die Festlegung eines Verweises auf das entsprechende
Projekt, wie dieses auch in Abbildung 2.17 gezeigt wird.
86
Windows Installer-XML
Kapitel 2
Die weitere Referenzierung ist vergleichbar mit der Verwendung von Variablen, wobei der Name des
zu verwendenden Projektes angegeben werden muss. Soll beispielsweise eine Datei des Projektes
FootballChainer in ein Installationspaket integriert werden, so kann die folgende Definition
verwendet werden.
<File Id="AppFile" Name="$(var.FootballChainer.TargetFileName)"
Source="$(var.FootballChainer.TargetPath)" DiskId="1"/>
Eine Auflistung der mglichen Prprozessor-Variablen ist in Tabelle 2.18 zusammengefasst. Hierbei
gilt
es
zu
bercksichtigen,
dass
projektspezifische
Variablen
in
der
Form
$(var.<Projekt>.<Variable>) und Variablen, die auf die Projektmappe abzielen in der Form
$(var.<Variable>) zu verwenden sind.
Prprozessor-Variable
Beispiel
Ergebnis
var.Projektname.Configuration
$(var.App.Configuration)
var.Projektname.FullConfiguration
$(var.App.FullConfiguration)
Debug | AnyCPU
var.Projektname.Platform
$(var.App.Platform)
var.Projektname.ProjectDir
$(var.App.ProjectDir)
D:\Setup\App\
var.Projektname.ProjectExt
$(var.App.ProjectExt)
.csproj
87
Kapitel 2
Windows Installer-XML
var.Projektname.ProjectFileName
$(var.App.ProjectFileName)
App.csproj
var.Projektname.ProjectName
$(var.App.ProjectName)
App
var.Projektname.ProjectPath
$(var.App.ProjectPath)
D:\Setup\App\App.csproj
var.Projektname.TargetDir
$(var.App.TargetDir)
D:\Setup\App\Bin\Debug\
var.Projektname.TargetExt
$(var.App.TargetExt)
.exe
var.Projektname.TargetFileName
$(var.App.TargetFileName)
App.exe
var.Projektname.TargetName
$(var.App.TargetName)
App
var.Projektname.TargetPath
$(var.App.TargetPath)
D:\Setup\App\Obj\Debug\App.exe
var.SolutionDir
$(var.SolutionDir)
D:\Setup\
var.SolutionExt
$(var.SolutionExt)
.sln
var.SolutionFileName
$(var.SolutionFileName)
MyApps.sln
var.SolutionName
$(var.SolutionName)
MyApps
var.SolutionPath
$(var.SolutionPath)
D:\Setup\MyApps.sln
Bei der Verwendung der Microsoft Build Engine ist bei der Referenzierung eines anderen Projektes
immer die Projektmappen-Datei (.sln) als Quelle anzugeben. Die Angabe der Projektdatei (.wixproj)
fhrt zum Fehler, da die Projektreferenzen nicht aufgelst werden knnen.
Lokalisierte Installationspakete
Die Lokalisierung, also die Bereitstellung eines Installationspaketes in mehrere Sprachen ist mit den
gerade bezeichneten Mglichkeiten der Variablen und Includedateien problemlos mglich. Dennoch
stellt Windows Installer-XML fr diese Zwecke spezielle Sprachdateien zur Verfgung, die durch die
Dateiendung .wxl gekennzeichnet sind. Diese WXL-Dateien sind vergleichbar mit RessourceDateien der klassischen Softwareentwicklung. Der groe Vorteil der Sprachdateien begrndet sich
darin, dass Sie erst whrend des Linkens bentigt werden. Eine benutzerdefinierte Variable muss
bereits zur Kompilierzeit definiert sein, so dass die erzeugte Objektdatei bereits den endgltigen Wert
dieser Variablen enthlt. Bei der Verwendung von Sprachdateien wird die Definition der Variablen
hingegen erst whrend des Linkens geprft und ausgewertet. Hierdurch ist es mglich eine
sprachneutrale Objektdatei durch den Compiler erstellen zu lassen und diese zu einem spteren
Zeitpunkt als Quelle fr die lokalisierten Pakete zu verwenden, was vom zeitlichen Aspekt natrlich
uerst effizient ist. Sprachdateien sind ebenfalls im XML-Format zu definieren, wobei das
Stammelement <WixLocalization/> zu verwenden ist. Ich mchte die Verwendung der Sprachdateien
anhand eines Beispiels verdeutlichen, bei dem ich auch Includedateien verwende. Zunchst ist eine
WXL-Datei mit der Bezeichnung 1031.wxl zu erstellen, die deutschsprachige Zeichenfolgen enthlt,
wie dieses in Listing 2.7 dargestellt wird.
<?xml version="1.0" encoding="windows-1252"?>
<WixLocalization xmlns='http://schemas.microsoft.com/wix/2006/localization' Codepage="1252" Culture="de-DE" >
<String Id="Lang">1031</String>
<String Id="Name">MSI-Demo 1.0 (Deutsch)</String>
<String Id="Comment">Dieses Installationspaket enthlt die Daten des Produktes "MSI-Demo 1.0".</String>
88
Windows Installer-XML
Kapitel 2
Zustzlich ist eine weitere Sprachdatei erforderlich, die entsprechende englischsprachige Texte enthlt.
Diese ist in Listing 2.8 dargestellt und wird als 1033.wxl gespeichert.
<?xml version="1.0" encoding="utf-8"?>
<WixLocalization xmlns='http://schemas.microsoft.com/wix/2006/localization' Codepage="1252" Culture="en-US" >
<String Id="Lang">1033</String>
<String Id="Name">MSI Demo 1.0 (English)</String>
<String Id="Comment">This installer database contains the logic required to install "MSI Demo".</String>
<String Id="InstallFolder">MSI Demo 1.0 (English)</String>
<String Id="FeatureTitle">Complete</String>
<String Id="FeatureDescription">Installed all Features</String>
<String Id="FrameworkExist">This setup requires the .NET Framework version.</String>
</WixLocalization>
Eine Includedatei kann verwendet werden um Variablen zu deklarieren und Konstanten festzulegen.
Die Verwendung als externe Datei ermglicht sehr flexible Lsungsanstze, da ein Austausch der
Datei mglich ist, ohne nderungen im Hauptdokument vorzunehmen. In dem Beispiel habe ich die
Includedatei config.wxi erstellt um das Verzeichnis der Binrdateien zu bestimmen und
Identifizierungsmerkmale festzulegen.
<?xml version="1.0" encoding="utf-8"?>
<Include>
<?define SourceFolder
= ".\Binaries\" ?>
<?define HelpGuid
= "B593614E-5EE5-415B-8DD9-8A8CD6A78826"
<?define ReadmeGuid
= "C0642C4A-B634-4F40-BD17-F7CECFB65087"
<?define ProductId
= "D5645496-67E7-4A07-9D85-14F857DB0BD1"
<?define AppBinariesGuid = "C708824B-7AF6-4DAC-ACF7-BDCBFAC95238"
<?define LibBinariesGuid = "123B06EC-4364-4876-9E68-99127BD9BABF"
</Include>
?>
?>
?>
?>
?>
Letztlich sollen die Informationen aus den Sprachdateien und der Includedatei beim Erstellen der
Ausgabedatei verwendet werden, wozu sie in der jeweiligen WXS-Datei zu referenzieren sind, wie
dieses in Listing 2.10 dargestellt wird. Die lokalisierten Informationen werden im Hauptdokument wie
Variablen verwendet, wobei als Typ loc anzugeben ist. Um beispielsweise auf die Zeichenfolge
Name der Sprachdatei aus Listing 2.7 oder Listing 2.8 zuzugreifen ist im Hauptdokument die
Referenz $(loc.Name) zu verwenden.
<?xml version="1.0" ?>
<!-- Konfigurationsinformationen einbinden -->
<?include Config.wxi ?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<!-- Produktdefinition -->
89
Kapitel 2
Windows Installer-XML
Die Erstellung der Ausgabedatei kann natrlich wieder ber die Befehlszeile erfolgen. Werden
90
Windows Installer-XML
Kapitel 2
Sprachdateien im Projekt verwendet, mssen diese der Befehlszeile des Linkers mit dem Argument loc bergeben werden.
candle.exe Product.wxs
light.exe -out 1031.msi Product.wixobj -loc 1031.wxl
light.exe -out 1033.msi Product.wixobj -loc 1033.wxl
Einfacher und im Hinblick auf automatisierte Buildprozesse auch flexibler, ist die Erstellung mit
Visual Studio. Hierzu ist zunchst ein entsprechendes Visual Studio-Projekt zu erstellen, wie es in
Abbildung 2.18 dargestellt wird.
Der Buildvorgang kann nun durch die bekannten Mechanismen gestartet werden. Es werden
standardmig zwei Installationspakete erzeugt, da auch zwei Sprachdateien vorhanden sind. ber die
Projekteinstellungen, kann der Umfang der zu erstellenden Installationspakete hinsichtlich der Kultur
eingeschrnkt werden.
Fragmente
Gerade bei der Arbeit in Entwicklungsteams besteht die Anforderung, das Gesamtdokument zur
Erstellung der Installationsdatei, in mehrere physische Dateien aufzuteilen. Die involvierten
Entwickler knnten hierdurch die installationsspezifischen Beschreibungen, der von Ihnen
entwickelten Komponente selbst vornehmen, wobei erst im spteren Buildprozess diese Informationen
in das Gesamtdokument einflieen. Dies ist ohne Probleme mglich, denn Windows Installer-XML
stellt fr solche Zwecke einen Building-Block zur Verfgung, der als Fragment bezeichnet wird und
die folgenden Vorteile bietet:
Das Gesamtdokument kann funktional getrennt werden. Hierdurch ist es beispielsweise mglich
die Darstellung von der Implementierung unabhngig zu entwickeln und zu pflegen.
Komponenten, die von mehreren Installationsprogrammen bentigt werden, knnen separat
entwickelt werden, wodurch die Fehleranflligkeit minimiert wird. Diese wiederverwendbaren
Teilkomponenten, zu denen auch die Benutzeroberflche gehrt, knnen vorkompiliert werden,
wodurch der Buildprozess beschleunigt werden kann.
91
Kapitel 2
Windows Installer-XML
Die Aufteilung des Gesamtdokumentes in mehrere physische Dateien ermglicht den effektiven
Einsatz in Entwicklungsteams. Die involvierten Entwickler knnen bei solchen Voraussetzungen
die installationsspezifischen Beschreibungen, der von Ihnen entwickelten Komponente selbst
vornehmen, wobei erst im spteren Buildprozess diese Informationen in das Gesamtdokument
einflieen.
Die Definition eines Fragmentes erfolgt durch den WIX-Elementtyp <Fragment/>, der wiederum
diverse Unter-Elemente aufnehmen kann. Diese untergeordneten Elemente knnen vom
Hauptdokument referenziert werden. Es ist ebenfalls mglich auf Informationen des Hauptdokumentes
zuzugreifen. Weiterhin ist natrlich auch ein Zugriff zwischen mehreren Fragmenten mglich. Zur
Referenzierung stehen die Elementtypen <UIRef/>, <DialogRef/>, <BinaryRef/>, <PropertyRef/>,
<CustomActionRef/>,
<FeatureRef/>,
<DirectoryRef/>,
<DirectorySearchRef/>,
<EmbeddedChainerRef/>, <FeatureGroupRef/>, <FileSearchRef/>, <IconRef/>, <MergeRef/>,
<PatchFamilyRef/>, <RegistrySearchRef/>, <ComponentRef/> oder <ComponentGroupRef/> zur
Verfgung. Im folgenden Listing 2.11 ist das Hauptdokument eines Projektes zu sehen. Interessant ist
hierbei die Ordnerstruktur, da diese nur modelliert wurde, jedoch keine Komponenten enthlt. Anders
ist es bei der Feature-Struktur. Hier findet sich eine Referenz auf ein untergeordnetes Feature, das in
dem Dokument gar nicht definiert ist und sich somit in einem Fragment befinden muss.
<?xml version="1.0" encoding="windows-1252"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<!-- Definition des Produktes -->
<Product UpgradeCode="4BE21D77-BA5D-42EC-9A1F-BCE9F3B5D82B" Manufacturer="Microsoft Deutschland GmbH"
Language="1031" Version="1.00.0000" Name="MSI-Test 1.0"
Id="AA387173-BADA-4261-8B81-40207CDD14EB" Codepage="1252">
<!-- Paketdefinition -->
<Package Keywords="Microsoft Windows Installer, MSI" Description="MSI-Test 1.0"
Manufacturer="Andreas Kerl" InstallerVersion="200" Platform="x86" Languages="1031"
Compressed="yes" SummaryCodepage="1252" />
<!-- Ordner, Komponenten und Ressourcen -->
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="ProgramFilesFolder">
<Directory Id="INSTALLLOCATION" Name="MSI-Test 1.0">
</Directory>
</Directory>
</Directory>
<!-- Definition der Featurestruktur -->
<Feature Id="Application" Title="Anwendung" Description="Installiert die Anwendung" Level="1">
<FeatureRef Id="SubApplication"/>
</Feature>
<!-- Medien -->
<Media Id="1" EmbedCab="yes" Cabinet="Data.cab" />
</Product>
</Wix>
Das Fragment ist wesentlich einfacher aufgebaut als das Hauptdokument. In Listing 2.12 sind die zu
installierenden Komponenten erkennbar. Die Zuordnung zu einem Zielverzeichnis erfolgt durch eine
92
Windows Installer-XML
Kapitel 2
Referenzierung zu einer Definition im Hauptdokument. Zustzlich ist ein neues Feature definiert, dem
diese Komponenten zugeordnet wurden. Dieses Feature wird wie bereits erwhnt vom Hauptdokument
referenziert.
<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Fragment>
<!--Zielverzeichnis, Komponenten und Dateien-->
<DirectoryRef Id="INSTALLLOCATION">
<Component Id="DD.exe" Guid="6ABBEDC4-3D20-4901-BBAE-D6D16127571A">
<File Id="DD.exe" Source=".\Binaries\" Name="DD.exe" KeyPath="yes" DiskId="1" />
</Component>
<Component Id="Common.dll" Guid="332C7990-C503-4992-8494-4151FEF834AB">
<File Id="Common.dll" Source=".\Binaries\" Name="Common.dll" KeyPath="yes" DiskId="1" />
</Component>
</DirectoryRef>
<!--Zuordnung zu Features-->
<Feature Id="SubApplication" Title="DD" Level="3">
<ComponentRef Id="DD.exe" />
<ComponentRef Id="Common.dll" />
</Feature>
</Fragment>
</Wix>
Beim Kompilieren und beim Linken ist zu beachten, dass die physische Datei, in der das Fragment
definiert wurde, den entsprechenden Befehlszeilen anzufgen ist.
candle.exe Product.wxs Fragment.wxs
light.exe -out Product.msi Product.wixobj Fragment.wixobj
Bei Verwendung von Visual Studio ist es zur Erstellung eines neuen Fragments ausreichend, ein neues
Element vom Typ WiX File dem Projekt hinzuzufgen. Es ist erkennbar, dass dieses neue
Dokument bereits als Fragment gekennzeichnet ist, so dass die erforderlichen Daten in diesem
Dokument direkt erfasst werden knnen.
Hinweis Beginn
Es ist nicht erforderlich, ein Fragment in eine separate Datei auszulagern. Es besteht natrlich auch die
Mglichkeit mehrere Fragmente in einer physischen Datei zusammenzufassen oder Fragmente mit
dem Hauptprojekt zu verknpfen.
Hinweis Ende
93
Kapitel 2
Windows Installer-XML
XML Framework enthlt eine Vielzahl von Tools, Anwendungen, Spezifikationen und
Dokumentationen, von denen die wichtigsten in Tabelle 2.19 zusammengefasst sind.
Tool
Beschreibung
candle.exe
dark.exe
heat.exe
light.exe
lit.exe
pyro.exe
melt.exe
smoke.exe
torch.exe
wixcop.exe
Tool zum Validieren von WiX-Dokumenten und zum konvertieren in das Format der
Version 3.
wix.chm
wix.dll
*extension.dll
*.xsd
Diverse XML-Schemata.
Die berwiegende Anzahl der Anwendungen kann vllig eigenstndig verwendet werden, wie das
beispielsweise bei smoke.exe oder dark.exe der Fall ist. Auf der anderen Seite bauen einige Tools
aufeinander auf, wodurch die Ausgabe des einen Tools als Eingabe eines anderen Tools zu verwenden
ist. Das Zusammenspiel der einzelnen Tools zeigt Abbildung 2.19.
94
Windows Installer-XML
Kapitel 2
Aus dem Ablaufdiagramm wird ebenfalls deutlich, dass unterschiedliche Dateien und Dateitypen von
den jeweiligen Tools bentigt werden. Die mit Windows Installer-XML erzeugten und verwendeten
Dateitypen zeigt Tabelle 2.20.
Erweiterung
Typ
Beschreibung
.wxi
Include-Datei
.wxl
LokalisierungsDatei
.wxs
Quellcode-Datei
.wixobj
Objekt-Datei
95
Kapitel 2
Windows Installer-XML
.wixout
XMLAusgabedatei
Eine solche Datei wird durch den Linker erzeugt. Diese Dateiart ist die
XML-Reprsentation der finalen Ausgabe.
.wixlib
WiX-Bibliothek
.wixpdb
Symboldatei
Eine solche Datei wird fr jede Ausgabedatei durch den Linker erzeugt.
Sie enthlt Debugging-Informationen.
.wixmsp
XML-Patchdatei
.wixmst
XMLTransformation
WixCop.exe
Mit diesem Tool ist es mglich, bestehende WXS-Dokumente einer lteren Version von Windows
Installer-XML in das Format der Version 3 zu konvertieren. Eine andere Aufgabe betrifft die
berprfung des vorliegenden Dokumentes auf Probleme hinsichtlich der XML-Struktur und die
Formatierung eines Dokumentes. Die Erzeugung eines WXS-Dokumentes kann mit jedem Texteditor
erfolgen, wodurch das Ergebnis hinsichtlich der Darstellung unterschiedlich ausfallen kann. Mit
wixcop.exe ist es mglich, das Dokument automatisch zu formatieren um hier ein einheitliches
Erscheinungsbild zu bekommen. Wird als Quelldatei ein WXS-Dokument verwendet, das mit einer
lteren Version von Windows Installer-XML erstellt wurde, kann dieses in die neue Version
konvertiert werden. Die Aufrufsyntax gestaltet sich wie folgt:
wixcop.exe [Optionen] Quelldatei [Quelldatei ...]
Beim Aufruf knnen mehrere Quelldateien angegeben werden, wobei auch Platzhalter fr die Namen
erlaubt sind. Werden bei der berprfung keine Fehler festgestellt, wird wixcop.exe mit dem ExitCode 0 beendet. Kommt es zu einem Fehler bei der Programmausfhrung wird 1 zurckgeliefert.
96
Windows Installer-XML
Kapitel 2
Wird hingegen festgestellt, dass das Dokument einen Fehler aufweist wird das Tool mit 2 beendet.
Die folgende Tabelle zeigt die Optionen, mit denen die berprfung beeinflusst werden kann.
Schalter
Beschreibung
-?
-f
-s
-indent:n
berschreibt den Standardwert fr den Einzug, der auf 4 Leerzeichen festgelegt ist.
-set1filename
Ldt eine primre Konfigurationsdatei. Es ist zu beachten, dass zwischen dem Schalter und
dem Pfad der Einstellungsdatei keine Leerzeichen eingefgt werden drfen.
-set2filename
Die Dokumentation von Windows Installer-XML enthlt eine Auflistung aller Prfungen, die von
wixcop.exe durchgefhrt werden. Hier finden sich auch die IDs, die in den entsprechenden
Konfigurationsdateien zu verwenden sind.
Heat.exe
Das wahrscheinlich unscheinbarste Tool ist heat.exe, dessen Funktionsumfang allerdings nicht
97
Kapitel 2
Windows Installer-XML
unterschtzt werden sollte. Bei heat.exe handelt es sich um einen sogenannten Harvester, also ein
Tool zum Sammeln von Informationen fr die Installation. Nehmen Sie als Beispiel ein einfaches
Installationspaket, das lediglich Dateien installieren soll. Hierzu muss zunchst ein WXS-Dokument
erzeugt werden, in dem die entsprechenden Dateien definiert werden mssen. Zunchst ist eine
Komponente zu erzeugen und dieser Komponente muss die Datei mit den entsprechenden
Metainformationen zugeordnet werden. Das bedeutet natrlich auch, dass in Abhngigkeit zum
Dateityp unterschiedliche Betrachtungsweisen erfolgen mssen. Handelt es sich beispielsweise um
eine COM-Komponente, mssen die zugehrenden Registrierungsinformationen ebenfalls ausgelesen
und im WXS-Dokument entsprechend abgelegt werden. Handelt es sich um ein .NET-Assembly, sind
die spezifischen Assembly-Attribute dem Element <File/> anzufgen. Handelt es sich um eine Datei
mit Versionsangabe, mssen die Versionsinformationen bernommen werden. Verfgt die Datei ber
keine Versionsinformationen ist ein Hash zu berechnen und der entsprechenden Tabelle zuzuordnen.
Es wird deutlich, dass der Aufwand zum Ermitteln dieser Informationen und deren Speicherung im
WXS-Dokument nicht zu unterschtzen ist. An dieser Stelle kommt heat.exe ins Spiel. Das Tool
ermittelt automatisch alle erforderlichen Informationen und erstellt daraus ein WXS-Dokument.
Hierbei ist es mglich, die Informationen fr eine einzelne Datei oder ein komplettes Verzeichnis
abzurufen, wozu die folgenden Befehlszeilenaufrufe zu verwenden sind:
heat.exe dir [Optionen] [Verzeichnis] -out Datei.wxs
heat.exe file [Optionen] [Dateiname] -out Datei.wxs
Durch die Optionen kann beispielsweise gesteuert werden, welches Format die Ausgabedatei besitzen
soll, ob die GUIDs fr die Komponenten automatisch generiert werden sollen und in welcher Form die
COM-Informationen abgespeichert werden sollen. Eine vollstndige Auflistung der Schalter ist in
Tabelle 2.22 zu finden.
Schalter
Beschreibung
-ag
-gg
-ke
Leere Verzeichnisse werden ebenfalls bernommen. Dieser Schalter ist nur auf
Ordnerebene verfgbar.
-out
-pog:<Gruppe>
-scom
-sfrag
-sreg
-suid
-template:product
Die Ausgabe erfolgt in ein Dokument vom Typ <Product/>. Alle Ordner werden
98
Windows Installer-XML
Kapitel 2
hierbei unter TARGETDIR angeordnet und alle Komponenten werden dem StandardFeature angefgt.
-template:module
-template:fragment
Im Installationsverzeichnis von Windows Installer-XML befindet sich unter anderem die Datei
mergemod.dll. Die Ermittlung von Informationen zu dieser Datei kann mit dem folgenden Befehl
durchgefhrt werden:
heat.exe file -template:fragment -gg -sfrag mergemod.dll -out mm.wxs
Das Ergebnis dieses Aufrufs ist ein WXS-Dokument vom Typ Fragment, das in Listing 2.14
dargestellt ist.
<?xml version="1.0" encoding="utf-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Fragment>
<Directory Id="bin" Name="bin">
<Component Id="mergemod.dll" Guid="{E202E2EF-D3F5-476D-9473-EDE11FDDA2A8}">
<File Id="mergemod.dll" Name="mergemod.dll" KeyPath="yes"
Source="C:\Program Files (x86)\Windows Installer XML v3\bin\mergemod.dll">
<Class Id="{0ADDA830-2C26-11D2-AD65-00A0C9AF11A6}" Context="InprocServer32"
Description="MSM Merge COM Server" ThreadingModel="both">
<ProgId Id="MSM.Merge.1" Description="MSM Merge COM Server">
<ProgId Id="MSM.Merge" Description="MSM Merge COM Server" />
</ProgId>
</Class>
<Class Id="{F94985D5-29F9-4743-9805-99BC3F35B678}" Context="InprocServer32"
Description="MSM Merge Extended COM Server" ThreadingModel="both">
<ProgId Id="MSM.Merge2.1" Description="MSM Merge Extended COM Server">
<ProgId Id="MSM.Merge2" Description="MSM Merge Extended COM Server" />
</ProgId>
</Class>
</File>
<RegistryValue Root="HKLM"
Key="Software\Classes\Interface\{0ADDA827-2C26-11D2-AD65-00A0C9AF11A6}\ProxyStubClsid"
Value="{00020424-0000-0000-C000-000000000046}" Type="string" Action="write" />
<RegistryValue Root="HKLM"
Key="Software\Classes\TypeLib\{0ADDA82F-2C26-11D2-AD65-00A0C9AF11A6}\2.0"
Value="Microsoft MSM Merge Type Library" Type="string" Action="write" />
</Component>
</Directory>
</Fragment>
<Fragment>
<ComponentGroup Id="ComponentGroup1">
<ComponentRef Id="mergemod.dll" />
</ComponentGroup>
</Fragment>
</Wix>
99
Kapitel 2
Windows Installer-XML
Mit heat.exe ist es auch mglich, Informationen aus Visual Studio-Projekten zu extrahieren. Die
folgende Codezeile erstellt auf Basis eines Visual Studio-Projektes ein WXS-Dokument, dem die
Quell- und Binrdateien des Projektes hinzugefgt werden.
heat.exe project -gg -pog:Sources -pog:Binaries substg.csproj -out out.wxs
Zustzlich zu den Informationen auf Datei-, Ordner und Projekt-ebene, kann heat.exe auch
Informationen von Websites sammeln und ablegen.
Dark.exe
Ein weiteres sehr interessantes Tool ist dark.exe. Dieses Tool ist fr den Personenkreis sehr
interessant, der bereits andere Anwendungen oder Technologien zum Erzeugen von Windows
Installer-Dateien einsetzt und nun zu Windows Installer-XML wechselt. Bei dark.exe handelt es sich
um einen Decompiler fr Windows Installer-Dateien, also um eine Anwendung, die aus einem
Installationspaket das zugrunde liegende WXS-Dokument konstruiert. Die generelle Aufrufsyntax
gestaltet sich wie folgt
dark.exe [-?] [-nologo] Datenbank.msi [Ausgabe.wxs]
Es knnen verschiedene Optionen verwendet werden, um das Zielprodukt, also das WXS-Dokument,
ergebnisorientiert anzupassen. Es besteht die Mglichkeit, die im Paket enthaltenen Ressourcen zu
extrahieren oder auf den Export der Informationen zur Darstellung der Benutzeroberflche gnzlich zu
verzichten. Eine vollstndige Auflistung der Optionen ist in Tabelle 2.23 zu finden.
Schalter
Beschreibung
-nologo
-notidy
Die temporren Dateien werden nicht gelscht. Diese Option ist beim Debugging hilfreich.
-o[ut]
-sct
-sdet
Standardmig werden leere Tabellen nicht im WXS-Dokument definiert. Durch diese Option
werden auch leere Tabellen bertragen, indem diese mit dem Element EnsureTable
gekennzeichnet werden.
-sras
Standardmig werden die Aktionen relativ zueinander angeordnet. Mit dieser Option ist es
mglich, eine absolute Anordnung zu erreichen, indem die Sequenznummern bertragen werden.
-sui
Es werden keine Tabellen bertragen, die zur Darstellung der Benutzeroberflche dienen.
-sw[N]
-v
-wx[N]
100
Windows Installer-XML
Kapitel 2
Exportiert die Inhalte der Kabinettdateien und die eingebetteten Binrdateien in den angegebenen
Ordner.
-xo
Anstelle eines WXS-Dokumentes wird ein WIXOUT-Dokument erstellt. Diese Dokumentart ist
hilfreich zur Erstellung von Transformationen und Patches.
Die nachfolgende Befehlszeile erzeugt aus dem Installationspaket wix3.msi ein entsprechendes WXSDokument, wobei die Informationen zur Gestaltung der Benutzeroberflche ignoriert werden.
Gleichzeitig werden die im Paket enthaltenen Ressourcen extrahiert und in dem Unterordner bin
abgelegt.
dark.exe wix3.msi wix3.wxs -sui -x .\bin
Das Tool dark.exe entscheidet anhand des vorliegenden Formates in welchen Dokumenttyp die
Informationen umgewandelt werden. Ein Windows Installer-Paket (.msi) wird hierbei in ein Dokument
vom Typ Product umgewandelt. Ein Windows Installer-Mergemodul (.msm) in ein Dokument vom
Typ Module und ein Patch Creation Property File (.pcp) in den Typ PatchCreation. Die so erzeugten
Dateien knnen mit dem Compiler und Linker wieder in eine entsprechende Windows Installer-Datei
berfhrt werden.
Anders verhlt es sich bei Ursprungsdateien vom Typ Windows Installer-Patch (.msp) und Windows
Installer-Transformation (.mst). Diese werden direkt in ein WIXOUT-Dokument verwandelt und
knnen danach mit dem Linker in die entsprechende Windows Installer-Datei berfhrt werden. Die
folgende Befehlszeile erstellt aus der Windows Installer-Transformation diff.mst die entsprechende
Ausgabedatei.
dark.exe diff.mst -out diff2.wxs
Da es sich bei der Ausgabedatei um eine Textdatei im XML-Format handelt, kann diese natrlich sehr
einfach wieder modifiziert werden. Anschlieend gengt ein Aufruf des Linkers um diese Datei wieder
in einer regulre Transformation umzuwandeln.
light.exe diff2.wxs -out diff2.mst
Es wird deutlich, dass die Verwendung von dark.exe auch mit speziellen Windows Installer-Dateien
durchaus seine Vorteile bietet. Denn eine solche nderungsmglichkeit bei Transformationen sucht
man bei klassischen Anstzen ber das Windows Installer-SDK vergebens.
Melt.exe
Mergemodule dienen zum speichern und verwalten von wiederverwendbaren Teilen des
Installationspaketes und sind daher uerst hilfreich. Dennoch existieren einige gravierende Probleme
mit Mergemodulen, die noch an spterer Stelle in diesem Buch erlutert werden. An dieser Stelle ist
101
Kapitel 2
Windows Installer-XML
jedoch ein Kritikpunkt besonders gravierend, der auf das proprietre Dateiformat des Mergemoduls
abzielt. Hierbei handelt es sich um ein Binrformat, so dass eine effektive Verwaltung in
Versionskontrollsystemen nur uerst schwierig realisierbar ist. Dieses begrndet sich darauf, dass es
beim Binrformat nicht mglich ist, eine exakte Visualisierung der nderungen zu erhalten, die im
Entwicklungszeitraum vorgenommen werden. Eine solche Funktionalitt ist nur mit Dateien im
Textformat problemlos erreichbar. An dieser Stelle kommt nun melt.exe ins Spiel. Mit diesem Tool ist
es mglich, den Inhalt eines Mergemoduls in ein WXS-Dokument vom Typ Fragment zu bertragen.
Es wird aber auch deutlich, dass dieses Tool hnlichkeiten mit dark.exe aufweist. Allerdings
verwendet dark.exe einen generischen Ansatz und zielt somit auf unterschiedliche Dateiarten ab. Mit
dark.exe ist es jedoch nicht mglich eine Konvertierung vorzunehmen, so dass ein Mergemodul
hiermit immer in ein Dokument vom Typ Module berfhrt wird. Bei der Verwendung von melt.exe
findet hingegen eine Konvertierung statt. Die Inhalte eines Mergemoduls werden in ein Fragment
bertragen, dass wiederum mit einem Produkt zusammengefhrt werden kann oder unter Verwendung
von lit.exe in eine Windows Installer-XML-Bibliothek kompiliert werden kann. Die Aufrufsyntax ist
nachfolgend dargestellt.
melt.exe [-?] [-nologo] Datenbank.msm Ausgabe.wxs
Wie auch bei allen anderen Tools lassen sich die Ausgabeoptionen weiter beeinflussen. Hierzu stehen
die in Tabelle 2.24 aufgefhrten Schalter zur Verfgung. Es ist nicht verwunderlich, dass diese
hnlichkeiten zu dark.exe aufweisen.
Schalter
Beschreibung
-id Name
-nologo
-notidy
Die temporren Dateien werden nicht gelscht. Diese Option ist beim Debugging hilfreich.
-sw[N]
-v
-wx[N]
-x <Pfad>
Exportiert die Inhalte der Kabinettdateien und die eingebetteten Binrdateien in den
angegebenen Ordner.
Die Toolsammlung Logo Testing Tools for Windows enthlt mehrere Mergemodule, die im Rahmen
der Zertifizierung verwendet werden. Eines davon wird zum Testen der Rollback-Funktionalitt
bentigt und trgt die Bezeichnung FailInstallFromDeferredCustomAction.msm. Die Umwandlung mit
melt.exe kann durch die folgende Befehlszeile realisiert werden.
Melt.exe FailInstallFromCommitCustomAction.msm output.wxs
Das Ergebnis ist das WXS-Dokument output.wxs vom Type Fragment, dass in Listing 2.15 dargestellt
102
Windows Installer-XML
Kapitel 2
wird. Zu erkennen sind hierbei sehr gut die Identifizierungsmerkmale des Mergemoduls, die jedoch im
Rahmen der Konvertierung angepasst werden knnen.
<?xml version="1.0" encoding="utf-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Fragment>
<Binary Id="FailHere.156F8A4A_069C_403C_A1DD_3D624343D812"
SourceFile="D:\003\Binary\FailHere.156F8A4A_069C_403C_A1DD_3D624343D812" />
<ComponentGroup Id="VistaLogoFailHereTestModule.156F8A4A_069C_403C_A1DD_3D624343D812" />
<CustomAction Id="FailHere.156F8A4A_069C_403C_A1DD_3D624343D812"
BinaryKey="FailHere.156F8A4A_069C_403C_A1DD_3D624343D812" DllEntry="FailHere" Execute="deferred" />
<DirectoryRef Id="VistaLogoFailHereTestModule.156F8A4A_069C_403C_A1DD_3D624343D812" />
<Property Id="VistaLogoFailHereTestModule.156F8A4A_069C_403C_A1DD_3D624343D812"
Value="VistaLogoFailHereTestModule.156F8A4A_069C_403C_A1DD_3D624343D812" />
<InstallExecuteSequence>
<Custom Action="FailHere.156F8A4A_069C_403C_A1DD_3D624343D812" Before="InstallFinalize" />
</InstallExecuteSequence>
</Fragment>
</Wix>
Dieses Fragment kann nun wie zuvor erlutert, von einem anderen Dokument aus referenziert werden,
so dass die Informationen whrend des Buildprozesses auch in das Zielprodukt einflieen.
Candle.exe
Innerhalb der Kompilierphase werden die Informationen der WXS-Dokumente auf Gltigkeit geprft,
die Variablen aufgelst und die Ergebnisse in WIXOBJ-Dateien abgelegt. Der Wesentliche Aspekt
innerhalb dieses Vorgangs ist das Prfen der Daten auf Gltigkeit, wozu primr die Schemadatei
wix.xsd verwendet wird. Weitere Schemadateien wie beispielsweise netfx.xsd oder util.xsd werden
verwendet, falls beim Kompilieren zustzliche Erweiterungs-Bibliotheken bentigt werden. Der
Kompiliervorgang wird gestartet, indem der Compiler candle.exe ber die folgende Befehlszeile
aufgerufen wird und der Befehlszeile die erforderlichen Argumente, wie die Referenz auf das WXSDokument bergeben werden.
candle.exe [-?] [-nologo] [-out Ausgabe] Quelle1.wxs [Quelle2.wxs ...]
Es ist erkennbar, dass mehrere Quelldateien angegeben werden knnen. Es ist hingegen nicht mglich,
mehrere Ausgabedateien zu spezifizieren, so dass grundstzlich auf die Definition einer Ausgabedatei
verzichtet werden sollte. Wird keine Ausgabedatei definiert, verwendet candle.exe den Namen der
Quelldatei und ergnzt diesen um die Dateierweiterung .wixobj. Als Ausgabeoption kann jedoch ein
Persnliche Ausfertigung fr Martin Martinsson
103
Kapitel 2
Windows Installer-XML
Verzeichnis angegeben werden, in das die erzeugten Ausgabedateien abgelegt werden. Der Name des
zu verwendenden Verzeichnisses muss hierzu mit einem Backslash abgeschlossen werden. Der
Kompiliervorgang lsst sich natrlich noch weiter beeinflussen, wozu die in Tabelle 2.25 aufgefhrten
Schalter verwendet werden knnen.
Schalter
Beschreibung
-arch
Festlegen der Architektur. Mgliche Werte sind x86, intel, x64, intel64 oder ia64.
Der Standardwert ist x86. Dieser Schalter wird nur bercksichtigt, wenn die
Architektur nicht im WXS-Dokument definiert wurde.
-d<name>[=<Wert>]
-ext
-I<Ordner>
-nologo
-pedantic
-sfdvital
Standardmig werden alle Dateien als Vital gekennzeichnet, wenn dieses Attribut
im Dokument nicht explizit gesetzt wurde. Durch diesen Schalter erfolgt diese
automatische Kennzeichnung nicht.
-ss
-sw[N]
-trace
Bei Fehlern, Warnungen und zustzlichen Informationen wird die exakte Position
der Problemquelle im WXS-Dokument ausgegeben.
-v
-wx[N]
Nachdem der Kompiliervorgang erfolgreich abgeschlossen wurde, kann aus den erstellten
Objektdateien schlielich die Windows Installer-Datei erzeugt werden, wozu der Linker light.exe
verwendet werden kann. Es besteht auch die Mglichkeit der Erzeugung einer Windows InstallerXML Bibliothek, wozu das Tool lit.exe zu verwenden ist.
Light.exe
Beim Linken werden die Inhalte einer oder mehrerer Objektdateien (.wixobj) ausgewertet, mit den
Metainformationen externer Dateien kombiniert und in die Windows Installer-Datei bertragen.
Weiterhin werden whrend dieses Vorgangs die Kabinettdateien erstellt und diese und weitere
104
Windows Installer-XML
Kapitel 2
Ressourcen wie beispielsweise die Bitmaps zur Darstellung der Benutzeroberflche in die Windows
Installer-Datei integriert. Das Zusammenfhren der Dateien und das Schreiben der notwendigen
Informationen wird durch einen Linker realisiert, der in Windows Installer-XML die Bezeichnung
light.exe trgt. Der Linker kann ber die folgende Befehlszeile aufgerufen werden:
light.exe [-?] [-b Pfad] [-nologo] [-out Ausgabe] Objekt1 [Objekt2 ...]
Nach dem Erstellen einer Ausgabedatei im Format eines Windows Installer-Paketes und eines
Windows Installer-Mergemoduls wird automatisch eine vollstndige ICE-Validierung durchgefhrt.
Fehler bei dieser Validierung verhindern die Erstellung der Datei, so dass hierdurch ein Maximum an
Stabilitt des Installationspaketes erreicht wird. Diese Standardvorgabe kann jedoch beeinflusst
werden, wie auch eine groe Anzahl weiterer Erstellungsoptionen. Die mglichen Einstellungen sind
in Tabelle 2.26 aufgefhrt.
Schalter
Beschreibung
-ai
Die Verwendung identischer Zeilen ist mglich. Die Zeilen werden als Warnung
ausgegeben.
-b <Pfad>
-bcgg
-bf
Dateien werden in das WIXOUT-Dokument bertragen. Dieser Schalter ist nur gltig,
falls -xo ebenfalls gesetzt wurde.
-cc <Pfad>
-ct <N>
Legt die Anzahl der Threads fest, die beim Erstellen der Kabinettdateien verwendet
werden sollen. Standardmig wird hierzu die Umgebungsvariable
%NUMBER_OF_PROCESSORS% herangezogen.
-cub <Datei.cub>
cultures:<Kulturen>
-d<name>=<Wert>
-dcl:level
-dut
-ext
-fv
-ice:<ICE>
-loc <loc.wxl>
105
Kapitel 2
Windows Installer-XML
werden.
-nologo
-notidy
Die temporren Dateien werden nicht gelscht. Diese Option ist beim Debugging
hilfreich.
-o[ut]
-pdbout
<output.wixpdb>
-pedantic
Wie beim Kompilieren, findet hierdurch eine genauere Prfung der Quelldateien statt.
-reusecab
Kabinettdateien werden nicht neu erzeugt, sondern aus dem Cache verwendet.
-sa
-sacl
-sadmin
-sadv
-sf
-sh
-sice:<ICE>
-sma
-spdb
-ss
-sui
-sv
-sval
Es wird kein ICE-Validierung bei Windows Installer-Paketen und Windows InstallerMergemodulen durchgefhrt.
-sw[N]
-v
-wx[N]
-xo
Nach dem Linken ist der Erstellungsprozess abgeschlossen und es wurde die entsprechende Windows
Installer-Datei erzeugt. Wie bereits angedeutet wird standardmig eine Validierung durchgefhrt, die
jedoch auch deaktiviert werden kann. Dennoch sollte immer der Grundsatz gelten, eine Datei ohne
106
Windows Installer-XML
Kapitel 2
Validierung niemals auszuliefern, so dass die Validierung nachgeholt werden muss. Hierzu knnen
natrlich die Tools des Windows Installer-SDK verwendet werden, aber in der Toolsammlung von
Windows Installer-XML ist smoke.exe fr diese Zwecke enthalten.
Smoke.exe
Die Validierung eines Installationspaketes stellt sicher, dass dieses Paket den definierten
Implementierungsregeln entspricht, dass die interne Konsistenz der Datenbank gewhrleistet ist und
dass keine fehlerhaften Daten vorhanden sind. Durch die Tools des Windows Installer-SDK ist es
mglich unterschiedliche Prfmethoden auszufhren, von denen die Prfung der internen
Datenbankkonsistenz durch so genannte Internal Consistency Evaluators (ICE) die komplexeste und
effektivste Mglichkeit darstellt. Die Grundlage dieser berprfung bilden benutzerdefinierte
Aktionen, die in einer zweckoptimierten Windows Installer-Datenbank mit der Dateiendung .cub
abgelegt sind. Eine solche ICE-Validierung kann mit sehr vielen Tools durchgefhrt werden, von
denen smoke.exe durch den folgenden Befehlszeilenaufruf zu verwenden ist.
smoke.exe [-?] Datenbankdatei [Datenbankdatei ...]
Anhand der Aufrufsyntax ist erkennbar, dass mehrere Datenbankdateien angegeben werden knnen,
wodurch sich smoke.exe hervorragend im Rahmen einer Batchverarbeitung verwenden lsst. Mit
smoke.exe knnen Windows Installer-Pakete (.msi) und Windows Installer-Mergemodule (.msm)
validiert werden. Die Einstelloptionen fr die Validierung zeigt Tabelle 2.27.
Schalter
Beschreibung
-cub <Datei.cub>
-ext
-ice:<ICE>
-nodefault
-nologo
-notidy
Die temporren Dateien werden nicht gelscht. Diese Option ist beim Debugging
hilfreich.
-pdb
-sice:<ICE>
-sw[N]
-v
-wx[N]
Durch die Validierung wird sichergestellt, dass das Installationspaket den formalen Vorgaben und
Richtlinien entspricht. Selbstverstndlich ist die Fehleranflligkeit eines solchen Installationspaketes
107
Kapitel 2
Windows Installer-XML
reduziert, aber ein Freibrief fr eine fehlerfreie Installation ist die Validierung natrlich nicht.
Lit.exe
Wie schon angedeutet besteht auch die Mglichkeit, aus den Objektdateien eine Windows InstallerXML Bibliothek zu erzeugen, indem lit.exe verwendet wird. Hierbei handelt es sich um einen
zustzlichen Optimierungsfaktor von Windows Installer-XML, der hervorragend in Verbindung mit
Fragmenten verwendet werden kann. Es ist mglich, diese in eine Windows Installer-XML Bibliothek
(.wixlib) zu bersetzen, so dass diese vorkompilierte Bibliothek auch fr andere Installationsprojekte
verwendet werden kann. Der Vorteil liegt hierbei in Wiederverwendbarkeit, der Reduzierung der
Fehleranflligkeit und der hheren Geschwindigkeit im Buildprozess. Die Fehleranflligkeit wird
reduziert, da der Quellcode nur einmalig verwaltet werden muss, wodurch Inkonsistenzen vermieden
werden. Die Performance im Buildprozess wird erhht, da die Bibliothek bereits vorkompiliert ist und
somit nur whrend des Linkens bentigt wird. Eine solche Bibliothek liegt dennoch im Textformat vor,
so dass die effiziente Nutzung durch Quellcodesysteme unproblematisch ist. Zur Erstellung einer
solchen Bibliothek, sind die folgenden Befehlszeilen zu verwenden:
candle.exe WiXLibrary.wxs -out
lit.exe -out WiXLibrary.wixlib WiXLibrary.wixobj
Zur Verwendung dieser Bibliothek aus dem Hauptprojekt heraus, muss ein entsprechender Verweis
dem Aufruf des Linkers beim Erzeugen der Windows Installer-Datei angefgt werden:
candle.exe Product.wxs
light.exe -out Product.msi Product.wixobj WiXLibrary.wixlib
Anhand der folgenden Syntax zum Aufruf von lit.exe wird deutlich, dass mehrere Objektdateien als
Quellen angegeben werden knnen, die dann zu einer Bibliothek kombiniert werden.
lit.exe [-?] [-nologo] [-out libraryFile] objectFile [objectFile ...]
Diese Anwendung ist vom Prinzip mit dem Linker vergleichbar, wodurch auch hnlichkeiten bei den
Einstelloptionen vorhanden sind. Die in Tabelle 2.28 aufgefhrten Schalter, ermglichen eine
individuelle Anpassung des Erstellungsvorgangs.
Schalter
Beschreibung
-b <Pfad>
-bf
108
Windows Installer-XML
Kapitel 2
-ext
-loc <loc.wxl>
-nologo
-o[ut]
-pedantic
Wie beim Linken erfolgt hierdurch eine genauere Prfung der Quelldateien.
-ss
-sv
-sw[N]
-v
-wx[N]
Zur Erstellung von Windows Installer-XML Bibliotheken ist nicht ausschlielich das
Kommandozeilentool lit.exe erforderlich; es ist auch mglich diese direkt mit Visual Studio zu
erzeugen. Hierzu ist die Projektvorlage WiX Library Project zu verwenden.
Erweiterte Erstellvorgnge
Im ersten Schritt wurden die Quelldateien erzeugt, die dann im zweiten Schritt kompiliert und in
entsprechende Windows Installer-Dateien berfhrt wurden. Der Linker ermglichte hierbei die
Erstellung von Windows Installer-Paketen (.msi) und Windows Installer-Mergemodulen (.msm), er
enthlt jedoch keine direkte Option zur Erstellung von Windows Installer-Patches (.msp) und
Windows Installer-Transformationen (.mst). Dieses ist auch nicht verwunderlich, denn die Erstellung
dieser Dateitypen ist abweichend zu betrachten, was auch damit zu tun, dass es sich hierbei um
Differenzdateien handelt. Ein Windows Installer-Patch ist die Differenz zweier oder mehrerer
Windows Installer-Pakete und eine Windows Installer-Transformation, die Differenz zweier Windows
Installer-Datenbanken.
Torch.exe
An dieser Stelle ein kurzes Wort zum Erstellen von Transformation. Um mit den Bordmitteln des
Windows Installer-SDK eine Transformation zu erzeugen, sind immer zwei Installationspakete
erforderlich. Ein Haupteinsatzgebiet von Transformationen liegt in der Bereitstellung des
Installationspaketes in unterschiedliche Sprachen. Das bedeutet, dass zunchst ein neutrales
Installationspaket bentigt wird und eines mit den lokalisierten Texten. Eine Transformation zwischen
diesen Paketen wrde letztlich die sprachspezifischen Zeichenfolgen enthalten. Kommen jedoch
mehrere Sprachen zum Einsatz, so erhht sich zwangslufig auch der Aufwand beim Erstellen der
Installationspakete, denn fr jede untersttze Sprache wird ein solches bentigt. Strend erscheint
hierbei, dass die Installationspakete, mit Ausnahme des Originals, nach dem Erstellen der
Transformation nicht mehr bentigt werden.
109
Kapitel 2
Windows Installer-XML
Um solche Szenarien effektiver umzusetzen enthlt die Toolsammlung Windows Installer-XML die
Anwendung torch.exe. Die Einsatzszenarien dieses Tools sind sehr vielseitig. So ist es hiermit
natrlich mglich, eine Transformation zwischen zwei Installationspaketen zu erstellen, also analog zu
den Tools des Windows Installer-SDK. Allerdings kann torch.exe so konfiguriert werden, dass keine
Windows Installer-Transformation (.mst) erzeugt wird, sondern die XML-Reprsentation einer
Transformation. Eine solche Datei kann jederzeit mit dem Linker light.exe in eine echte Windows
Installer-Transformation umgewandelt werden. Der Vorteil ist offensichtlich, denn die XML-Datei
kann problemlos verndert werden, so dass neue Transformationen erstellt werden knnen, ohne
zunchst korrigierte Installationspakete erzeugen zu mssen.
Zum besseren Verstndnis mchte ich ein Beispiel anfhren. Es existieren zwei WXS-Dokumente vom
Typ Product mit denen zwei Installationspakete erzeugt werden knnen. Diese Dokumente sind
bezeichnet mit product1.wxs und product2.wxs. Die Unterscheidung beider Installationspakete liegt
lediglich in einer Zeichenfolge der Tabelle LaunchCondition. So wird lediglich darauf hingewiesen,
dass zur Installation das .NET Framework erforderlich ist. Bei product1.wxs wird diese Meldung in
englischer und bei product2.wxs in deutscher Sprache ausgegeben. Mit den bekannten Mglichkeiten
des Compilers und des Linker werden hieraus nun die Installationspakete product1.wxs und
product2.wxs erzeugt. Im nchsten Schritt geht es nun darum, die Transformation zu erzeugen. Der
klassische Ansatz wrde hierzu msitran.exe aus dem Windows Installer-SDK verwenden. Dieses ist
auch mit torch.exe durch den folgenden Befehlszeilenaufruf mglich:
torch.exe product1.msi product2.msi -out diff.mst
Hierdurch wird eine Transformation klassischer Art erzeugt. Aber torch.exe kann an dieser Stelle
weitaus mehr. Durch den folgenden Aufruf wird die XML-Reprsentation einer Transformation
erzeugt.
torch.exe product1.msi product2.msi -xo -out diff.wixout
Bei dieser in Listing 2.16 dargestellten XML-Reprsentation handelt es sich um ein WIXOUTDokument, dass jederzeit vom Linker in eine Windows Installer-Datei umgewandelt werden kann.
Aber hier liegt nun die Differenz der Dateien in einem Textformat vor, so dass auch manuelle
nderungen vorgenommen werden knnen, die letztlich als Basis fr eine neue Transformation
dienen. Hierdurch ist es nicht mehr erforderlich, zur Erzeugung von Transformationen zunchst neue
Installationspakete zu erzeugen.
<?xml version="1.0" encoding="utf-8"?>
<wixOutput type="Transform" codepage="1252" version="3.0.2002.0"
xmlns="http://schemas.microsoft.com/wix/2006/outputs">
<tableDefinitions xmlns="http://schemas.microsoft.com/wix/2006/tables">
<tableDefinition name="LaunchCondition">
<columnDefinition name="Condition" type="string" length="255" primaryKey="yes" localizable="yes"
category="condition" description="Expression which must evaluate to TRUE in
order for install to commence." />
<columnDefinition name="Description" type="localized" length="255" category="formatted"
description="Localizable text to display when condition fails and install must abort."
escapeIdtCharacters="yes" />
</tableDefinition>
110
Windows Installer-XML
Kapitel 2
</tableDefinitions>
<table name="LaunchCondition" xmlns="http://schemas.microsoft.com/wix/2006/objects">
<row op="modify" sectionId="/" sourceLineNumber="D:\Torch\Product2.msi">
<field>MsiNetAssemblySupport</field>
<field modified="yes">Das Microsoft .NET Framework ist zur Ausfhrung erforderlich.</field>
</row>
</table>
</wixOutput>
Aber es geht noch weiter. Im Prinzip ist es ja ausreichend, lediglich fr die sprachneutrale Variante ein
Installationspaket zu erzeugen. Bei allen weiteren sprachspezifischen Dokumenten ist dieses nicht
mehr erforderlich, da sie nicht eigenstndig installiert werden, sondern nur als Transformation
verwendet werden. Durch den folgenden Befehlszeilenaufruf, wird eine Windows InstallerTransformation zwischen zwei XML-Dateien erzeugt, wobei diese als WIXOUT- oder WIXPDBDokument vorliegen mssen. Der anschlieende Aufruf des Linkers erzeugt eine Transformation
klassischer Art.
torch.exe product1.wixpdb product2.wixpdb -xi -out diff.wixout
light.exe diff.wixout -out diff.mst
Die bereits in den Beispielen dargestellte Aufrufsyntax von torch.exe gestaltet sich wie folgt:
torch.exe [-?] [Optionen] Zieldatei Aktualisierungsdatei -out Ausgabe
Auch hier gibt es wieder einige Einstelloptionen, die in den Beispielen bereits angesprochen wurden.
So ist es mglich, das Ausgabeformat der Transformation zu bestimmen und natrlich knnen auch
Validierungsbedingungen und Optionen zur Fehlerbehandlung definiert werden, wie Tabelle 2.29
zeigt.
Schalter
Beschreibung
-a
-ax
-ext
-nologo
-notidy
Die temporren Dateien werden nicht gelscht. Diese Option ist beim Debugging
hilfreich.
-p
Der XML-Ausgabedatei werden nicht nur die Differenzen angefgt, sondern auch nicht
vernderte Informationen.
-serr <L>
-sw[N]
111
Kapitel 2
Windows Installer-XML
-t <Typ>
Ermglicht die automatische Zuordnung von Validierungsbedingungen, die vom Typ der
Transformation abhngig sind. Mgliche Typen sind language, instance, patch.
-v
-val <L>
-wx[N]
Es werden alle oder nur bestimmte Warnungen als Fehler interpretiert (Beispiel: -wx1011
wx1012)
-x <Pfad>
-xi
Anstelle einer Windows Installer-Datei werden XML-Dateien (.wixout oder .wixpdb) als
Eingabe verwendet.
-xo
Wie bereits angesprochen enthlt eine Transformation die Differenz zweier Windows InstallerDatenbanken. Das bedeutet, dass nderungen am Summary Information Stream oder den anderen
Datenspeichern eines Paketes nicht in die Transformation einflieen. Anders ist es bei einem Patch.
Dieser enthlt die Unterschiede zweier oder mehrerer Installationspakete. Windows Installer-XML
enthlt das Tool pyro.exe zum Erzeugen von Windows Installer-Patches.
Pyro.exe
Beim Patching handelt es sich um eine alternative Technologie, ein Produkt in einen neuen
Installationsstatus zu berfhren. Die Produktaktualisierung erfolgt hierbei durch die Anwendung
eines Windows Installer-Patches auf ein bereits installiertes Produkt. Bei einem Windows InstallerPatch handelt es sich um eine Datei mit der Endung .msp, die lediglich die Differenz der
Installationspakete enthlt. Zur Erstellung von Windows Installer-Patches werden die
Installationspakete der bisherigen- und der neuen Produktversion bentigt. Hierbei ist es erforderlich,
dass die enthaltenen Ressourcen in einem dekomprimierten Zustand vorliegen, wie das bei einer
administrativen Installation der Fall ist. Im Weiteren ist ein Tool oder eine Implementierung
erforderlich, um die Differenz der Installationspakete zu ermitteln und daraus einen Windows InstallerPatch zu generieren. Das Windows Installer-SDK enthlt zu diesem Zweck das Befehlszeilentool
msimsp.exe, dass intern die Bibliothek patchwiz.dll aufruft. Zum Erzeugen eines Patches wird darber
hinaus eine Steuerdatei bentigt, in der die Verweise auf die Installationspakete und weitere
Einstellungen enthalten sind. Bei der Steuerdatei handelt es sich um ein speziell fr diese Zwecke
strukturiertes Windows Installer-Paket, das als Patch Creation Property File bezeichnet wird und ber
die Dateiendung .pcp verfgt.
Die gerade dargestellte Mglichkeit zur Erzeugung von Patches ist sehr effektiv, falls hiermit sehr
umfangreiche Modifikationen an der installierten Softwarelsung durchgefhrt werden. Sollen jedoch
nur wenige Modifikationen durchgefhrt werden, wie das bei einem Hotfix oder Security Fix der Fall
wre, ist diese Methode ineffizient. Es gilt zu beachten, dass bei dieser Vorgehensweise immer die
administrativen Abbilder der alten und der neuen Softwareversion erstellt werden mssen. Zustzlich
muss patchwiz.dll alle verwendeten Ressourcen analysieren, um festzustellen, welche Ressourcen
modifiziert wurden, damit diese in den Patch integriert werden. Die Dauer dieses Vorgangs ist
zwangslufig von der Anzahl der Ressourcen abhngig, die sich in den Windows Installer-Paketen
112
Windows Installer-XML
Kapitel 2
befinden. Eine genaue Beschreibung der Vorgehensweise beim Erzeugen eines Patches zeigt Kapitel
10.
Windows Installer-XML enthlt eine neue Implementierung zur Erstellung von Patches, bei der keine
zustzlichen Bibliotheken verwendet werden. Ein Vorteil ist hierbei, dass in dem entsprechenden
XML-Dokument direkt definiert wird, welche Windows Installer-Komponente verndert wurde,
wodurch der Analysevorgang der patchwiz.dll berflssig wird. Weiterhin bentigt die neue
Implementierung von Windows Installer-XML keine administrativen Abbilder mehr, sondern greift
direkt auf generierte XML-Dateien zu. Ein weiterer Pluspunkt ist eine exaktere Adressierung der zu
aktualisierenden Ressourcen. Mit der konventionellen Methode ist es nur mglich einen Patch zu
erzeugen, der alle nderungen zwischen den Installationspaketen beinhaltet. Mitunter kann es jedoch
angebracht sein, die Modifikationen auf mehrere Patches aufzuteilen, was mit der neuen Methode von
Windows Installer-XML mglich ist.
Die Verwendung der nativen Patching-Funktionalitt von Windows Installer-XML ist recht einfach.
Beim Linken des Installationspaketes ist zunchst ein WIXOUT-Dokument zu erzeugen. Hierbei
handelt es sich um eine Datei, die eine XML-Reprsentation der Daten, der Referenzen auf die
Ressourcen, sowie binre Informationen enthlt. Im ersten Schritt muss das Tool torch.exe verwendet
werden, um eine WIX-Transformation zwischen den WIXOUT-Dateien des alten und des neuen
Paketes zu erzeugen. Das Ergebnis ist eine Datei, die alle Differenzen zwischen den Paketen im XMLFormat, sowie die binren Ressourcen enthlt. Diese Datei wird zuknftig als Basis fr die Erstellung
der Patches fungieren.
Wie auch bei der Erluterung der Transformationen sollen zwei Installationspakete dienen, die im
WXS-Format vorliegen. Beide Dateien installieren eine identische Anwendung, allerdings sind
unterschiedliche Versionen der Ressourcen enthalten. Die relevanten Abschnitte des Dokumentes zeigt
Listing 2.17.
<!-- Icons fr Shortcuts -->
<Icon Id="I__Colors.exe" SourceFile=".\$(var.Version)\Colors.ico" />
<!-- Ordner, Komponenten und Ressourcen -->
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="ProgramFilesFolder">
<Directory Id="INSTALLLOCATION" Name="Colors">
<Component Id="C__Colors.exe" Guid="1ACC3C89-9E07-418a-B4DD-9D1DA89C3E4F">
<!--Datei-->
<File Id="F__Colors.exe" Source=".\$(var.Version)\" Name="Colors.exe" KeyPath="yes" DiskId="1" />
<!--Shortcut-->
<Shortcut Id="S__Colors.exe" Directory="DesktopFolder" Name="Colors 1.0" Target="Application"
Hotkey="0" Icon="I__Colors.exe" IconIndex="0" Show="normal" />
</Component>
</Directory>
</Directory>
<Directory Id="DesktopFolder" />
</Directory>
Listing 2.17: Auszug aus einem Dokument zum Erzeugen von Installationspaketen
Es wird deutlich, dass hier Variablen verwendet werden, um den Pfad zu den Quelldateien zu
definieren. Beim Erstellen des Paketes werden den Variablen unterschiedliche Werte zugewiesen,
wodurch unterschiedliche Dateiversionen in die Pakete integriert werden. Letztlich beziehen sich die
nderungen auf die Datei colors.exe und die Symboldatei colors.ico. Der Erstellvorgang wird auf den
bekannten Wegen gestartet.
Persnliche Ausfertigung fr Martin Martinsson
113
Kapitel 2
Windows Installer-XML
114
Windows Installer-XML
Kapitel 2
verwunderlich, dass diese Automatik auch von Windows Installer-XML genutzt werden kann. Hierzu
ist dem Element <PatchFamily/> keine Referenz anzufgen.
Interessant ist auch das Element <Media/>. Hier muss zunchst eine Sequenznummer definiert
werden. Diese Sequenznummer ist der Ausgangswert, der beim Hinzufgen von Dateien zur Tabelle
File verwendet wird. Sie haben beispielsweise ein Installationspaket, in dem 110 Dateien in der
Tabelle File definiert wurden. Somit verfgen diese Dateien normalerweise ber die Sequenznummern
1 bis 110. Wird nun durch einen Patch der Anwendung eine neue Datei hinzugefgt, wird diese Datei
temporr der Tabelle File angefgt. Hier muss natrlich die Sequenznummer beachtet werden. Der
nchste freie Wert wre 111, der dann als Id dem Element <Media/> hinzuzufgen ist. Hier kann
natrlich auch ein hherer Wert verwendet werden, um flexibel auf komplexe Szenarien reagieren zu
knnen. Wird als Id ein Wert verwendet, der bereits im Installationspaket vorhanden ist, wie
beispielsweise 1, wird automatisch der nchste freie Wert verwendet. An dieser Stelle wird auch die
Kabinettdatei zur Aufnahme der Ressourcen bestimmt, da diese ja auch ber die Sequenznummer
zugeordnet wird. Weiterhin ist als Unterelement hier <PatchBaseline/> zu finden, dass ber ein
Identifizierungsmerkmal verfgt. Hiermit knnen unterschiedliche Validierungsbedingungen und
Fehlerbehandlungsmethoden festgelegt werden. Es ist mglich mehrere Elemente vom Typ
<PatchBaseline/> zu definieren, um hierdurch flexibel auf unterschiedliche Anwendungsszenarien zu
reagieren. Erst beim Erstellen des Patches, wird ber die Befehlszeile letztlich die anzuwendende Id
angegeben.
<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Patch AllowRemoval="yes" Classification="Hotfix" Codepage="1252"
Description="Dieser Patch aktualisiert das Produkt Colors 1.0."
DisplayName="QFE1" Id ="*" OptimizedInstallMode="yes" Manufacturer="Microsoft Deutschland GmbH"
MoreInfoURL ="http://www.microsoft.com/germany" >
<!--Media-->
<Media Id="1" Cabinet="RTM.cab">
<PatchBaseline Id="RTM">
<Validate IgnoreAddExistingRow="yes" IgnoreAddExistingTable ="yes" ProductId ="yes"
ProductVersion ="Update" ProductVersionOperator ="LesserOrEqual"/>
</PatchBaseline>
</Media>
<!-- PatchSequence -->
<PatchFamily Id="RM" Version ="1.0.0.100" Supersede="no">
<IconRef Id="I__Colors.exe"/>
<ComponentRef Id="C__Colors.exe"/>
</PatchFamily>
<!-- Eigenschaften -->
<PatchProperty Name="MinimumRequiredMsiVersion" Value="300"/>
<PatchProperty Name="TrustMSI" Value="1"/>
<PatchProperty Name="AllowLaxValidateFlags" Value ="0"/>
<!--Optimierung von benutzerdefinierten Aktionen-->
<OptimizeCustomActions SkipAssignment="yes" SkipDeferred="yes" SkipImmediate="yes" />
</Patch>
</Wix>
115
Kapitel 2
Windows Installer-XML
Aus diesem Dokument muss nun eine XML-Reprsentation des Patches erzeugt werden, indem der
Compiler und der Linker nach dem folgenden Schema verwendet werden.
candle.exe qfe1.wxs
light.exe qfe1.wixobj -out qfe1.wixmsp
Zum jetzigen Zeitpunkt sind alle Vorbereitungen abgeschlossen und die erforderlichen Dateien
qfe1.wixmsp und qfe1.wixmst liegen vor. Nun kommt pyro.exe ins Spiel und kann es kann der
Windows Installer-Patch qfe1.msp durch den folgenden Befehl erzeugt werden:
pyro.exe qfe1.wixmsp -out qfe1.msp" -t RTM qfe1.wixmst
Die dargestellte Befehlszeile sieht etwas ungewhnlich aus, was mit der Baseline zu tun hat, die durch
den Parameter -t angegeben wurde, wie die nachfolgende Syntax zeigt.
pyro.exe [-?] Eingabedatei -out Ausgabedatei [-t baseline Transformation]
Der Buildprozess zur Erzeugung des Patches kann natrlich weiter beeinflusst werden. So ist es auch
mglich festzulegen ob ein vollstndiger Patch (Full-File-Patch) oder ein Binr-Patch (Byte-LevelPatch) erzeugt werden soll. Die mglichen Einstelloptionen zeigt Tabelle 2.30.
Schalter
Beschreibung
-cc <Pfad>
-delta
-ext
-nologo
-notidy
Die temporren Dateien werden nicht gelscht. Diese Option ist beim Debugging
hilfreich.
-o[ut]
-pdbout
<output.wixpdb>
-reusecab
Kabinettdateien werden nicht neu erzeugt, sondern aus dem Cache verwendet.
-sa
-sf
-sh
116
Windows Installer-XML
Kapitel 2
-spdb
-sw[N]
-t Baseline
-v
-wx[N]
Bevor jedoch die technische Erstellung eines Patches durchgefhrt wird, gilt es einige
Vorberlegungen anzustellen und bestimmte Vorgaben zu bercksichtigen. Im letzten Kapitel dieses
Buches geht es im Wesentlichen um Erweiterungen in Patching-Szenarien durch den Windows
Installer 4.5. Hier finden sich aber auch allgemeine Informationen zur generellen Verwendung und
Anwendung von Patches.
Erweiterungsbibliotheken
Windows Installer-XML verfgt ber einen erstaunlichen Funktionsvorrat. Wie das aber bei jeder
Technologie der Fall ist, reicht auch die komplexeste Anwendung nicht aus, allen Anforderungen
gerecht zu werden. Aus diesem Grund kann der Funktionsvorrat von Windows Installer-XML durch
individuelle Implementierungen erweitert weitern. Hiermit sind zunchst Erweiterungen gemeint, die
sich mit den Tools verwenden lassen, die im vorherigen Abschnitt erlutert wurde.
product.wixobj
-ext
Sollen mehrere Erweiterungsbibliotheken verwendet werden, ist der Parameter -ext mehrfach zu
verwenden. Die in dem Beispiel verwendete benutzerdefinierte Umgebungsvariable %MSIWIX%
verweist auf den Ordner %ProgramFiles%\Windows Installer XML v3\bin, in dem auch die
referenzierte Bibliothek zu finden ist. Bei der Verwendung von Visual Studio mssen die zu
verwendenden Erweiterungsbibliotheken ebenfalls angegeben werden. Hierzu ist der Dialog zum
Hinzufgen von Referenzen zu verwenden, wie Abbildung 2.20 zeigt.
117
Kapitel 2
Windows Installer-XML
Erweiterungsbibliotheken knnen nicht nur in Verbindung mit dem Linker verwendet werden; die
Nutzung ist auch mit anderen Tools mglich. Windows Installer-XML kennt und untersttzt die
folgenden Erweiterungsarten:
Prprozessor: Eine solche Erweiterung ermglicht die Modifikation der Quelldateien, bevor sie
vom Compiler verwendet werden.
Compiler: Hierdurch wird es mglich, die Quelldatei in eine interne Reprsentation zu berfhren,
bevor die binre Ausgabe erfolgt.
Binder: Ermglicht die Modifikation des Verhaltens whrend des Bindens.
Decompiler: Ein solche Erweiterung kann verwendet werden um benutzerdefinierten Tabellen ins
XML-Format zu bersetzen.
Validator: Standardmig werden Ausgaben bei der Validierung im Konsolenfenster ausgegeben.
Durch die Erweiterung kann die Ausgabe umgeleitet werden.
Harvester: Das Verhalten des Harvesters (heat.exe) kann hiermit verndert werden.
Unbinder: Ermglicht die Modifikation des Verhaltens whrend des Un-Bindens.
Es ist erkennbar, dass viele Mglichkeiten existieren eine Erweiterungsbibliothek zu platzieren. Ich
mchte in einem kurzen Beispiel die Entwicklung einer Erweiterung fr den Decompiler erlutern.
118
Windows Installer-XML
Kapitel 2
Individuelle Erweiterungsbibliothek
Die Zielsetzung dieser individuellen Erweiterungsbibliothek soll darin liegen, eine Dokumentation der
Tabellenstruktur eines Installationspaketes zu erstellen. Zunchst ist in Visual Studio ein Projekt vom
Typ Klassenbibliothek zu erzeugen. Diesem ist eine Referenz auf die Datei wix.dll anzufgen. Da
eine Erweiterung fr den Decompiler erstellt werden soll, wird eine Klasse bentigt, die von
Microsoft.Tools.WindowsInstallerXml.DecompilerExtension abgeleitet ist, wie dieses in Listing 2.19
aufgezeigt wird.
/// <summary>
/// Decompiler zur Ausgabe der Tabelleninformationen
/// </summary>
public class CustomDecompiler : DecompilerExtension
{
public override void InitializeDecompile(TableCollection tables)
{
// Temporre Datei erstellen und ffnen
string fileName = Path.GetTempFileName();
using (StreamWriter sw = new StreamWriter(fileName))
{
// Iteration durch alle Tabellen
foreach (Table table in tables)
{
// Name der Tabelle, Anzahl der Datenstze und Definition ausgeben
sw.WriteLine(table.Name);
sw.WriteLine("Rows: " + table.Rows.Count.ToString());
sw.WriteLine(table.Definition.ToIdtDefinition(false));
}
}
// Funktion in der Basisklasse aufrufen
base.InitializeDecompile(tables);
}
}
Die Basisklasse stellt diverse Methoden zur Verfgung, die berschrieben werden knnen. Zur
Erstellung der Dokumentation wird die Funktion InitializeDecompile() berschrieben. Dieser Funktion
wird nun der individuelle Code angefgt, der in dem Beispiel natrlich sehr einfach ausfllt. Es wird
zunchst eine temporre Datei erstellt, anschlieend werden der Name und die Struktur der Tabellen
dieser Datei angefgt. Zum Schluss wird noch die Funktion der Basisklasse aufgerufen, damit die
regulre Bearbeitung der Tabellen erfolgen kann.
Im nchsten Schritt muss die tatschliche Erweiterung erstellt werden. Hierbei muss ebenfalls
festgelegt werden, welchen Erweiterungstypen in der Bibliothek enthalten sind. Hierzu wird wiederum
eine Klasse erstellt, die diesmal von Microsoft.Tools.WindowsInstallerXml.WixExtension abgeleitet ist,
wie Listing 2.20 zeigt.
/// <summary>
/// Benutzerdefinierte Erweiterung
/// </summary>
public class CustomExtension : WixExtension
{
public override DecompilerExtension DecompilerExtension
119
Kapitel 2
Windows Installer-XML
{
get
{
// Instanz der Erweiterung fr den Decompiler erstellen
if (this.decompilerExtension == null)
this.decompilerExtension = new CustomDecompiler();
return this.decompilerExtension;
}
}
private CustomDecompiler decompilerExtension;
}
Wiederum stellt die Basisklasse diverse Methoden und Eigenschaften zur Verfgung, die
berschrieben werden knnen. Hierbei finden sich Eigenschaften fr die einzelnen Erweiterungstypen
wie BinderExtension, PreprocessorExtension oder die fr diese Zwecke relevante
DecompilerExtension. Es ist erkennbar, dass in der Implementierung eine Instanz der Klasse
CustomDecompiler() erzeugt und zurckgegeben wird. Im Prinzip ist es das gewesen, mehr
Programmcode ist nicht erforderlich um eine einfache Erweiterungsbibliothek zu erzeugen. Eine kleine
Sache fehlt allerdings noch. Die erstellte Bibliothek muss noch als Erweiterungsbibliothek fr
Windows Installer-XML gekennzeichnet werden. Hierzu ist es erforderlich, dass Assembly mit dem
Attribut AssemblyDefaultWixExtension() zu versehen, wie die folgende Programmzeile zeigt:
[assembly: AssemblyDefaultWixExtension(typeof(CustomExtension))]
Anschlieend kann das Projekt kompiliert und verwendet werden. Hierzu muss die
Erweiterungsbibliothek dem Aufruf des Decompilers angefgt werden. Im Rahmen der
Dekompilierung wird eine temporre Datei erzeugt, der die Tabellendefinition angefgt werden.
dark.exe product.msi -ext "%MSIWIX%\WixCustomExtension.dll"
Dieses einfache Beispiel sollte den grundlegenden Aufbau einer Erweiterungsbibliothek skizzieren und
Denkanste fr individuelle Implementierungen geben. Die sich hierdurch bietenden Mglichkeiten
sind nahezu grenzenlos und laden frmlich dazu ein, mal wieder einige Programmzeilen zu schreiben.
Windows Installer-XML
Kapitel 2
product.wixobj
-cultures:de-DE
-ext
Bevor der Buildprozess gestartet werden kann, ist dem WXS-Dokument allerdings eine Referenz auf
die zu verwendende Benutzeroberflche zuzufgen. Hierzu ist dem Element <UIRef/> der Name der
Benutzeroberflche zuzuordnen. Windows Installer-XML stellt unterschiedliche Benutzeroberflchen
zur Verfgung, die in Tabelle 2.31 zusammengefasst werden.
Name
Beschreibung
WixUI_Mondo
WixUI_FeatureTree
Eine einfachere Form von WixUI_Mondo. Es wird nach dem Lizenzdialog direkt
zur Auswahl der Features gewechselt.
WixUI_InstallDir
Ermglicht keine Auswahl von Features sondern nur die Festlegung eines
Installationsverzeichnisses.
WixUI_Minimal
WixUI_Advanced
WixUI_ErrorProgressText
121
Kapitel 2
Windows Installer-XML
Die Darstellung der Benutzeroberflchen kann natrlich noch angepasst oder erweitert werden, wozu
entsprechende WIX-Variablen zu verwenden sind. So ist es mglich eine eigene Lizenzdatei
einzubinden, indem diese der Variablen WixUILicenseRtf zugeordnet wird. Zustzlich ist es mglich,
andere grafische Elemente wie Bitmaps und Symboldateien fr die Darstellung festzulegen. Hierfr
sind die Variablen WixUIBannerBmp, WixUIDialogBmp, WixUIExclamationIco, WixUIInfoIco,
WixUINewIco und WixUIUpIco zu verwenden. Standardmig werden die lokalisierten Fehler- und
Aktionstexte den Tabellen Error und ActionText der Windows Installer-Datenbank nicht hinzugefgt.
Um dieses dennoch zu erreichen ist eine zustzliche Referenz auf das Oberflchenelement
WixUI_ErrorProgressText erforderlich, wie dieses auch in dem Auszug eines WXS-Dokumentes in
Listing 2.21 gezeigt wird.
<!-- UI Definition -->
<UIRef Id="WixUI_InstallDir" />
<UIRef Id="WixUI_ErrorProgressText" />
<!--Installationsverzeichnis vernderbar gestalten-->
<Property Id="WIXUI_INSTALLDIR" Value="APPLICATIONFOLDER" />
<!--Individuelle Bitmaps verwenden-->
<WixVariable Id="WixUIBannerBmp" Value=".\Banner.jpg" />
<WixVariable Id="WixUIDialogBmp" Value=".\Dialog.jpg" />
<!--Lizenzbestimmungen festlegen-->
<WixVariable Id="WixUILicenseRtf" Value=".\Eula.rtf"/>
Es besteht natrlich auch die Mglichkeit die vordefinierte Benutzeroberflche um eigene Dialoge zu
erweitern. Sehr viele Informationen dazu sind in der Dokumentation zu finden. Darber hinaus sind
Beispiele auch auf http://www.wixwiki.com/index.php?title=UiExtension vorhanden.
Komplexe Erweiterungsbibliotheken
Alle bisher vorgestellten Erweiterungen kamen ausschlielich whrend der Entwicklung des
Installationspaketes zu Einsatz. Es gibt jedoch auch Erweiterungen, die whrend der Installation
angewendet werden, um Aktivitten durchzufhren, die ber das Grundportfolio des Windows
Installers hinausgehen. Einfach ausgedrckt knnte man diese Form der Erweiterungen mit
benutzerdefinierten Aktionen vergleichen, wenngleich die Erweiterungen wesentlich komplexer sind.
Die Erweiterungen stellen auch individuellen Code zur Verfgung, mit dem zweckorientierte
Aufgaben im Installationsprozess zu verrichten sind. Der Entwickler kommt jedoch mit diesem Code
nicht in Berhrung, sondern referenziert die jeweilige Erweiterung und beschreibt das beabsichtigte
Installationsergebnis im WXS-Dokument. Whrend des Buildprozesses werden diese individuellen
Ergnzungen dann umgesetzt und das finale Produkt um benutzerdefinierte Tabellen erweitert, die von
benutzerdefinierten Aktionen verwendet werden. Der Vorteil liegt auf der Hand. Die Entwicklung von
benutzerdefinierten Aktionen bedeutet einiges an Aufwand. Dieser wird dadurch verursacht, da nicht
nur eine Aktion fr den Installationsfall zu erstellen ist, sondern auch entsprechende Aktionen fr die
Deinstallation und den Fehlerfall. Im Weiteren sind ausfhrliche Tests notwendig, damit eine solche
individuelle Aktion in einen produktiven Status berfhrt werden kann. Das Ganze kombiniert mit
einer eleganten Struktur und einer Trennung zwischen Implementierung und Daten ist ebenfalls nicht
trivial. Betrachtet man das tatschliche Einsatzspektrum von benutzerdefinierten Aktionen, so ist
122
Windows Installer-XML
Kapitel 2
auffallend, dass viele Aktivitten immer wieder kehren, also in unterschiedlichen Installationsszenarien
verwendet werden. Fr viele dieser generischen Anwendungsflle stellt Windows Installer-XML
bereits vorgefertigte Bibliotheken zur Verfgung, die neben dem ausfhrbaren Code auch noch eine
XML-Schemaerweiterung enthalten, so dass Datendefinitionen im XML-Dokument sehr elegant
durchgefhrt werden kann.
123
Kapitel 2
Windows Installer-XML
Damit noch nicht genug; die Anforderungen werden exotischer. Die Installation einer XMLSchemadatei soll im Schema-Verzeichnis von Visual Studio 2008 (standardmig
%ProgramFiles%\Microsoft Visual Studio 9.0\Xml\Schemas) erfolgen. Hieraus folgt, dass zunchst
geprft werden muss, ob Visual Studio 2008 berhaupt installiert ist. Des Weiteren soll die Installation
nur mglich sein, wenn es sich mindestens um die Standard-Edition des Produktes handelt und wenn
das Projektsystem fr Visual C# installiert wurde. Auch hier gilt identisches wie bei dem vorherigen
Beispiel; die Implementierung ist nicht trivial, aber auch hierfr stellt Windows Installer-XML
entsprechende Funktionalitten bereit. Diese befinden sich in der Erweiterungsbibliothek
WixVSExtension.dll. In Listing 2.23 wird die Verwendung der geeigneten Eigenschaften dargestellt;
eine vollstndige Beschreibung der Eigenschaften ist in der Hilfe zu Windows Installer-XML zu
finden. Mit Hilfe dieser Bibliothek ist es auch mglich entsprechende Eigenschaftswerte der
Entwicklungsumgebungen Visual Studio 2003 und Visual Studio 2008 abzurufen, sowie
Konfigurationen an diesen Produkten vorzunehmen.
<?xml version="1.0" encoding="windows-1252"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" >
<!-- Definition des Produktes -->
<Product UpgradeCode="{B201DAC9-1849-4038-8A18-815B17A6DDC2}" Manufacturer="Microsoft Deutschland GmbH"
Language="1031" Version="1.00.0000" Name="WixVSExtension"
Id="{47B5EC24-ADE7-4983-9711-D8253C73877E}" Codepage="1252">
<!-- Paketdefinition -->
<Package Description="WixVSExtension" Manufacturer="Andreas Kerl" InstallerVersion="200"
Platform="x86" Languages="1031" Compressed="yes" SummaryCodepage="1252" />
124
Windows Installer-XML
Kapitel 2
<!--WixVSExtension-Eigenschaften-->
<PropertyRef Id="VS90_SCHEMAS_DIR" />
<PropertyRef Id="VS90DEVENV" />
<PropertyRef Id="VS90_IDE_VCSHARP_PROJECTSYSTEM_INSTALLED" />
<!-- Systemvoraussetzung -->
<Condition Message="Microsoft Visual Studio 2008 ist erforderlich.">VS90DEVENV</Condition>
<Condition Message="Das Visual C# Projektsystem wurde nicht
gefunden.">VS90_IDE_VCSHARP_PROJECTSYSTEM_INSTALLED</Condition>
<!-- Ordner, Komponenten und Ressourcen -->
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="ProgramFilesFolder">
<Directory Id="VS90_SCHEMAS_DIR">
<Component Id="C__Schema" Guid="{26CB42ED-289D-48f7-8772-63526BC04A05}">
<File Id="F__Schema" Source ="..\Source\Dummy.xml" Name="Dummy.xml" KeyPath="yes" DiskId="1" />
</Component>
</Directory>
</Directory>
</Directory>
<!-- Definition der Featurestruktur -->
<Feature Id="Application" Title="Anwendung" Level="1">
<ComponentRef Id="C__Schema" />
</Feature>
<!-- Medien -->
<Media Id="1" EmbedCab="yes" Cabinet="Data.cab" />
<!-- UI Definition -->
<Property Id="WIXUI_INSTALLDIR" Value="VS90_SCHEMAS_DIR" />
<UIRef Id="WixUI_InstallDir" />
<UIRef Id="WixUI_ErrorProgressText" />
</Product>
</Wix>
Eine Vielzahl der heutigen Anwendungen basieren auf dem .NET Framework, wodurch die Existenz
sichergestellt werden muss. Geht es lediglich darum festzustellen, ob diese Laufzeitumgebung
vorhanden ist, gengt die Verwendung der Windows Installer-Eigenschaft MsiNetAssemblySupport.
Diese Eigenschaft enthlt die Versionsnummer des installierten Frameworks, so dass auch hierdurch
weiter gehende Prfungen erfolgen knnen. Vielfach besteht jedoch die Anforderung die Existenz
einer bestimmten Version des .NET Frameworks zu prfen und gleichzeitig festzustellen ob ein
entsprechender Service Pack und ein Sprachpaket vorhanden sind. Diese Anforderungen bersteigen
den Standardvorrat des Windows Installers, so dass wieder individuelle Mechanismen zu verwenden
sind. Auch an dieser Stelle hilft Windows Installer-XML weiter, denn durch die
Erweiterungsbibliothek NetFxExtension.dll werden solche Funktionalitten zur Verfgung gestellt.
125
Kapitel 2
Windows Installer-XML
wurde im schreibgeschtzten Modus auf das System zugegriffen; eine Modifikation des Zielsystems
wurde nicht vorgenommen. Eine solche darf gem den Windows Installer-Richtlinien nur im Rahmen
der Installationstransaktion erfolgen. Denn nur hierdurch kann sichergestellt werden, dass die
nderungen bei einem Installationsfehler zurckgenommen werden knnen. Ist es erforderlich das
Zielsystem durch individuelle Implementierungen zu modifizieren, so sind hierzu benutzerdefinierte
Aktionen mit verzgerter Ausfhrung zu verwenden. Hierunter sind Aktionen zu verstehen, die
ebenfalls im Rahmen der Transaktion ausgefhrt werden und deren nderungen rein theoretisch
ebenfalls zurckgenommen werden knnen. Ich sage hier bewusst theoretisch, denn einen
Automatismus wie bei den Standardaktionen gibt es hierfr nicht. Der Windows Installer hat keine
Kenntnis ber die physischen Modifikationen am Zielsystem und kann diese somit auch nicht
automatisch zurcknehmen. Es ist somit erforderlich, gegenstzliche Aktionen zu erstellen, die im
Fehlerfall und auch bei der Deinstallation die durchgefhrten nderungen zurcknehmen. Es wird
deutlich, dass der Aufwand zum Entwickeln einer solchen benutzerdefinierten Aktion sehr hoch ist,
zumal auch einige programmtechnische Besonderheiten zu bercksichtigen sind.
Ein einfaches Beispiel fr eine solche Aktion ist das Anlegen eines Benutzerkontos im Rahmen der
Installation. Was auf den ersten Blick sehr einfach aussieht, gestaltet sich beim nheren hinsehen
komplexer als ursprnglich gedacht, da die folgenden Fragen in das Design einbezogen werden sollten:
Was soll geschehen, wenn das anzulegende Benutzerkonto bereits existiert? Denkbare Optionen
wren ein Abbruch der Aktion oder die Aktualisierung des existierenden Kontos.
Was soll beim Rollback geschehen? Hierbei sollte auch der Fall betrachtet werden, in dem das
Konto bereits vorhanden ist.
Was soll bei der Deinstallation geschehen? Soll das Konto entfernt werden oder soll es auf dem
System verbleiben?
Soll das Benutzerkonto noch bestimmten Benutzergruppen hinzugefgt werden?
Welche zustzlichen Optionen sollen bei der Erstellung des Kontos bercksichtigt werden? Darf
der Benutzer beispielsweise das Kennwort verndern oder nicht.
Es wird deutlich, dass eine programmtechnische Implementierung in Form einer benutzerdefinierten
Aktion sehr umfangreich wird, wenn die gerade vorgestellten Faktoren bercksichtigt werden sollen.
Die exakte Vorgehensweise zur Erstellung eines Installationspaketes mit dieser Funktionalitt ist im
Windows Installer-SDK beschrieben; weiterhin ist der erforderliche Programmcode ebenfalls im SDK
zu finden. Bei der Betrachtung dieses Beispiels fllt auf, dass der Windows Installer-Datenbank eine
benutzerdefinierte Tabelle mit der Bezeichnung CustomUserAccounts hinzugefgt wurde. In dieser
Tabelle werden die zu erstellenden Benutzerkonten erfasst; die programmtechnische Implementierung
greift beim Ausfhren der benutzerdefinierten Aktion auf diese Datenbanktabelle zurck. Es ist
erkennbar dass hierdurch die Datenhaltung von der Implementierung getrennt wurde, so dass sich das
Gesamtdesign sehr strukturiert und einfach darstellt.
Windows Installer-XML verwendet einen identischen Ansatz; auch hier werden die Daten von der
Implementierung getrennt. Allerdings ist die gesamte Vorgehensweise zur Verwendung einer solchen
Aktion wesentlich einfacher und komfortabler realisiert als in dem Beispiel des SDK. Im Wesentlichen
sind nur drei Schritte durchzufhren:
Das XML-Schema http://schemas.microsoft.com/wix/UtilExtension ist im WXS-Dokument zu
referenzieren, wodurch Elemente und Attribute zur Definition des Benutzerkontos bereitgestellt
werden. Im Weiteren wird hierdurch auch die IntelliSense-Funktionalitt bereitgestellt.
Das zu erstellende Benutzerkonto ist durch das Element <User/> zu modellieren. Zustzlich
126
Windows Installer-XML
Kapitel 2
127
Kapitel 2
Windows Installer-XML
Das erstellte WXS-Dokument kann nun unter Verwendung des Compilers und Linkers in ein Windows
Installer-Paket umgewandelt werden. Hierbei ist zu beachten, dass dem Aufruf des Compilers und des
Linkers eine Referenz auf die Bibliothek WixUtilExtension.dll angefgt werden muss. Da eine
Benutzeroberflche generiert werden soll, muss die Referenz auf die Bibliothek WixUIExtension.dll
dem Linkeraufruf ebenfalls angefgt werden. Darber hinaus ist es noch mglich, die zu verwendende
Kultur zu definieren. Diese Kultur hat nicht nur Einfluss auf die Sprache der Benutzeroberflche,
sondern bezieht sich auch auf die Bibliothek WixUtilExtension.dll. Das bedeutet, dass hiermit auch die
Sprache der Meldungen festgelegt wird, die beispielsweise beim fehlerhaften Anlegen eines Benutzers
angezeigt oder ausgegeben werden.
candle.exe account.wxs -ext "%MSIWIX%\WixUtilExtension.dll"
light.exe -out account.msi account.wixobj -ext WixUtilExtension.dll -ext
WixUIExtension.dll -cultures:de-DE
Die Vorgehensweisen zum Anlegen eines Benutzers durch Verwendung der entsprechenden Elemente
im WXS-Dokument sind relativ einfach und berschaubar. Interessant ist hingegen die tatschliche
Umsetzung im finalen Installationspaket. An dieser Stelle offenbaren sich die gesamte Komplexitt
und die elegante Umsetzung der Implementierung. So finden sich neue Tabellen wie Group, User und
UserGroup die letztlich die Daten zur Konfiguration des Benutzers enthalten. Die tatschliche
Modifikation wird in Form von benutzerdefinierten Aktionen vorgenommen, wobei auch Aktionen fr
die Deinstallation und den Fehlerfall vorhanden sind.
Ich mchte noch ein hnliches Beispiel konstruieren und hierbei auch die bereits vorgestellten
Bibliotheken zum Abrufen von Systeminformationen einbeziehen. Es soll eine Netzwerkfreigabe fr
das Installationsverzeichnis erstellt werden, wobei Mitglieder der Gruppe Benutzer ausschlielich
lesend darauf zugreifen drfen. Der Zugriff fr Mitglieder der Administratorengruppe soll hingegen
nicht eingeschrnkt werden. Was auf den ersten Blick einfach aussieht, gestaltet sich beim nheren
Hinsehen jedoch uerst aufwendig. Das hat damit zu tun, dass sich der Name der Benutzergruppen in
Abhngigkeit zur Sprache des Betriebssystems verndert. Es wre jetzt natrlich mglich
entsprechende lokalisierte Texte in dem Installationspaket verwenden, aber der zu betreibende
Aufwand wre riesengro und das Ergebnis nicht zufriedenstellend. Der Windows Installer hilft an
dieser Stelle auch nicht weiter, denn nur in der Tabelle LockPermissions knnen die Bezeichnungen
Administrators und Everyone symbolisch verwendet werden. Aber wie ich es bereits angedeutet habe,
hilft an dieser Stelle auch Windows Installer-XML weiter. Die Erweiterungsbibliothek
WixUtilExtension.dll enthlt lokalisierte Bezeichnungen fr die Benutzergruppen der Administratoren,
der Benutzer und der Gste, sowie fr die Konten des lokalen Systemkontos (local system), des
128
Windows Installer-XML
Kapitel 2
129
Kapitel 2
Windows Installer-XML
Zu Beginn des Abschnitts zu den Erweiterungsbibliotheken, wurde der interne Aufbau anhand eines
kleinen Beispiels skizziert. So wurde in der von Microsoft.Tools.WindowsInstallerXml.WixExtension
abgeleiteten Klasse festgelegt, welche Art von Erweiterung bereitgestellt werden soll. In dem Beispiel
war das eine Erweiterung fr den Decompiler. Es ist nicht verwunderlich, dass die gerade vorgestellte
WixUtilExtension.dll eine Erweiterung fr den Compiler enthlt, damit die Informationen des
Dokumentes umgesetzt werden knnen. Darber hinaus ist ebenfalls eine Erweiterung fr den
Decompiler vorhanden. Das hat den groen Vorteil, dass beim Dekompilieren eines
Installationspaketes die Inhalte durch diese Bibliothek zustzlich ausgewertet und umgesetzt werden.
Betrachten Sie das durch Listing 2.25 erzeugte Installationspaket. Dieses enthlt eine
benutzerdefinierte Tabelle mit der Bezeichnung FileShare. Die Inhalte dieser Tabelle wrden bei einer
Dekompilierung ohne diese Erweiterungsbibliothek in ein generisches Element vom Typ
<CustomTable/> berfhrt. Da jedoch die Erweiterungsbibliothek automatisch herangezogen wird,
werden die spezifischen Informationen letztlich wider im Element <FileShare/> abgebildet, so dass
sie komfortabel weiter verwendet werden knnen.
Weitere Mglichkeiten
Eine Zielsetzung von Windows Installer-XML ist die Bereitstellung von Implementierungen fr alle
gngigen Installationsanforderungen. Die technische Umsetzung hierzu erfolgt durch
Erweiterungsbibliotheken, von denen eine im vorherigen Abschnitt vorgestellt wurde. Dieses ist
jedoch nur die Spitze des Eisberg, denn der derzeitig zur Verfgung gestellte Funktionsvorrat ist
bereits so gro, dass eine detaillierte Betrachtung ein eigenes Buch fllen wrde. Aus diesem Grund
mchte ich im Folgenden lediglich einen kurzen Abriss ber die weiteren Erweiterungsbibliotheken
und den primren Verwendungszweck geben.
Bibliothek
Beschreibung
WixComPlusExtension.dll
WixDifxAppExtension.dll
WixDirectXExtension.dll
WixFirewallExtension.dll
WixGamingExtension.dll
WixIIsExtension.dll
WixIsolatedAppExtension.dll
130
Windows Installer-XML
Kapitel 2
WixMsmqExtension.dll
WixNetFxExtension.dll
Erstellen von Native Images fr Microsoft .NET 2.0 und hher. Weiterhin
bereitstellen von Systeminformationen zum installierten Framework.
WixOfficeExtension.dll
WixPSExtension.dll
WixSqlExtension.dll
WixUIExtension.dll
WixVSExtension.dll
WixUtilExtension.dll
Wie bereits angedeutet, wird der Funktionsvorrat von Windows Installer-XML stndig erweitert, so
dass beim Erscheinen dieses Buches der Umfang der Erweiterungsbibliotheken wahrscheinlich weiter
zugenommen hat.
Fazit
Bei der Toolsammlung handelt es sich um ein nicht kommerzielles Produkt, dass fast vollstndig in der
Programmiersprache Microsoft Visual C# entwickelt wurde. Windows Installer-XML ist frei verfgbar
und unterliegt der Common Public License, wodurch es auch in kommerziellen Projekten verwendet
werden darf.
Der technische Ansatz ist elegant gelst, denn jeder Entwickler denkt in XML, wodurch der bergang
zu einer darauf basierenden Deklarationssprache zum Erzeugen von Installationspaketen extrem
vereinfacht wird. Windows Installer-XML ist ein mchtiges Werkzeug zum Erzeugen von
Installationspaketen, das hinsichtlich der Flexibilitt und der Einbindung in automatisierte
Buildprozesse seines gleichen sucht. Dieses ist aber lngst nicht alles, denn Windows Installer-XML
enthlt auch ein SDK mit dem es mglich ist, programmtechnisch auf Windows InstallerFunktionalitten zuzugreifen. Dieses SDK trgt die Bezeichnung Deployment Tools Foundation und
wird in Kapitel 4 dieses Buches betrachtet.
131
Kapitel 3
Architekturen
Dateisystem und Systemregistrierung
Benutzerdefinierte Aktionen
Richtlinien
Fazit
132
136
144
146
148
Viele Unwgbarkeiten fhrten in der Vergangenheit dazu, dass die 64-Bit Plattform nicht den
Stellenwert eingenommen hat, den sie vom technischen und funktionellen Standpunkt aus htte
einnehmen knnen. Unterschiedliche und inkompatible Prozessorarchitekturen, teure Hardware und
fehlende Software waren einige der Grnde dafr. Im Gegensatz dazu war der Markt durchaus
vorhanden, denn Software, die eine hohe Rechenleistung fordert oder sehr viel Arbeitsspeicher
bentigt, waren und sind absolut keine Seltenheit. Vereinfacht dargestellt bedeutet 64-Bit, dass die
Prozessoren durch ihre Bauart so ausgelegt sind, dass 64-Bit, also 8 Byte whrend eines
Prozessortaktes verarbeitet werden knnen. Hierdurch sind natrlich effektivere Rechenleistungen
gerade im Bereich hoher Ganzzahlen mglich, so dass Vorteile bei Verschlsselungsalgorithmen, bei
grafischen Berechnungen und im Multimediaumfeld zu verzeichnen sind. Weitere Vorteile liegen in
der Gre des Adressraums, da hierbei nicht mehr die Begrenzung bei 4 Gigabyte liegt, sondern
theoretisch bei 264 Byte, also 16 Exabyte, die direkt adressiert werden knnen. Dieses ist jedoch nur ein
theoretischer Wert, denn praktisch ist die Verwendung eines so groen Adressraums noch nicht
mglich. Aktuelle Betriebssysteme in 64-Bit-Architektur wie der Windows Server 2008 untersttzen
Adressrume bis zu 2 Terabyte. Die Vorzge sind dennoch offensichtlich und auch die erforderliche
Hardware wird nun zu erschwinglichen Preisen angeboten, so dass die breite Nutzung perspektivisch
mglich scheint. Die Verfgbarkeit geeigneter Betriebssysteme und Anwendungen sollte die
Verbreitung von 64-Bit Systemen zustzlich vorantreiben.
Architekturen
Bei der Erstellung eines Installationspaketes ist festzulegen, welche Plattform untersttzt werden soll.
Diese Informationen werden in der Eigenschaft PID_TEMPLATE des Summary Information Streams
abgelegt. Es ist denkbar einfach eine 32-Bit Plattform als Ziel fr ein Installationspaket auswhlen. Bei
einer 64-Bit Plattform sieht das Ganze auf den ersten Blick doch etwas verwirrend aus, was ihren
Ursprung in dem Namenswirrwarr bei den um 64-Bit-Funktionen erweiterten x86-Prozessoren findet.
Es stellt sich zunchst die Frage, was sich hinter Begriffen wie x86, AMD64, IA64, EM64T oder IA64
verbirgt und welche Unterschiede vorhanden sind.
132
Kapitel 3
x86: Bei x86 handelt es sich um die klassische Prozessor-Architektur, also 32-Bit Prozesse die auf
einem 32-Bit Windows-Betriebssystem ausgefhrt werden.
AMD64: Hierbei handelt es sich um die von Advanced Micros Devices Inc. geschaffene
Mglichkeit 32-Bit Code auf einem 64-Bit System nativ auszufhren. Das bedeutet, dass ein 32-Bit
Windows Betriebssystem auf einer AMD64-Maschine nativ ausgefhrt werden kann. Technisch
gesehen ist der Chip ein vollwertiger 32-Bit-Prozessor, dessen Register im 64-Bit-Modus
verbreitert wurden. Er ist dadurch uneingeschrnkt zu heutiger 32-Bit und sogar alter 16-Bit
Software kompatibel. Zustzlich steht ein 64-Bit Modus zur Verfgung, der vor allem die
Adressierung eines greren Speicherbereichs ermglicht und Performance-Verbesserungen durch
breite Register mit sich bringt. Mit AMD64 leitete AMD daher einen sanften bergang von 32- auf
64-Bit-Umgebungen ein. Frher wurde diese Architektur auch als x86-64 bezeichnet.
IA64: IA64 steht fr Intel Architecture 64-Bit und ist eine 64-Bit-Architektur und ein Befehlssatz
von Intel fr die Prozessorgenerationen Itanium und Itanium 2. Hierbei wird 64-Bit Code nativ
ausgefhrt, 32-Bit Code wird emuliert. Es ist somit nicht mglich, ein 32-Bit Betriebssystem auf
einem IA64-System zu installieren. Hierfr mssen Betriebssysteme wie Windows Server 2003 for
64-bit Itanium-based Systems oder Windows Server 2008 for Itanium-based Systems verwendet
werden.
Intel64: Intel 64 (frher auch Extended Memory 64 Technology, abgekrzt EM64T), bezeichnet die
Erweiterung der Architektur um die Fhigkeit mehr als 4 Gigabyte Speicher direkt zu adressieren
und die 64-Bit AMD64-Befehle auszufhren. Dieser Prozessor untersttzt ebenso die native
Ausfhrung von 32-Bit-Code wie ein AMD64.
x64: Dieses ist die von Microsoft verwendete Bezeichnung um Prozessoren zu definieren, die 32und 64-Bit-Code nativ, also ohne Emulation ausfhren knnen. Somit sind hierunter die beiden
Prozessoren Intel64 (EM64T) und AMD64 zu verstehen.
Nun kommt wieder der Windows Installer ins Spiel und die Verwirrung wird noch grer. Windows
Installer 4.5 kennt zum Definieren der Zielplattform die Eigenschaften Intel, Intel64, AMD64 und x64.
Der Windows Installer untersttzt seit der Version 2.0 bereits die Installation auf der IA64-Plattform
und seit der Version 3.0 auf der AMD64-Plattform. Damals konnte noch nicht vorhergesagt werden,
dass Intel eine weitere 64-Bit-Architektur untersttzen wrde, so dass zum damaligen Zeitpunkt
passende Eigenschaftsbezeichnungen gewhlt wurden, die bis heute aus Grnden der Kompatibilitt
beibehalten wurde. Um ein Installationspaket fr die Ausfhrung auf einer IA64-Plattform zu
konfigurieren, ist die Eigenschaft PID_TEMPLATE des Summary Information Streams auf Intel64
zu setzen; fr die Installation auf der AMD64-Plattform hingegen auf AMD64. Mit dem Windows
Installer 3.1 wurde der zustzliche Wert x64 eingefhrt. Da Intel jedoch durch die EM64T-Architektur
kompatibel zur AMD64-Architektur ist, handelt es sich hierbei nur um Kosmetik, um hiermit die
Unabhngigkeit zum Hersteller der Prozessoren darzustellen. Es ist somit unerheblich, ob der
Eigenschaftswert x64 oder AMD64 gesetzt wird; das Paket lsst sich auf einer x64-Plattform
anwenden. Der Eigenschaftswert AMD64 ist durch den generischen Wert x64 berflssig geworden
und befindet sich nur noch aus Grnden der Kompatibilitt mit lteren Installationspaketen im
Eigenschaftsvorrat des Windows Installers.
Hinweis Beginn
Auch bei Mergemodulen muss die Eigenschaft PID_TEMPLATE des Summary Information Streams
auf die entsprechende Prozessorarchitektur gesetzt werden. Hierbei ist zu beachten, dass sich
Mergemodule, die mit Intel64 gekennzeichnet sind, natrlich auch nur in die identisch
gekennzeichneten Installationspakete integrieren lassen. Gleiches gilt fr die Kennzeichnung mit x64
Persnliche Ausfertigung fr Martin Martinsson
133
Kapitel 3
Und AMD64. Mergemodule, die fr die 32-Bit-Verwendung gekennzeichnet sind, lassen sich hingegen
in jedes Installationspaket integrieren.
Hinweis Ende
Bei der Erstellung eines Paketes mit Windows Installer-XML ist die zu verwendende Architektur dem
Attribut Platform des Elementes <Package/> anzufgen, wie dieses auch in Listing 3.26 dargestellt
wird.
<?xml version="1.0" encoding="Windows-1252"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<!-- Definition des Produktes -->
<Product UpgradeCode="{DBC3A49F-67B4-4bce-A596-660D365DBFD8}" Manufacturer="Microsoft Deutschland GmbH"
Language="1033" Version="1.00.0000" Name="Football 2008" Id="{0BC4E7F4-8840-4d23-9AF9-C68CFFDC7C0E}"
Codepage="1252">
<!-- Paketdefinition -->
<Package Keywords="Microsoft Windows Installer, MSI" Description="Football 2008"
Manufacturer="Andreas Kerl" InstallerVersion="200" Platform="x64" Languages="1033"
Compressed="yes" SummaryCodepage="1252" InstallPrivileges="elevated" />
<!-- Weitere Daten -->
</Product>
</Wix>
Zur Festlegung der Architektur mit Windows Installer-XML stehen die Werte Intel, Intel64, x86, x64
134
Kapitel 3
und ia64 zur Verfgung. Beim Kompilieren des WXS-Dokuments wird bei Verwendung von Intel und
Intel64 eine Warnung ausgegeben und darauf hingewiesen, dass diese Werte nicht mehr zu verwenden
sind.
D:\Draft\Product.wxs(12)
has been deprecated.
D:\Draft\Product.wxs(12)
has been deprecated.
Diese Manahme trgt ganz entscheidend zur bersichtlichkeit bei und stellt die Konsistenz zu den
regulren Bezeichnungen wieder her, wie auch in der Gegenberstellung der Bezeichnungen
aufgezeigt wird.
Architektur
Windows Installer
Windows Installer-XML
x86
Intel
x86
AMD64
x64
Intel64
x64
IA64
Intel64
ia64
x64
x64
Ein Installationspaket muss als 32-Bit oder 64-Bit-Paket spezifiziert werden. Die Mglichkeit der
Kennzeichnung als neutrales Paket ber einen generischen Eigenschaftswert besteht nicht. Es wird
somit deutlich, dass es nicht mglich ist, ein Installationspaket fr unterschiedliche Zielplattformen zu
definieren. Auch die Kombination mehrerer Eigenschaftswerte ist nicht erlaubt.
Es ist nicht mglich, ein Windows Installer-Paket so zu kennzeichnen, dass die Plattformen Intel64
und x64 untersttzt werden. Der Eigenschaftswert Intel64,x64 ist ungltig.
Es ist nicht mglich, ein Windows Installer-Paket so zu kennzeichnen, dass die 32-Bit und die 64Bit Plattform untersttzt werden. Der Eigenschaftswert Intel,x64 oder Intel,Intel64 ist
ungltig.
Falls versucht wird ein 64-Bit-Paket auf einer 32-Bit-Plattform zu installieren, wird der
Installationsversuch durch den Fehler 1633 (ERROR_INSTALL_PLATFORM_UNSUPPORTED)
abgebrochen. Auf einen 64-Bit-Plattform wird der Windows Installer in einem 64-Bit-Prozess
ausgefhrt, so dass sowohl 32-Bit als auch 64-Bit-Pakete installiert werden knnen. Hierbei gibt es
drei Arten ein Installationspaket zu definieren und zu konstruieren.
Ein 32-Bit-Paket, das ausschlielich 32-Bit-Komponenten enthlt.
Ein 64-Bit-Paket, das einige 32-Bit-Komponenten enthlt.
Ein 64-Bit-Paket, das ausschlielich 64-Bit-Komponenten enthlt.
Hier stellt sich nun die Frage, warum eine plattformspezifische Kennzeichnung berhaupt
vorgenommen werden muss. Die Installation eines 32-Bit Paketes auf einer 64-Bit Plattform scheint ja
auf den ersten Blick zu funktionieren, denn es kommt zu keinen diesbezglichen Installationsfehlern.
Wre dieses nicht ein geeigneter generischer Ansatz?
135
Kapitel 3
WOW64-Subsystem
Gerade die letzte Aussage sollte noch ein wenig verdeutlich werden. Alle 64-Bit-Versionen von
Windows enthalten ein Subsystem zur Ausfhrung von 32-Bit-Anwendungen, das als WOW64
(Windows-On-Windows 64-Bit) bezeichnet wird. Der hauptschliche Zweck liegt in der Bereitstellung
einer 32-Bit-Umgebung, in der smtliche Schnittstellen zur Verfgung stehen, die 32-Bit-WindowsAnwendungen bentigen, um ohne Anpassungen auf einem 64-Bit-System zu laufen. Dieses ist der
ganz entscheidenden Punkt, denn eine 32-Bit-Anwendung muss nicht explizit verndert werden. Das
Betriebssystem stellt automatisch fest, wenn es sich um eine 32-Bit-Anwendung handelt und fhrt
diese dann im Subsystem aus.
Mitunter kann es innerhalb einer Anwendung erforderlich werden, herauszufinden, ob sie als 64-Bit
oder 32-Bit-Prozess ausgefhrt wird. Dieses kommt besonders bei .NET-Abwendungen zum Tragen,
die nicht fr eine spezifische Architektur kompiliert wurden, sondern fr die generische Verwendung
auf unterschiedlichen Plattformen. Hierbei wird beim Kompilieren lediglich ein Zwischencode
(Microsoft Intermediate Language) erzeugt, der im Rahmen JIT-Kompilierung (Just-In-Time) erst auf
dem Zielsystem fr die jeweilige Architektur angepasst wird. Ob ein Assembly fr die
plattformunabhngige Verwendung konfiguriert wurde oder ob bereits beim Kompilieren eine
spezifische
Architektur
festgelegt
wurde,
lsst
sich
ber
die
Eigenschaft
System.Reflection.Assembly.ProcessorArchitecture abrufen. Diese Eigenschaft kann die in Tabelle
3.34 aufgefhrten Werte zurckliefern.
Wert
Beschreibung
MSIL
X86
IA64
Amd64
Wird ein plattformunabhngiges Assembly (MSIL) auf einem 64-Bit-System ausgefhrt, wird es auch
136
Kapitel 3
als 64-Bit-Anwendung kompiliert und entsprechend verwendet. Identisches gilt fr die Ausfhrung auf
einem 32-Bit-System. Das Betriebssystem stellt die Kernel-Funktion IsWow64Process()fr solche
Prfmechanismen zur Verfgung. Allerdings existiert die Funktion nur bei 64-Bit-Betriebssystemen,
so dass eine plattformunabhngige Prfmethode nur sehr aufwndig und unter Bercksichtigung von
Fehlercodes mglich ist. Einfacher gestaltet sich eine Prfung, bei die Gre bestimmter Objekte
geprft wird. Die Struktur System.IntPtr ist plattformabhngig und wird zur Reprsentation eines
Zeigers oder eines Handles verwendet, so dass sich die Gre der Struktur in Abhngigkeit zur
verwendeten Architektur ndert. Innerhalb eines 64-Bit-Prozesses ist die Struktur 8 Byte gro ist;
innerhalb eines 32-Bit-Prozesses hingegen nur 4 Byte. Dieser Umstand lsst sich ausnutzen und auf
einfache Weise zur Prfung der Architektur heranziehen, wie auch Listing 3.27 zeigt.
// Gibt True zurck, falls es sich um einen 64-Bit-Prozess handelt
public static bool Is64Bit
{
get { return (IntPtr.Size == 8); }
}
137
Kapitel 3
Was fr das Dateisystem gilt auch fr die Systemregistrierung. Auch hier wurde das Layout gendert,
so dass die Eintrge wiederum isoliert voneinander abgelegt werden. Das bedeutet, dass ein 32-BitProzess auf einen anderen Bereich der Systemregistrierung zugreift, als ein 64-Bit-Prozess. Greift ein
64-Bit-Prozess auf den Registrierungsschlssel HKEY_LOCAL_MACHINE\Software zu, werden die
Informationen auch aus diesem Schlssel verwendet. Greift hingegen ein 32-Bit-Prozess auf diesen
Schlssel
zu,
findet
eine
Umleitung
statt
und
die
Informationen
von
HKEY_LOCAL_MACHINE\Software\WOW6432node werden verwendet. Dieses funktioniert
automatisch und wird als Registry Redirection bezeichnet. Diese Unterteilung lsst sich hervorragend
mit dem Registrierungs-Editor betrachten. Starten Sie diesen auf einem 64-Bit-System, indem sie den
Befehl regedit.exe im Dialogfeld Ausfhren eingeben. Wechseln Sie nun zu
HKEY_LOCAL_MACHINE\Software. Starten Sie anschlieend den 32-Bit-Registrierungs-Editor,
indem sie im Dialog Ausfhren den Befehl %systemroot%\SysWOW64\regedit.exe -m eingeben. Das
Argument -m ermglicht das ffnen mehrerer Instanzen des Editors. Bei der Betrachtung des
identischen Schlssels, sind die Unterschiede offensichtlich, wie auch Abbildung 3.23 zeigt.
138
Kapitel 3
Die Systemregistrierung verfgt noch ber weitere interessante Erweiterungen, wie die Verwendung
gemeinsamer Eintrge und die sogenannte Spiegelung von Eintrgen. Die gemeinsamen Eintrge
gelten sowohl fr den 32-Bit-Bereich, als auch fr den 64-Bit-Bereich. Das bedeutet, dass fr diese
Eintrge keine Umleitung durchgefhrt wird. Die gemeinsam verwendeten Eintrge sind alle unter
HKEY_LOCAL_MACHINE\Software zu finden. Nachfolgend findet sich ein Auszug aus den
Registrierungsschlsseln, die fr beide Sichten gelten:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Driver Signing
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSMQ
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Non-Driver Signing
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Software\Microsoft\Shared Tools\MSInfo
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\SystemCertificates
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Group Policy
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Setup
HKEY_LOCAL_MACHINE\SOFTWARE\Policies
Die Zielsetzung der Spiegelung (Registry Reflection) ist eine Andere und liegt in der Duplizierung
eines Eintrages, der in beiden Sichten synchron gehalten wird. Wird also ein Eintrag im 64-Bit-Bereich
angelegt, wird automatisch ein Duplikat im 32-Bit-Bereich der Registrierung abgelegt. Dieses
Persnliche Ausfertigung fr Martin Martinsson
139
Kapitel 3
Diese Einstellungen sind fr die Zugriffe auf die Systemregistrierung uerst relevant. Bei Zugriff auf
das Dateisystem ist dieses nicht der Fall, denn die Definition der Ablagestruktur erfolgt durch die
folgenden Eigenschaften:
CommonFiles64Folder
140
Kapitel 3
CommonFilesFolder
ProgramFiles64Folder
ProgramFilesFolder
System64Folder
SystemFolder
Bei der Betrachtung der Eigenschaften fllt auf, dass es sich um die 32-Bit und 64-BitReprsentationen bestimmter Systemordner handelt. Vom logischen Gesichtspunkt her, sollte davon
ausgegangen werden, dass durch die Eigenschaft ProgramFiles64Folder der Ordner C:\Program
Files und durch ProgramFilesFolder der Ordner C:\Program Files (x86) definiert werden. Vom
Prinzip her ist diese Annahme richtig, dennoch entspricht sie nicht der Realitt, denn es muss ebenfalls
die Paketdefinition einbezogen werden. Das bedeutet, dass bei einer 64-Bit-Komponente, dessen
Installationsverzeichnis auf ProgramFiles64Folder festgelegt wurde, eine Umleitung auf
ProgramFilesFolder stattfindet, falls es sich um ein 32-Bit-Installationspaket handelt. Dieses wird bei
der Betrachtung des Installationsprotokolls besonders deutlich. Hier ist erkennbar, dass der
ProgramFiles64Folder zunchst richtig gesetzt, dieser aber anschlieend wieder auf das quivalente
32-Bit Verzeichnis zurckgesetzt wird.
MSI (s) (24:18) [18:20:30:922]: WIN64DUALFOLDERS: 'C:\Program Files (x86)\' will substitute 17 characters
in 'C:\Program Files\' folder path. (mask argument = 0, the folder pair's iSwapAttrib member = 0).
MSI (s) (24:18) [18:20:30:922]: PROPERTY CHANGE: Modifying ProgramFiles64Folder property. Its current value
is 'C:\Program Files\'. Its new value: 'C:\Program Files (x86)\'.
Dieses Verhalten zeigt die Relevanz, die die Festlegung der jeweiligen Plattform auf Ebene der
Paketdefinition einnimmt. Hier ist noch anzumerken, dass dieses Verhalten fr alle der oben
skizzierten Ordner gilt, wie auch Tabelle 3.35 aufzeigt.
Ordner
CommonFiles64Folder
Null
C:\Program Files
(x86)\Common Files\
C:\Program Files\Common
Files\
CommonFilesFolder
C:\Program
Files\Common Files\
C:\Program Files
(x86)\Common Files\
C:\Program Files
(x86)\Common Files\
ProgramFiles64Folder
Null
C:\Program Files\
ProgramFilesFolder
C:\Program Files\
System64Folder
Null
C:\Windows\SysWOW64\
C:\Windows\system32\
SystemFolder
C:\Windows\system32\
C:\Windows\SysWOW64\
C:\Windows\SysWOW64\
Der Zugriff auf die Systemregistrierung gestaltet sich einfacher, da hierbei keine speziellen Variablen
zu verwenden sind. Der tatschliche Ablageort orientiert sich ausschlielich an dem Attribut
msidbComponentAttributes64bit. Schreibt eine so gekennzeichnete Komponente unter
HKEY_LOCAL_MACHINE\Software, werden die Informationen auch an dieser Stelle abgelegt.
Handelt es sich um eine Komponente ohne diese Kennzeichnung, also eine 32-Bit-Komponente, wird
der Eintrag unter HKEY_LOCAL_MACHINE\Software\Wow6432Node abgelegt. Eine 64-Bit
141
Kapitel 3
Komponente schreibt somit in den 64-Bit Bereich und eine 32-Bit Komponente natrlich in den 32-Bit
Bereich der Systemregistrierung. Im Installationsprotokoll lassen sich diese Unterscheidungen an den
Parametern der Operationsanweisung RegOpenKey nachvollziehen. Bei 32-Bit Komponenten ist dem
Parameter BinaryType der Wert 0 zugeordnet, bei 64-Bit Komponenten hingegen der Wert 1.
MSI (s) (F8:C4) [18:52:52:776]: Executing op: RegOpenKey(Root=2147483646,Key=SOFTWARE\MsiTest,,BinaryType=0,)
MSI (s) (F8:C4) [18:52:52:776]: Executing op: RegAddValue(Name=Typ,Value=32-Bit-Komponente,)
An einer vorherigen Stelle wurde bereits die Spiegelung von Registrierungsschlsseln (Registry
Reflection) erlutert. Hierbei werden Registrierungsschlssel automatisch dupliziert und
synchronisiert. Falls dieses nicht gewnscht ist, kann der Mechanismus auer Kraft gesetzt werden.
Hierzu
ist
die
entsprechende
Komponente
mit
dem
Attribut
msidbComponentAttributesDisableRegistryReflection zu versehen ist. Es gilt zu beachten, dass dieses
Attribut erst mit dem Windows Installer 4.0 bereitgestellt wurde und auch nur fr Windows Vista und
Windows Server 2008 gltig ist. Auf allen anderen Betriebssystemen und auf 32-Bit-Plattformen wird
das Attribut ignoriert.
Die Definition mit Windows Installer-XML ist wiederum sehr einfach, wie nachfolgend auch
nachfolgend dargestellt wird. Hierbei ist das Attribut DisableRegistryReflection des Elements
Component zu verwenden.
<Component Id="C__C1" Guid="26076C98-F5F3-4BD6-9547-F0252D6DB801" Win64="yes" DisableRegistryReflection="no">
<RegistryValue Id="R__Typ" Root="HKLM" Key="SOFTWARE\Classes\Msi.Demo" Value="Demo"
Type="string"></RegistryValue>
</Component>
Das dargestellte Beispiel konstruiert eine 64-Bit-Komponente, bei der das Attribut
DisableRegistryReflection nicht gesetzt wurde und somit das Standardverhalten reprsentiert. Das
bedeutet dass in dem Beispiel die folgenden Eintrge in der Systemregistrierung erzeugt und synchron
gehalten werden.
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Msi.Demo
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Classes\Msi.Demo
Das gleiche Ergebnis wird auch erreicht, wenn es sich um eine 32-Bit-Komponente handelt. Wird nun
bei der 64-Bit-Komponente das Attribut DisableRegistryReflection aktiviert, wird der folgende
Schlssel erzeugt:
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Msi.Demo
Wird hingegen bei einer 32-Bit-Komponente das Attribut DisableRegistryReflection aktiviert wird
auch nur der folgende 32-Bit-Schlssel erzeugt.
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Classes\Msi.Demo
Die bisherigen dargestellten Mglichkeiten bezogen sich auf den schreibenden Zugriff auf die
Systemregistrierung, also auf die Modifikation. Soll jedoch im Rahmen der Installation lesend auf die
Systemregistrierung zugegriffen werden, steht zu diesem Zweck die Tabelle RegLocator zur
Verfgung. Die Eintrge dieser Tabelle sind mit keiner Komponente verknpft, so dass ber diesen
142
Kapitel 3
Mechanismus nicht der Bit-Spezifische Teilbereich der Systemregistrierung spezifiziert werden kann.
Aus diesem Grund muss der Eintrag der Tabelle RegLocator weiter qualifiziert werden, um somit eine
Unterscheidung zwischen dem 32-Bit-Bereich und dem 64-Bit-Bereich zu treffen. Zu diesem Zweck
steht das Attribut msidbLocatorType64bit zur Verfgung, dass mit Windows Installer-XML wie folgt
umgesetzt wird.
<Property Id="DOTNET64BITENABLED">
<RegistrySearch Id="RegSearch" Root="HKLM" Key="SOFTWARE\Microsoft\.NETFramework"
Name="Enable64Bit" Type="raw" Win64="yes"/>
</Property>
Eigenschaften
Zur Beeinflussung des Installationsprozesses und zur Modellierung des Installationsergebnissen stehen
natrlich auch Eigenschaften zur Verfgung, die plattformspezifische Informationen enthalten. Somit
ist es mglich diese in Bedingungen zu verwenden und somit Fallunterscheidungen zu treffen.
Mitunter kann es erforderlich werden, die Installation einer Komponente von der Plattformarchitektur
abhngig zu machen, so dass diese mit einer Bedingung zu versehen ist. Im einfachsten Fall knnen
hierzu die Eigenschaften VersionNT oder VersionNT64 verwendet werden. Beide Eigenschaften
werden auf die Versionsnummer des Betriebssystems gesetzt. Die Eigenschaft VersionNT ist auf jeder
Plattform verfgbar. Die Eigenschaft VersionNT64 wird hingegen nur auf einer 64-Bit-Plattform
gesetzt; auf einer 32-Bit-Plattform ist diese Eigenschaft gar nicht vorhanden.
Ist diese Unterscheidung nicht ausreichend und ist es erforderlich, die tatschliche Prozessorarchitektur
innerhalb der Bedingung zu prfen, so muss auf andere Eigenschaften ausgewichen werden. Bei der
Installation werden vom Windows Installer spezifische Eigenschaften gesetzt, die Auskunft ber die
verwendeten Prozessorarchitekturen geben. Der angefgte Wert wird auf den numerischen ProzessorLevel (wProcessorLevel) der Windows-Struktur SYSTEM_INFO gesetzt, also 4 fr 486, 5 fr P5
und 6 fr P6. Die folgenden Eigenschaften knnen hierfr verwendet werden:
Intel: Diese Eigenschaft wird gesetzt, wenn die Installation auf einem Intel-Prozessor (32-Bit)
ausgefhrt wird. Wird die Installation auf einem x64-Prozessor ausgefhrt, wird diese Eigenschaft
ebenfalls gesetzt, da der 64-Bit-Prozesor die 32-Bit-Befehlsstze nativ untersttzt.
Intel64: Diese Eigenschaft wird nur bei einem Itanium-Prozessor, also IA64 gesetzt. Bei einem
x64-Prozessor wird die Eigenschaft hingegen nicht gesetzt. Diese Eigenschaft ist verfgbar seit
Windows Installer 2.0.
MsiAMD64: Wird gesetzt, falls die Installation auf einem x64-Prozessor ausgefhrt wird. Diese
Eigenschaft ist verfgbar seit Windows Installer 3.0. Sie ist jedoch nur noch aus Grnden der
Kompatibilitt vorhanden.
Msix64: Wird gesetzt, falls die Installation auf einem x64-Prozessor ausgefhrt wird. Diese
Eigenschaft ist verfgbar seit Windows Installer 3.1.
Entscheidend wird hierbei in den wenigsten Fllen der tatschliche Eigenschaftswert sein, sondern
lediglich die Existenz der Eigenschaft. Wird die Installation beispielsweise auf einem x64-System
durchgefhrt, sind die Eigenschaften Intel, MsiAMD64 und Msix64 gesetzt. Die Eigenschaft Intel64 ist
hingegen gar nicht vorhanden.
143
Kapitel 3
Allgemeine Hinweise
Darber hinaus existieren noch allgemeine Hinweise, die sich auf die Verwendung von Komponenten
beziehen. Beim Design eines Installationspaketes, das sowohl 32-Bit, als auch 64-Bit-Dateien enthlt,
sind die Verzeichnispfade so zu whlen, dass es hierdurch zu keiner Beeintrchtigung kommt. Hiermit
ist gemeint, dass sich einerseits die Dateien im Rahmen der klassischen Installation nicht
berschreiben. Auf der anderen Seite ist natrlich auch die Festlegung der Quellverzeichnisse nicht
uninteressant, denn im Rahmen einer administrativen Installation werden diese verwendet. Somit ist
auch hierbei darauf zu achten, dass sich die Dateien nicht gegenseitig berschreiben. Weiterhin ist zu
beachten, dass es sich bei 32-Bit und 64-Bit-Komponenten aus Sicht des Windows Installers um
unterschiedliche Komponenten handelt, so dass sie auch ber eine unterschiedliche Komponenten-ID
verfgen mssen. Identisches gilt auf Ebene des Produktes; auch hier sind unterschiedliche
Produktcodes zu verwenden.
Bei Mergemodulen muss ebenfalls die Eigenschaft PID_TEMPLATE des Summary Information
Streams auf die entsprechende Prozessorarchitektur gesetzt werden. Hierbei ist zu beachten, dass sich
Mergemodule, die mit Intel64 gekennzeichnet sind, natrlich auch nur in die identisch
gekennzeichneten Installationspakete integrieren lassen. Gleiches gilt fr die Kennzeichnung mit x64.
Mergemodule, die fr die 32-Bit-Verwendung gekennzeichnet sind, lassen sich hingegen in jedes
Installationspaket integrieren.
Benutzerdefinierte Aktionen
Die bisherigen Ausfhrungen haben gezeigt, dass es problemlos mglich ist eine 32-Bit-Datei in ein
64-Bit-Verzeichnis zu kopieren und umgekehrt. Weiterhin stellte es auch kein groes Problem dar, die
Zugriffe auf die Systemregistrierung durch die Eigenschaft msidbComponentAttributes64bit zu
beeinflussen. Diese Vorgehensweisen sind natrlich problemlos im Rahmen der Installation
durchzufhren, so dass rein formal eine funktionsfhige Anwendung installiert werden knnte. Dieses
kann jedoch nicht verallgemeinert werden, denn im Rahmen der Installation fehlt natrlich die
Betrachtung des tatschlichen Ausfhrungsverhaltens der Anwendung. So kann es geschehen, dass die
Anwendung fehlerfrei installiert wurde, sich aber in keinem funktionsfhigen Zustand befindet, da das
Installations-Layout ungeeignet war. Anders verhlt es sich bei der Verwendung von
benutzerdefinierten Aktionen, denn hierbei tauchen solche Probleme direkt bei der Installation auf. Das
bedeutet auch, dass ein nicht ordentlich konzipiertes Installationspaket zwangslufig zu einem
Installationsfehler fhren wird. Eine 64-Bit-Datei kann problemlos auf ein 32-Bit-System kopiert
werden, aber eine 64-Bit-Datei kann nicht als benutzerdefinierte Aktion bei der Installation auf einem
32-Bit-System verwendet werden.
Benutzerdefinierte Aktionen werden nicht im eigentlichen Installationsprozess ausgefhrt, sondern in
einem fr diese Flle speziellen Host-Prozess, der als Custom Action-Server bezeichnet wird. Auf einer
64-Bit Plattform existieren Custom Action-Server sowohl in 32-Bit, als auch in 64-Bit Ausprgung.
Die Zuordnung zum jeweiligen Host-Prozess wird nicht durch die Konfiguration des Paketes
vorgenommen, sondern orientiert sich am tatschlichen Format der hierfr zu verwendenden Datei.
Eine 32-Bit-Objektblibliothek wird demzufolge automatisch im 32-Bit Custom Action-Server
ausgefhrt und eine 64-Bit-Bibliothek im 64-Bit-Server. Diese automatische Zuordnung funktioniert
jedoch nur fr Dateien, die ber ein PE-Header (Portable Executable File Format) verfgen, also auch
bei Objektbibliotheken. Mit Hilfe des Windows Task-Mangers kann festgestellt werden, welcher
144
Kapitel 3
Custom Action-Server hierfr verwendet wird. Wie bereits im Kapitel 1 erlutert wurde, existieren
mehrere Prozesse mit der Bezeichnung msiexec.exe. Die Host-Prozesse zum Ausfhren der
benutzerdefinierten Aktion, verfgen ber die identische Bezeichnung. Zur Identifizierung ist der
Befehlszeilenaufruf auszuwerten, denn diesen Prozessen wurde das Argument -Embedding
bergeben. Auf einem 64-Bit-System werden die 32-Bit-Prozesse durch die Zeichenfolge *32
gekennzeichnet. Dieses gilt natrlich auch fr die Custom Action-Server, wie die folgende Abbildung
3.24 zeigt.
Das Installationsprotokoll ist an dieser Stelle auch eine sehr groe Hilfe, denn hieraus kann direkt
abgelesen werden, in welchem Custom Action Server der Code ausgefhrt wird.
MSI (s) (74:14) [11:04:43:203]: Executing op: CustomActionSchedule(Action=CA_OutputString32,
ActionType=1025,Source=BinaryData,Target=OutputString,)
MSI (s) (74:14) [11:04:43:203]: Creating MSIHANDLE (1) of type 790536 for thread 3604
MSI (s) (74:44) [11:04:43:203]: Invoking remote custom action. DLL: C:\WINDOWS\Installer\MSI243.tmp,
Entrypoint: OutputString
MSI (s) (74:2C) [11:04:43:203]: Generating random cookie.
MSI (s) (74:2C) [11:04:43:219]: Created Custom Action Server with PID 2260 (0x8D4).
MSI (s) (74:64) [11:04:43:250]: Running as a service.
MSI (s) (74:64) [11:04:43:250]: Hello, I'm your 32bit Impersonated custom action server.
145
Kapitel 3
Wie bereits weiter oben erlutert, funktioniert die automatische Zuordnung des Custom Action-Servers
nur fr Dateien, die ber ein PE-Header verfgen. Bei Skriptdateien oder der Verwendung von
Skriptcode funktioniert diese Automatik somit nicht, so dass eine manuelle Zuordnung erfolgen muss.
Hierfr steht das Attribut msidbCustomActionType64BitScript zur Verfgung, dass der Spalte Type der
Tabelle CustomAction anzufgen ist. Bei der Verwendung von Windows Installer-XML erfolgt die
Zuordnung ber das Attribut Win64 des Elementes <CustomAction/>, wie auch Listing 3.30 zeigt.
Wie bei den Objektdateien, wird die Verwendung des jeweiligen Custom Action-Servers dem
Installationsprotokoll ebenfalls angefgt.
<!--Visual Basic-Skript verwenden-->
<Binary Id="VBScript" SourceFile=".\Binaries\GetInfos.vbs" />
<!--Definition der benutzerdefinierten Aktion-->
<CustomAction Id="CheckEnvironment" BinaryKey="VBScript" VBScriptCall="Main"
Win64="yes" Execute="immediate"/>
<!--Einordnung in die Ausfhrungssequenz-->
<InstallExecuteSequence>
<Custom Action="CheckEnvironment" Before="LaunchConditions"/>
</InstallExecuteSequence>
Ausfhrbare Dateien, die als benutzerdefinierten Aktionen verwendet werden, bentigen keine
besondere Kennzeichnung, denn sie werden im eigenen Prozessraum ausgefhrt und sind somit auf
keinen Host-Prozess angewiesen.
Richtlinien
Es ist erkennbar, dass die Erstellung und Konfiguration von Installationspaketen fr unterschiedlichen
Plattformen und Prozessorarchitekturen als nicht trivial zu bezeichnen ist. Aus diesem Grund sollten
die folgenden Dinge bei der Erstellung eines 64-Bit-Paketes beachtet werden:
Verwenden sie das Windows Installer-Datenbankschema 200oder hher. Legen Sie die Version
2.0 als minimale Windows Installer-Version fest, die bentigt wird, um das Paket zu installieren.
Hierzu ist die Eigenschaft PID_PAGECOUNT im Summary Information Stream auf den Wert
200zu setzen. Frhere Versionen des Windows Installers lassen die Installation von 64-BitPaketen nicht zu.
Legen Sie die erforderliche Prozessorarchitektur fr dieses Paket fest. Verwenden Sie den Wert
Intel64 in der Eigenschaft PID_TEMPLATE des Summary Information Streams, falls das Paket
auf einer IA64-Plattform ausgefhrt werden soll. Verwenden Sie hingegen den Eigenschaftswert
x64 um die Ausfhrung auf einem x64 System, also EM64T und AMD64 zu ermglichen. Ein
Paket kann nicht mehrere Plattformen untersttzen. Daher sind die Eigenschaftswerte
Intel64,x64, Intel,x64 oder Intel,Intel64 ungltig.
Identifizieren sie jede 64-Bit Komponente, indem sie in der Spalte Attributes der Tabelle
Component das Attribut msidbComponentAttributes64bit verwenden.
Verwenden sie Bedingungen um die Version des 64-Bit-Betriebssystems zu prfen, falls dieses
146
Kapitel 3
erforderlich ist. Hierzu ist die Eigenschaft VersionNT64 zu verwenden. Diese Eigenschaft wird nur
unter 64-Bit gesetzt; bei 32-Bit befindet sich diese Eigenschaft in einem nicht definierten Zustand.
Verwenden sie Bedingungen um die Prozessorarchitektur und den numerischen Prozessor-Level zu
bestimmen, falls dieses erforderlich sein sollte. Verwenden sie hierzu die Eigenschaften Intel,
Intel64 oder Msix64.
Verwenden Sie die Tabelle AppSearch und die gleichnamige Aktion, um in der
Systemregistrierung nach existierenden 64-Bit-Elementen zu suchen, falls das erforderlich sein
sollte. Ergnzen Sie hierzu in der Tabelle RegLocator den Inhalt der Spalte Type um das Attribut
msidbLocatorType64bit.
Verwenden sie zum Bestimmen der Pfade zu den 64-Bit-Systemordnern die Eigenschaften
System64Folder, ProgramFiles64Folder und CommonFiles64Folder. Fr die 32-Bit-Systemordner
sind die Eigenschaften SystemFolder, ProgramFilesFolder und CommonFilesFolder zu
verwenden.
Stellen sie sicher, dass die Anwendung die korrekte GUID verwendet, falls sie 64-Bit
Komponenten ber den Mechanismus der qualifizierten Komponenten referenziert. Falls eine
Komponente sowohl in einer 32-Bit und einer 64-Bit Variante vorliegt, verfgen diese ber
unterschiedliche IDs.
Stellen sie sicher, dass die Komponente mit ODBCDriverManager64 bezeichnet wird, fall sie
einen 64-Bit ODBC Driver Manager installieren mchten. Der ODBC Driver Manager ist dieser
Komponente hinzuzufgen. Er wird installiert, falls es erforderlich sein sollte.
Stellen sie sicher, dass die Installation nur 32-Bit-Betriebssystemdienste verwendet, die als
ausfhrbare Datei vorliegen. Ein 64-Bit-Paket kann keine 32-Bit-Dienste aufrufen, die als
Objektbibliothek vorliegen.
Stellen sie sicher, dass die Eintrge in INI-Dateien richtig zugeordnet werden, falls eine
Anwendung koexistierende 32-Bit und 64-Bit-Varianten einer Komponente installiert.
Stellen sie sicher, dass 32-Bit-Patches nur auf 32-Bit-Dateien und 64-Bit-Patches nur auf 64-BitDateien angewendet werden.
32-Bit-Anwendungen die im WOW64-Subsystem ausgefhrt werden, benutzen eine andere Sicht
auf die Systemregistrierung als 64-Bit-Anwendungen. Durch die Spiegelung der Registrierung wird
erreicht, dass Eintrge der Systemregistrierung im 32-Bit-Bereich und 64-Bit-Bereich synchron
gehalten werden. Um diese Funktionalitt zu deaktivieren ist fr die entsprechende Komponente, in
der
Tabelle
Component
der
Spalte
Attribut
das
Attribut
msidbComponentAttributesDisableRegistryReflection anzufgen. Dieses Attribut steht nur mit dem
Windows Installer 4.0 und hher zur Verfgung und wird somit unter Verwendung der 64-BitVersionen von Windows 2000 und Windows XP ignoriert genauso ignoriert wie bei einem 32-BitBetriebssystem.
Nachdem das Installationspaket den Vorgaben entsprechend erstellt wurde, sollte einer fehlerfreien
Ausfhrung nichts mehr im Wege stehen. Falls es dennoch zu Fehlern kommen sollte, geben die
Fehlernummern darber Auskunft, ob es sich um eine 64-Bit-Problematik handelt.
1633: Das Installationspaket ist fr diese Plattform nicht geeignet. Hier wird versucht ein 64-BitPaket auf einer 32-Bit-Plattform oder ein 64-Bit-Paket auf einer inkompatiblen 64-Bit-Plattform zu
installieren.
2401. Es wird versucht eine 64-Bit-Operation in der Systemregistrierung eines 32-Bit-
147
Kapitel 3
Betriebssystems durchzufhren.
2943: Es wird versucht das Advertise-Skript eines 64-Bit-Paketes auf einem inkompatiblen
Betriebssystem auszufhren.
Um im Vorfeld alle Faktoren zu bercksichtigen, die bei der Entwicklung von 64-Bit-Paketen zu
beachten sind, ist bei einer Validierung die berprfungsart ICE80 besonders zu beachten.
Fazit
Auf den aktuellen 64-Bit-Plattformen knnen sowohl 32-Bit-Anwendungen, als auch 64-BitAnwendungen ausgefhrt werden. Die Installation einer 32-Bit-Anwendung und die Entwicklung eines
geeigneten Installationspaketes sind nahezu identisch mit den Vorgaben, die bei Installationen fr die
32-Bit-Plattform gelten. Das bedeutet aber auch, dass einige abweichende Verhaltensmuster existieren,
die besonders zu bercksichtigen sind. Diese Verhaltensmuster sind darauf zurckzufhren, dass 32Bit- und 64-Bit-Anwendungen voneinander isoliert abgelegt werden und somit die Anwendung eine
andere Sicht auf das System erhlt. Die Erstellung eines Installationspaketes zur Installation einer 64Bit-Anwendung weicht nicht wesentlich von den bekannten Vorgehensweisen ab. Wie auch bei der
Anwendungsentwicklung, sind bei der Erstellung solcher Pakete bestimmte Regeln zu beachten und
einige Vorberlegungen anzustellen. Nur wenn die unterschiedlichen Plattformeigenheiten auch
Beachtung finden, kann die Funktionsfhigkeit der zu installierenden Anwendung sichergestellt
werden.
148
Kapitel 4
Allgemeine Informationen
Struktur und Objektmodell
Benutzerdefinierte Aktionen
Fazit
149
151
161
174
Der Windows Installer stellt seit jeher eine Schnittstelle zur Verfgung, mit der programmtechnische
Zugriffe auf interne Strukturen und Funktionen des Windows Installers realisiert werden knnen. Der
Zugriff kann hierbei ber die Funktionen des Windows Installer-API oder durch die Verwendung des
Windows Installer Objektmodells erfolgen. Beide Zugriffsmodelle haben ihre Vor- und Nachteile,
wobei die grten Probleme dadurch entstehen, dass die Modelle auf Technologien abzielen, die in
aktuellen Entwicklungsprojekten kaum noch verwendet werden. Die aktuellen Entwicklungstrends
verwenden eine Programmierlandschaft, die auf Basis einer verwalteten Sprache des Microsoft .NET
Frameworks realisiert wird. Der Windows Installer bietet jedoch keine direkte Zugriffsschicht fr
solche Implementierungen, so dass ein entsprechender Zugriff einige Probleme aufwirft. Die
Deployment Tools Foundation ist eine Sammlung von Klassenbibliotheken, die den Zugriff auf die
Windows Installer-Funktionalitt fr .NET ermglicht.
Allgemeine Informationen
Um es vorweg zu nehmen, ich bin ein sehr groer Fan der Deployment Tools Foundation, denn ich
nutze diese bereits seit mehr als 5 Jahren sehr intensiv. Die Deployment Tools Foundation wurde
ursprnglich unter der Bezeichnung Managed Libraries for Windows Installer als interne
Toolsammlung bei Microsoft entwickelt und verwendet. Erst vor kurzem wurde die Deployment Tools
Foundation in die Toolsammlung Windows Installer-XML integriert und steht somit der breiten Masse
zur Verfgung.
Funktionalitt
Bei der Deployment Tools Foundation handelt es sich um eine Sammlung von .NETKlassenbibliotheken und sonstigen Ressourcen, mit denen die Bereitstellungs-Technologien der
Windows-Plattform der .NET-Welt zugnglich gemacht werden. Dieses wird realisiert durch die
Bereitstellung eines Basis-Frameworks, dessen Funktionalitt von Tools und Anwendungen genutzt
werden kann, um ein Softwareprodukt im gesamten Lebenszyklus zu verwalten. Diese
Inventarisierungsmglichkeit ist aber noch nicht alles, denn es ist ebenfalls mglich ein
Installationspaket zu entwickeln, zu analysieren, zu testen und auch zu debuggen. Darber hinaus kann
die Funktionalitt auch im Installationsprozess und zur Laufzeit der Anwendung verwendet werden.
149
Kapitel 4
Das bedeutet, dass die Entwicklung von Bootstrapper- oder Chainer-Anwendungen, externen
Benutzeroberflchen und auch benutzerdefinierte Aktionen hiermit hervorragend umgesetzt werden
kann. Es besteht natrlich auch die Mglichkeit funktionsspezifische Implementierungen in
Anwendungen zu integrieren, um somit zur Laufzeit den Zugriff auf die Bereitstellungs-Plattform zu
ermglichen. Unabhngig vom tatschlichen Einsatzzweck sollte der Vorteil der Deployment Tools
Foundation deutlich geworden sein. Hiermit ist es endlich mglich, Installationsspezifische Aufgaben
in einer modernen Programmiersprache zu erstellen und hierbei das gesamte Funktionsspektrum der
darunter liegenden Technologie nutzen zu knnen. Ein Beispiel hierfr knnte LINQ (Language
INtegrated Query) sein. Diese Funktionalitt ist neu im Microsoft .NET Framework 3.5 und ermglicht
den Zugriff auf beliebige Objekte in einer typisierten Abfragesprache. Mit der Deployment Tools
Foundation ist es nun mglich ein Installationspaket zu ffnen und mit Hilfe von LINQ die Inhalte der
Tabellen zu ermitteln und weiter zu verwenden, wie das auch im Listing 4.31 demonstriert wird.
private void ViewFiles(string fileName)
{
// Datenbank ffnen
using (QDatabase db = new QDatabase(fileName))
{
// Dateien der Tabelle File ermitteln, die grer als 1000 Byte sind.
var files = from a in db.Files
where a.FileSize > 1000
select a;
// Ausgabe
foreach (var a in files)
Console.WriteLine(a);
}
}
Listing 4.31: Zugriff auf die Inhalte eines Installationspaketes mit LINQ
Das vorliegende Beispiel ist einfach gehalten und soll lediglich die Mchtigkeit der Deployment Tools
Foundation andeuten. Im Verlauf dieses Kapitels werden noch weitere Beispiele folgen.
150
Kapitel 4
Abbildung 4.25: Auswahl der Deployment Tools Foundation bei der Installation von Windows Installer-XML
Nach der erfolgreichen Installation sind die relevanten Ressourcen standardmig im Ordner
%ProgramFiles%\Windows Installer XML v3\SDK zu finden. In dem Ordner befinden sich einige
Dateien, von denen die in Tabelle 4.36 aufgefhrten Assemblies fr den programmtechnischen Zugriff
am relevantesten sind.
Datei
Beschreibung
Microsoft.Deployment.Compression.dll
Microsoft.Deployment.Compression.Cab.dll
Microsoft.Deployment.Compression.Zip.dll
Microsoft.Deployment.Resources.dll
Microsoft.Deployment.WindowsInstaller.dll
Microsoft.Deployment.WindowsInstaller.Linq.dll
Microsoft.Deployment.WindowsInstaller.Package.dll
151
Kapitel 4
Microsoft.Deployment.WindowsInstaller.dll nimmt die tragende Rolle ein, denn hierbei handelt es sich
vornehmlich um die Umsetzung der standardmigen Programmierschnittstelle des Windows Installers
in Form von verwaltetem Code. Das Hauptobjekt ist hierbei die Klasse Installer des Namensraums
Microsoft.Deployment.WindowsInstaller, die statische Funktionen vornehmlich zur Steuerung der
Installation bereitstellt. Die Methoden und Eigenschaften dieser Klasse sind in Abbildung 4.26
dargestellt.
Die Installation eines Produktes kann durch die Verwendung der Funktion Installer.InstallProduct()
veranlasst werden. Dem Funktionsaufruf sind der Pfad zum Installationspaket und eine optionale
Befehlszeile zu bergeben. Schlgt die Installation fehl oder wird sie vom Benutzer abgebrochen, wird
eine entsprechende Ausnahme ausgelst, auf die individuell reagiert werden kann. Die Darstellung der
Benutzeroberflche kann durch die Funktion Installer.SetInternalUI() beeinflusst werden, genauso wie
152
Kapitel 4
die Erstellung eines Protokolls durch Installer.EnableLog() ermglicht wird. Letztlich sind die
Funktions- und Eigenschaftsbezeichnungen verstndlich gewhlt, so dass die Verwendung dieser
Klasse sehr einfach mglich ist.
153
Kapitel 4
Abbildung 4.27: Klassendiagramm fr den Zugriff auf die Inhalte eines Installationspaketes
Ich mchte die Verwendung einiger Objekte anhand eines Beispiels demonstrieren. Die
Aufgabenstellung ist im Prinzip recht einfach. Es sollen alle im Installationspaket enthaltenen
154
Kapitel 4
Der in Listing 4.32 dargestellten Funktion IsCompressed() wird ein Objekt vom Typ SummaryInfo
bergeben. Wie in Abbildung 4.27 ersichtlich, kann dieses Objekt ber die gleichnamige Eigenschaft
des Objektes Database angesprochen werden. Die Eigenschaft PID_WORDCOUNT ist ein Bit-Feld,
durch das unterschiedliche Funktionalitten abgedeckt werden. Fr das Beispiel ist nur die Eigenschaft
compressed relevant, die von der Funktion auch zurckgegeben wird.
Die Hauptfunktion zum Extrahieren und entpacken der Archive ist in Listing 4.33 dargestellt. Im
ersten Schritt wird die Datenbank im schreibgeschtzten Modus geffnet und somit ein Objekt vom
Typ Database zurckgeliefert. Danach folgt dann der bereits erluterten Funktionsaufruf zum
Auswerten des Summary Information Streams, dem die Eigenschaft db.SummaryInfo bergeben wird.
internal static void Extract(string packageFileName, string outputFolder)
{
// Datenbank ffnen
using (Database db = new Database(packageFileName, DatabaseOpenMode.ReadOnly))
{
// Prfen ob komprimierten Ressourcen verwendet werden
if (IsCompressed(db.SummaryInfo))
{
// Prfen, ob die Tabelle Media vorhanden ist
if (db.IsTablePersistent("Media"))
{
// Alle Eintrge der Spalte Cabinet der Tabelle Media abrufen
IList<string> cabinetFiles = db.ExecuteStringQuery("SELECT DISTINCT `Cabinet` FROM `Media`");
// Alle Eintrge durchlaufen
foreach (string cabinett in cabinetFiles)
{
// Prfen ob ein Archiv angegeben wurde und ob es ein eingebettetes Archiv ist
if (!string.IsNullOrEmpty(cabinett) && cabinett.StartsWith("#"))
{
// Name des Archivs bestimmen
string cabinetName = cabinett.Substring(1);
// Archiv extrahieren und unter einem temporren Dateinamen speichern
155
Kapitel 4
}
}
}
Im Folgenden wird geprft, ob die Tabelle Media berhaupt vorhanden ist, bevor der Inhalt dieser
Tabelle abgefragt wird. Der Windows Installer stellt fr solche Flle eine Abfragesprache zur
Verfgung, die einen eingeschrnkten SQL-Funktionsvorrat (Structured Query Language) enthlt und
daher auch sinngem zu verwenden ist. Das Ergebnis dieser Abfrage ist eine Zeichenfolgen-Liste, in
der alle Inhalte der Spalte Cabinet abgelegt sind. Anschlieend wird bei jedem Eintrag geprft, ob
dieser mit dem Prfix # versehen ist. Dieses ist insofern relevant, da nur so gekennzeichnete Archive
physisch im Installationspaket enthalten sind und somit extrahiert werden knnen.
Wurde festgestellt, dass es sich um ein eingebettetes Archiv handelt, wird die Funktion
ExtractArchive() aufgerufen, die im Listing 4.34 nachfolgend aufgezeigt wird. Diese Funktion
extrahiert die jeweilige Kabinettdatei und speichert sie unter einem temporren Dateinamen ab. Der
Dateiname wird von der Funktion zurckgegeben, so dass er zum entpacken der enthaltenen
Ressourcen verwendet werden kann.
Das
Entpacken
der
Archive
erfolgt
unter
Verwendung
des
Objektes
Microsoft.Deployment.Compression.Cab.CabInfo, dem beim Erzeugen der Name des Archivs zu
bergeben ist. Schlielich ist nur noch die Methode CabInfo.Unpack() aufzurufen, um die Ressourcen
im Ausgabeordner abzulegen.
private static string ExtractArchive(Database db, string cabinetName)
{
// Dateiname konstruieren
string outputFileName = Path.GetTempFileName();
// Ansicht ffnen
using (View view = db.OpenView("SELECT `Name`, `Data` FROM `_Streams` WHERE `Name` = '{0}'",
cabinetName))
{
// Datensatz abrufen
view.Execute();
Record record = view.Fetch();
if (record == null)
throw new InstallerException();
// Stream extrahieren
record.GetStream("Data", outputFileName);
record.Close();
}
return (outputFileName);
}
156
Kapitel 4
Die Funktion ExtractArchive() wurde bereits zuvor im berblick erlutert. Es ist erkennbar, dass
zunchst ein temporrer Dateiname erzeugt wird, unter dem das extrahierte Archiv gespeichert werden
soll. Anschlieend wird ein Objekt vom Typ View erstellt, das letztlich das Ergebnis einer Abfrage
reprsentiert und auf das ber ein Objekt vom Typ Record zugegriffen werden kann. Somit wird das
Archiv durch die Funktion Record.GetStream() extrahiert. Beim ermitteln des Archivs ist noch zu
beachten, dass integrierte Kabinettdateien im Speicherbereich Streams abgelegt werden, auf den ber
die Systemtabelle _Streams zugegriffen werden kann.
Eine alternative Mglichkeit zur Erzielung eines hnlichen Ergebnisses liegt in der Verwendung der
Klasse Microsoft.Deployment.WindowsInstaller.Package.InstallPackage. Hierbei handelt es sich um
ein Objekt, mit dem die zu installierenden Dateien und Verzeichnisse eines Installationspaketes
verwaltet werden knnen. Zum Extrahieren der Dateien stellt dieses Objekt die Funktion ExtractFiles()
zur Verfgung, wie es auch in Listing 4.35 gezeigt wird. Allerdings kann bei Nutzung dieser
Funktionalitt der Ausgabeordner nicht direkt beeinflusst werden, denn er wird hierbei durch die
internen Strukturen des Paketes bestimmt. Zustzlich zu der gerade erluterten Klasse, enthlt das
Assembly Microsoft.Deployment.WindowsInstaller.Package.dll noch weitere interessante Objekte, mit
denen Informationen zu Patches und Transformationen abgerufen werden knnen, wie das auch im
Kapitel 10 dieses Buches noch vertieft wird.
internal static void ExtractPackage(string packageFileName)
{
// Paket ffnen
using (InstallPackage package = new InstallPackage(packageFileName, DatabaseOpenMode.ReadOnly))
{
// Dateien extrahieren
package.ExtractFiles();
}
}
Was in der bisherigen Betrachtung noch fehlt ist das Objekt vom Typ Session. Dieses Objekt stellt eine
aktive Installations-Session dar, und kann verwendet werden, um den Installationsprozess zu
kontrollieren. Die Erstellung erfolgt durch die Funktionen Installer.OpenPackage() und
Installer.OpenProduct(), die bei erfolgreichem Aufruf ein solches Objekt zurckliefern. Ein kurzes
Beispiel zeigt Listing 4.36.
internal static void CreateSession(string packageFileName, string targetDirectory)
{
// Session ffnen
using (Session session = Installer.OpenPackage(packageFileName, true))
{
// Aktionen ausfhren
session.DoAction("CostInitialize");
session.DoAction("FileCost");
session.DoAction("CostFinalize");
// Zielverzeichnis ndern und nderung im Protokoll vermerken
session.SetTargetPath("APPLICATIONFOLDER", targetDirectory);
session.Log("Zielverzeichnis gendert in: {0}", targetDirectory);
// Anforderungsstatus der Komponenten prfen und ausgeben
157
Kapitel 4
In dem vorliegenden Beispiel wird der Installationsprozess gestartet und einige Standardaktionen
aufgerufen. Anschlieend wird das Zielverzeichnis verndert und diese nderung dem
Installationsprotokoll angefgt. Letztlich wird noch der Anforderungsstatus der Komponenten ermittelt
und mit dem Namen der Komponente ausgegeben. Anhand dieser wenigen Programmzeilen sollte die
Mchtigkeit des Session-Objektes deutlich geworden sein, denn die Steuerung des
Installationsprozesses beispielsweise durch einen individuell gestaltetet Debugger ist alles andere als
trivial. Die Relevanz des Objektes bleibt ebenfalls unbestritten, denn gerade bei der Verwendung von
benutzerdefinierten Aktionen kann hierauf nicht verzichtet werden, wie dieses auch an spterer Stelle
noch aufgezeigt wird.
Inventarisierung
Die bisherigen Funktionen bezogen sich im Wesentlichen auf das Installationspaket und die
enthaltenen Bauteile und Ressourcen. Die Deployment Tools Foundation stellt darber hinaus noch
eine Vielzahl von Funktionen zur Verfgung, die im Rahmen der Inventarisierung von Produkten und
Patches verwendet werden knnen. Es ist bekannt, dass whrend der Installationen eine groe Anzahl
von Konfigurationsinformationen, vornehmlich in der Systemregistrierung abgelegt werden. Diese
Informationen beziehen sich nicht nur auf die Eintragungen in der Windows Installer-Datenbank,
sondern auch auf die vom Windows Installer-Service bentigten Einstellungen. Durch diese
Einstellungen wird beispielsweise das vollstndige Deinstallieren der Anwendung oder die
automatische Reparatur einer defekten Installation ermglicht. Darber hinaus sind hier auch
Metainformationen zu finden, die Auskunft ber das installierte Produkt, den Installationszeitpunkt
und die Installationsquellen geben.
Obwohl die bentigten Informationen in der Systemregistrierung zu finden sind, auf die relativ einfach
zugegriffen werden kann, bleibt die Bereitstellung der Inventarisierungsfunktionalitt unbestritten.
Dieses ist darauf zurckzufhren, dass die erforderlichen Informationen an unterschiedlichen
Positionen der Systemregistrierung zu finden sind. So ist beispielsweise der Ablageort von Produkten
vom Installationskontext abhngig:
Per-User-Non-Managed: HKCU\Software\Microsoft\Installer\Products\
Per-User-Managed:
HKLM\Software\Microsoft\Windows\CurrentVersion\Installer\Managed\<SID>\Products\
Per-Machine: HKLM\Software\Classes\Installer\Products\
Zustzlich kommen noch weitere Ablageorte ins Spiel, denn die gerade geschilderten Informationen
beziehen sich nur auf die Verffentlichung aber nicht auf die tatschlichen Eigenschaften eines
Produktes, die wiederum an anderen Positionen zu finden sind, wie dieses auch Abbildung 4.28 zeigt.
Dieses ist jedoch noch nicht alles, denn wie im Kapitel 3 bereits erlutert wurde, gibt es auf einem 64Bit-System noch eine Bit-Spezifische Unterteilung der Systemregistrierung, so dass diese Ablageorte
ebenfalls zu bercksichtigen sind.
158
Kapitel 4
Besondere Beachtung mssen auch die vom Windows Installer bentigten Identifikationsmerkmale
erfahren, der zu diesem Zweck die folgenden Darstellungsformen einer GUID verwendet:
Standard-GUID: {012F8BAC-80EA-43fc-BA96-CB6FFBE952A1}
Gepackte GUID: CAB8F210AE08CF34AB69BCF6BF9E251A
Komprimierte GUID: 7HIH!$RBq9`O-xKW14q[
Die Problematik liegt nun darin begrndet, dass diese Darstellungsformen funktionsabhngig
verwendet werden. Hieraus folgt, dass bei einer manuellen Analyse entsprechende Querverknpfungen
bercksichtigt werden mssen, wobei die Darstellungsformen umzurechnen sind. Es sollte deutlich
geworden sein, dass eine detaillierte Inventarisierung des Systems unter Verwendung eines manuellen
Lsungsansatzes uerst komplex ist und potentielle Fehlerquellen birgt. Aus diesem Grund ist es
umso wichtiger, dass geeignete Funktionen zur Verfgung stehen, mit denen eine Analyse auf elegante
Art und Weise durchgefhrt werden kann. Die Deployment Tools Foundation stellt fr diese Zwecke
einige Klassen zur Verfgung, die objektspezifisch zu verwenden sind. Einige dieser Klassen mit den
enthaltene Eigenschaften, Methoden und Beziehungen werden in Abbildung 4.29 dargestellt.
159
Kapitel 4
Aus dem Klassendiagramm wird ersichtlich, dass drei unterschiedliche Objekttypen abgefragt werden
knnen. Die Klasse ProductInstallation dient hierbei zur Ermittlung der installierten Produkte und die
Klasse PatchInstallation ermittelt die installierten Patches, wie es auch spter in Kapitel 10 noch
dargestellt wird. Die Klasse ComponentInstallation dient zur Ermittlung der auf dem System
befindlichen Komponenten, wobei zustzliche Statusinformationen und auch die verwendeten Clients
mit ausgegeben werden. Ein Beispiel dazu zeigt Listing 4.37.
internal static void GetComponentInformation(string componentCode)
{
// Instanz des Objektes erstellen
ComponentInstallation component = new ComponentInstallation(componentCode);
if (component != null)
{
// Status und Pfad ausgeben
Console.WriteLine(component.State.ToString());
Console.WriteLine(component.Path);
// Alle Clients ermitteln und einige Daten ausgeben
160
Kapitel 4
Listing 4.37: Ermitteln des Komponenten-Status und der Clients die sie verwenden
Der Klassiker im Rahmen der Inventarisierung ist sicherlich die Ermittlung der installierten Produkte.
Dieses ist jedoch unter Verwendung der Klasse ProductInstallation der Deployment Tools Foundation
relativ unspektakulr und einfach durchfhrbar. Dennoch gibt es hierbei eine Vielzahl von Optionen,
die zustzliche Mglichkeiten bereitstellen. Die Eigenschaft SourceList enthlt eine Liste mit den
verwendeten Installationsquellen, die ber diese Eigenschaft auch nachtrglich verndert werden
knnen. Mit Hilfe der Methode GetRelatedProducts() knnen alle Produkte ermittelt werden, die ber
einen identischen Upgradecode verfgen und unter Verwendung der Eigenschaft ProductCode ist es
wiederum mglich auf andere Windows Installer-Funktionen zuzugreifen. Das folgende Beispiel soll
das Zusammenspiel ein wenig verdeutlichen. Es werden zunchst alle Produkte ermittelt, die am
heutigen Tag installiert wurden. Anschlieend werden sie wieder deinstalliert, indem die Funktion
Installer.ConfigureProduct() aufgerufen wird.
internal static void DeinstallProducts()
{
// Alle Produkte abrufen die heute installiert wurden
var products = from p in ProductInstallation.AllProducts
where p.InstallDate == DateTime.Today
select p;
// Die gefundenen Produkte deinstallieren
foreach (var product in products)
{
Console.WriteLine("Deinstallation von: " + product.ProductName);
// Produkt deinstallieren
Installer.ConfigureProduct(product.ProductCode, 0, InstallState.Absent, string.Empty);
}
}
Listing 4.38: Ermitteln und deinstallieren der Produkte die heute installiert wurden
Im vorangegangenen Listing wird deutlich, dass bei der Ermittlung der installierten Produkte auch
andere Technologien des Microsoft .NET Frameworks verwendet werden, um hierdurch eine
effiziente, moderne und bersichtliche Implementierung zu erhalten.
Benutzerdefinierte Aktionen
Wie bereits im ersten Kapitel dieses Buches verdeutlicht, knnen die Standardaktivitten des
Installationsprozesses mit Hilfe von benutzerdefinierten Aktionen um eigene Implementierungen
erweitert werden. Hierbei kann der individuelle Code in unterschiedlichen Formaten vorliegen, wobei
die Verwendung einer Objektbibliothek das Optimum darstellt. Der Hauptgrund erstreckt sich auf die
Fhigkeit des Zugriffs auf die Installations-Session und die Mglichkeit die internen Ablufe zu
verndern. Leider bietet der Windows Installer keinen nativen Support zur Verwendung von .NETPersnliche Ausfertigung fr Martin Martinsson
161
Kapitel 4
Klassen als benutzerdefinierte Aktionen, so dass an dieser Stelle in C++ erstellte Bibliotheken
erforderlich sind. Dieses ist ungemein schade, denn der riesige Funktionsvorrat des Microsoft .NET
Frameworks wrde somit verschlossen bleiben. Um die Funktionalitt dennoch nutzen zu knnen,
stellt das .NET-Framework die Klasse System.Configuration.Install.Installer zur Verfgung.
Allerdings sollte aus den folgenden Grnden von dieser Mglichkeit Abstand genommen werden:
Bei System.Configuration.Install.Installer handelt es sich um eine verwaltete Version der
klassischen SelfReg-Funktionalitt. Dieses begrndet sich darauf, dass die Logik zum Verwenden
der benutzerdefinierten Aktion in der Komponente zu finden ist und nicht im Windows Installer.
Somit ist die Verwendung dieser Basisklasse zu Entwicklungszwecken und im Testbetrieb
durchaus geeignet; ihre Verwendung im produktiven Einsatz hingegen als durchaus kritisch zu
betrachten.
Die Registrierung von Betriebssystemdiensten und COM-Komponenten wird von
System.Configuration.Install.Installer durch eine eigene Logik realisiert, obwohl der Windows
Installer fr solche Einsatzzwecke Standardimplementierungen zur Verfgung stellt.
Eine benutzerdefinierte Aktion sollte datengesteuert ausgefhrt werden, so dass die tatschliche
Implementierungslogik von den zu verwendenden Informationen getrennt wird. Eine solche
Vorgabe kann durch Tabellen realisiert werden, auf die durch benutzerdefinierte Aktionen
zugegriffen wird. Diese Vorgehensweise ermglicht eine effektive Wiederverwendung der
Programmlogik und lsst die gesamte Implementierung transparenter erscheinen. Eine solche
Mglichkeit ist mit System.Configuration.Install.Installer nicht realisierbar, da der Zugriff auf die
Installations-Session und somit auf die Tabellen hiermit nicht mglich ist.
Zur
Ausfhrung
einer
benutzerdefinierten
Aktion,
die
auf
Grundlage
von
System.Configuration.Install.Installer erstellt wurde, muss sich das Assembly bereits auf dem
lokalen System befinden. Aus diesem Grund kann eine solche Implementierung nicht zur
Erstellung von benutzerdefinierten Aktionen mit sofortiger Ausfhrung verwendet werden und zu
Problemen fhren, falls das Assembly versehentlich gelscht wurde.
Es ist dennoch mglich eine .NET-Klasse als Grundlage einer benutzerdefinierten Aktion zu
verwenden. Die hierzu erforderliche Umsetzung wird durch eine Technologie erreicht, die als Inverse
Platform Invocation Service bezeichnet wird und in meinem letzten Buch ausfhrlich beschrieben
wurde.
Interne Ablufe
Die Deployment Tools Foundation enthlt ebenfalls eine Implementierung zur Erstellung von
benutzerdefinierten Aktionen in einer modernen .NET-Sprache. Diese Implementierung ist eine
optimierte Weiterentwicklung des Inverse Platform Invocation Service mit vielen zustzlichen
Funktionalitten.
Die Erweiterungen beziehen sich primr auf die Verwendung eines Proxys. Das bedeutet, dass
automatisch eine C++ Bibliothek erzeugt wird, die letztlich die Schnittstelle zum Windows Installer
darstellt. Die tatschliche Implementierung, also die erstellte .NET-Klasse befindet sich als
eingebettete und komprimierte Ressource innerhalb dieses Proxys. Beim Ausfhren der
benutzerdefinierten Aktion wird der Proxy vom Windows Installer im temporren Verzeichnis
abgelegt und die spezifizierte Funktion aufgerufen. Der Proxy extrahiert zunchst die eingebetteten
Ressourcen und erstellt eine Instanz der .NET-Klasse, wobei die konfigurierte Version der zu
verwendenden Laufzeitumgebung bercksichtigt wird. Letztlich wird der Funktionsaufruf an die
162
Kapitel 4
.NET-Klasse weiter geleitet. Die .NET-Klasse bentigt die Objekte aus dem Assembly
Microsoft.Deployment.WindowsInstaller.dll um auf die Installations-Session zuzugreifen. Aus diesem
Grund werden dieses Assembly und alle weiteren Referenzen ebenfalls in den Proxy integriert, so dass
sie whrend der Installation ebenfalls zur Verfgung stehen.
Die Verwendung einer verwalteten benutzerdefinierten Aktion hat den groen Vorteil, dass whrend
der Installation bereits auf den mchtigen Funktionsvorrat des .NET Frameworks zugegriffen und
dieses verwendet werden kann. Bei der Installation ist somit darauf zu achten, dass das Framework
bereits vorhanden ist und dass die Installation bei fehlenden Voraussetzungen abgebrochen wird.
Hierbei ist natrlich auch besonderes Augenmerk auf die richtige Version des .NET Frameworks zu
legen. Jede verwaltete benutzerdefinierte Aktion sollte mit einer Konfigurationsdatei versehen werden,
in der die erforderliche Version des .NET Frameworks festgelegt wird. Es ist zwar auch mglich, einen
generischen Ansatz zu fahren, aber hiervon wird ausdrcklich abgeraten, da es zu
Kompatibilittsproblemen mit knftigen Framework-Versionen kommen knnte. Was fr die
Installation gilt, ist natrlich auch fr den Deinstallationsprozess mageblich. Wird eine solche
benutzerdefinierte Aktion whrend der Deinstallation ausgefhrt, schlgt sie fehl, falls das .NET
Framework nicht oder in keiner entsprechenden Version vorhanden ist. Das bedeutet, dass es zu
Problemen fhren kann, falls der Benutzer das .NET Framework vor dem eigentlichen Produkt
deinstalliert. Auch fr solche Flle sollte eine Prfung der Systemvoraussetzungen integriert werden.
Werden diese Faktoren beachtet, sollte der Verwendung einer verwalteten benutzerdefinierten Aktion
nichts im Wege stehen.
163
Kapitel 4
Die Eintrge der Tabelle CustomAction sind wie bei einer nativen Bibliothek, also bei einer
benutzerdefiniertes Aktion des Basistyps 1 zu definieren. Verwaltete benutzerdefinierte
Aktionen knnen auf identische Weise, also als Immediate-, Deferred-, Rollback- oder CommitCustom-Action, verwendet werden.
Wird innerhalb der benutzerdefinierten Aktion eine Ausnahme ausgelst, die intern nicht behandelt
wurde, wird diese durch die Proxy-Funktion abgefangen. Die Fehlermeldung und die
Stapelberwachung (Stack Trace) werden dem Installationsprotokoll angefgt und die Aktion wird
mit einem Fehlercode beendet.
Ich denke, dass die dargestellten Richtlinien und Vorgaben keine weitreichenden Folgen offenbaren
und auch relativ einfach umzusetzen sind. Ein kleines Beispiel soll dieses verdeutlichen. Es soll der
Installationspfad einer Anwendung durch eine benutzerdefinierte Aktion auf das Verzeichnis der
Common Language Runtime festgelegt werden. Hierbei ist zu bercksichtigen, dass das Verzeichnis
von der aktuell installierten Version des Microsoft .NET Frameworks und der verwendeten ProzessorArchitektur abhngig ist. Aus diesem Grund sollte eine spezielle Funktion im Microsoft .NET
Framework verwendet werden, die dieses Verzeichnis ermittelt. Im Weiteren soll diese Festlegung nur
erfolgen, wenn eine spezifische Eigenschaft im Installationspaket festgelegt wurde.
[CustomAction]
public static ActionResult SetTargetPath(Session session)
{
// Prfen ob der Pfad verndert werden soll
bool changePath = session["ChangePath"] == "1";
if (changePath)
{
// Neues Zielverzeichnis abrufen
string targetFolder = RuntimeEnvironment.GetRuntimeDirectory();
// Ausgabe ins Protokoll
session.Log("Change Property 'INSTALLLOCATION' to " + targetFolder);
// Zielverzeichnis setzen
session["INSTALLLOCATION"] = targetFolder;
// Funktion erfolgreich ausgefhrt
return ActionResult.Success;
}
else
{
// Funktion wurde nicht ausgefhrt
return ActionResult.NotExecuted;
}
}
Im nchsten Schritt ist die Konfigurationsdatei zu erstellen, in der die zu verwendende Version des
.NET Frameworks festzulegen ist. Die Struktur der Konfigurationsdatei entspricht dem
Standardschema fr solche Dateien, wie auch Listing 4.40 zeigt. Als Dateiname ist grundstzlich
CustomAction.config zu verwenden.
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
164
Kapitel 4
<supportedRuntime version="v2.0.50727"/>
</startup>
</configuration>
Zur Festlegung der Laufzeitumgebung ist dem Element supportedRuntime die entsprechende Version
zuzuordnen. Falls keine Version festgelegt wird, wird die Framework-Version verwendet, die am
besten zu der Variante passt, mit dem das Assembly Microsoft.Deployment.WindowsInstaller.dll
erzeugt wurde. Allerdings sollte hiervon Abstand genommen werden, denn dieses kann zu
Kompatibilittsproblemen mit zuknftigen Versionen des Frameworks fhren. Grundstzlich sollte
immer die Version festgelegt werden, mit der die benutzerdefinierte Aktion auch getestet wurde.
Nachdem alle Dateien erstellt wurden, kann die zu verwendende Objektbibliothek erzeugt werden.
Hierzu ist zunchst der klassische Kompiliervorgang durchzufhren, bei dem die Datei
Microsoft.Deployment.WindowsInstaller.dll ebenfalls zu referenzieren ist.
csc.exe
/target:library
/r:Microsoft.Deployment.WindowsInstaller.dll
/out:CAFilePath.dll
*.cs
Im nchsten Schritt ist der Proxy zu erstellen und die erforderlichen Dateien sind zu integrieren.
Hierbei
ist
zu
beachten,
dass
die
Dateien
CustomAction.config
und
Microsoft.Deployment.WindowsInstaller.dll nicht umbenannt werden, denn der Proxy bentigt die
Dateien mit exakt diesen Namen. Zum Erstellen des Proxys und zum integrieren der Dateien stellt die
Deployment Tools Foundation das Tool MakeSfxCA.exe zur Verfgung. Der Aufruf zum Erstellen des
Proxys gestaltet sich wie nachfolgend aufgefhrt.
MakeSfxCA.exe
ProxyPackage.dll
SfxCA.dll
CAFilePath.dll
CustomAction.config
Microsoft.Deployment.WindowsInstaller.dll
Natrlich sind die Pfade noch entsprechend anzupassen. Das Tool MakeSfxCA.exe und die Datei
Microsoft.Deployment.WindowsInstaller.dll
befinden
sich
standardmig
im
Ordner
%ProgramFiles%\Windows Installer XML v3\SDK. Bei der Datei SfxCA.dll handelt es sich um das
Grundgerst zum Erzeugen des Proxys. Diese Datei befindet sich in Abhngigkeit zur bentigten
Prozessorarchitektur im Unterordner x86 oder x64. Die Datei CAFilePath.dll wurde schlielich
im ersten Schritt erzeugt und bei ProxyPackage.dll handelt es sich um die Ausgabedatei, die alle
Dateien enthlt und letztlich in das Installationspaket integriert werden kann.
Tipp Beginn
Es ist mglich die Inhalte des Proxys zu betrachten. Hierzu kann die Proxy-Datei beispielsweise mit
winzip.exe geffnet werden.
165
Kapitel 4
Tipp Ende
Kapitel 4
dem Projekt noch weitere Dateien vorhanden, werden diese ebenfalls in den Proxy integriert, wenn die
Eigenschaft Build Action der Datei auf Content festgelegt wurde. Zustzliche Abhngigkeiten
(References) werden ebenfalls in den Proxy integriert, sofern es sich um keine Assemblies des Global
Assembly Cache handelt. Das bedeutet, dass zur Integration dieser Abhngigkeiten die Eigenschaft
Copy Local auf True zu setzen ist, wie auch in Abbildung 4.31 aufgezeigt wird.
Das finale Ergebnis des Kompiliervorgangs ist letztlich der Proxy. Hierzu wird zunchst auf klassische
Weise das .NET-Assembly erzeugt und alle weiteren Schritte werden durch einen Postbuild-Schritt
realisiert. Die hierzu erforderlichen Regeln und Bedingungen sind in der Datei
%ProgramFiles%\MSBuild\Microsoft\WiX\v3.0\wix.ca.targets beschrieben. Beim Erzeugen des
Projektes wird eine zustzliche DLL-Datei im Ausgabeverzeichnis abgelegt, die letztlich den Proxy
darstellt. Die Namensgebung orientiert sich an dem Namen des Assemblies, der jedoch nach dem
Schema $(TargetName).CA.dll angepasst wurde. Das bedeutet, dass fr ein Assembly mit der
Bezeichnung CAFilePath.dll ein Proxy mit der Bezeichnung CAFilePath.CA.dll erzeugt und im
Ausgabeverzeichnis abgelegt wird.
Ein weiterer Pluspunkt der sich bei der Nutzung von Visual Studio zur Erzeugung der
benutzerdefinierten Aktionen ergibt, ist das direkte Zusammenspiel mit Windows Installer-XML.
Nachdem die Objektbibliothek erzeugt wurde, muss diese natrlich noch in das Installationspaket
integriert werden, so dass sie auch im Installationsprozess aufgerufen werden kann. Die
Vorgehensweise hierzu ist denkbar einfach. Zunchst ist eine Projektmappe zu erzeugen der ein WIXProjekt und ein Custom Action-Projekt hinzugefgt wird. Alternativ kann natrlich auch ein WIX
Library-Projekt verwendet werden. Dem WIX-Projekt ist anschlieend eine Referenz auf das Custom
Action-Projekt hinzuzufgen. Hierdurch wurden alle Voraussetzungen geschaffen, um die
benutzerdefinierte Aktion in dem WXS-Dokument referenzieren zu knnen, wie das auch in Listing
4.41 gezeigt wird.
<!--Datei in den Binrstream intrgrieren-->
<Binary Id="CADLL" SourceFile="$(var.CAFilePath.TargetDir)$(var.CAFilePath.TargetName).CA.dll"/>
167
Kapitel 4
Execute="firstSequence"/>
Der an dieser Stelle relevanteste Punkt, betrifft die Integration des Proxys in den Binr-Stream. Die
Referenzierung erfolgt hierbei nicht ber absolute Pfadangaben sondern variabel unter Verwendung
von Projektreferenzen, wie dieses auch bereits in Kapitel 2 erlutert wurde. In Kapitel 6 wird die
Verwendung der gerade vorgestellten Funktionalitt anhand eines komplexen Beispiels zur Nutzung
des Neustart-Managers weiter vertieft.
Debuggen
Im Falle der fehlerhaften Ausfhrung von benutzerdefinierten Aktionen besteht vielfach die
Notwendigkeit, die Ausfhrung des Codes in einem Debugger zu betrachten. Die Vorgehensweise zur
Realisierung eines solchen Szenarios ist von dem Format abhngig, in dem die benutzerdefinierte
Aktion vorliegt. Der Windows Installer verwendet die Umgebungsvariable MsiBreak, um festzustellen,
ob eine benutzerdefinierte Aktion vom Typ Objektbibliothek im Debugger ausgefhrt werden soll.
Zur Verwendung dieser Umgebungsvariablen ist ihr der Name der jeweiligen benutzerdefinierten
Aktion zuzuweisen. Seit dem Windows Installer 2.0 kann MsiBreak als Benutzerumgebungsvariable
festgelegt werden, wodurch ein Neustart des Computers nicht erforderlich wird. Seit dieser Version
des Windows Installers wird die Umgebungsvariable ausschlielich geprft, wenn der Benutzer zur
Gruppe der Administratoren gehrt.
Zum Debuggen einer Objektbibliothek weisen Sie zunchst der Umgebungsvariablen MsiBreak den
Namen der jeweiligen benutzerdefinierten Aktion zu und starten Sie dann den Installationsprozess.
Beim Aufruf der benutzerdefinierten Aktion durch den Windows Installer erscheint eine Dialogbox in
der die ID des entsprechenden Prozesses angegeben ist. Verbinden Sie den Debugger mit diesem
Prozess, ffnen Sie die jeweiligen Programmquellen, setzen Sie die Haltepunkte und prfen Sie, ob die
Symboldateien der benutzerdefinierten Aktion geladen sind. Nach dem Schlieen der Dialogbox wird
die Ausfhrung der benutzerdefinierten Aktion am ersten Haltepunkt unterbrochen. Nun knnen Sie
schrittweise durch den Programmcode navigieren und die Problemquellen analysieren. Die
Verwendung der Umgebungsvariablen MsiBreak stellt einen einfachen Lsungsansatz dar, eine
benutzerdefinierte Aktion in einem Debugger zu analysieren. Falls Sie Zugriff auf den Quellcode der
benutzerdefinierten Aktion haben, knnen Sie die Aktion auch im Debugger ausfhren ohne die
Umgebungsvariable zu verwenden. Fgen Sie hierzu eine temporre Dialogbox an den Beginn des
Quellcodes. Nach dem Erscheinen dieses Dialoges im Installationsprozess verbinden Sie den Debugger
mit diesem Prozess.
Auch wenn es sich bei einer verwalteten benutzerdefinierten Aktion um eine Objektbibliothek handelt,
muss zum Debuggen eine leicht abgewandelte Vorgehensweise gewhlt werden. Das hat damit zu tun,
168
Kapitel 4
dass der zuvor beschriebene Dialog angezeigt wird, wenn die entsprechende Funktion des Proxys
aufgerufen wird. Um jedoch eine Mglichkeit zu erhalten, die Funktion innerhalb des .NET Assembly
zu debuggen, ist es erforderlich die Umgebungsvariable MMsiBreak anstelle von MsiBreak zu
verwenden. Setzen Sie diese auf den Namen des Einsprungpunktes der Funktion, die im Debugger
ausgefhrt werden soll. Standardmig entspricht der Name des Einsprungpunktes der
Funktionsbezeichnung, allerdings kann dieses durch das Attribut CustomActionAttribute verndert
werden. Falls also durch das CustomActionAttribute ein anderer Name vergeben wurde, ist dieser der
Umgebungsvariablen zuzuweisen. Im Installationsprozess prft der Proxy diese Vorgaben und falls er
eine Entsprechung findet, wird der Just-In-Time Debugger aufgerufen, wie dieses auch in Abbildung
4.32 demonstriert wird.
Die Ausfhrung wird angehalten nachdem das Assembly geladen aber bevor die Funktion aufgerufen
wurde. Nachdem der Debugger angefgt wurde, ist zunchst zu prfen ob die Symbole geladen
wurden. Anschlieend knnen Haltepunkte gesetzt werden und der Code im Debugger ausgefhrt
werden.
Hinweis Beginn
Erweiterte Implementierungen
Eine benutzerdefinierte Aktion mit verzgerter Ausfhrung wird innerhalb der Installationstransaktion
verwendet, um Modifikationen am System vorzunehmen. Eine solche Aktion kann jedoch nicht auf die
Elemente der aktuellen Installations-Session zugreifen. Ihr stehen nur Informationen des
Installationsskriptes zur Verfgung, so dass hier noch zustzliche Faktoren bercksichtigt werden
mssen.
Persnliche Ausfertigung fr Martin Martinsson
169
Kapitel 4
Wie in Kapitel 1 bereits erlutert, mssen die Informationen, die von der Implementierung bentigt
werden, durch eine Eigenschaftszuweisung dem Installationsskript angefgt werden, wobei als
Eigenschaftsname der Name der benutzerdefinierten Aktion zu verwenden ist. Zum besseren
Verstndnis mchte ich das Beispiel zum Hinzufgen eines Benutzerkontos aus Kapitel 1 nochmal
aufgreifen. Die benutzerdefinierte Aktion mit der Bezeichnung CreateUser veranlassen hierbei die
Erstellung des Benutzerkontos. Da diese jedoch innerhalb der Installationstransaktion ausgefhrt
werden soll, mssen die zu bercksichtigenden Informationen ebenfalls in das Installationsskript
bertragen werden. Hierzu kann eine weitere benutzerdefinierte Aktion verwendet werden. Die
Deklarationen werden natrlich in der Tabelle CustomAction vorgenommen, die somit die folgenden
Inhalte aufweist:
Action
Type
Source
Target
ExtendedType
CreateUser.SetProperty
51
CreateUser
Name=[ACCOUNTNAME];
Description=[ACCOUNTDESCRIPTION];
Password=[ACCOUNTPASSWORD]
CreateUser
3073
CADLL
AddAccount
Die benutzerdefinierte Aktion CreateUser ist fr das Hinzufgen des Benutzerkontos zustndig.
Hierdurch wird die Funktion AddAccount() aufgerufen, die sich in einer Objektbibliothek befindet, die
unter der Bezeichnung CADLL im Binr-Stream des Installationspaketes abgelegt wurde. Weiterhin
ist die Aktion als Typ 3073 (msidbCustomActionTypeDll + msidbCustomActionTypeBinaryData+
msidbCustomActionTypeInScript + nmsidbCustomActionTypeNoImpersonate) definiert, wodurch sie
whrend der Skriptausfhrung im Systemkontext verwendet wird. Die Aktion bentigt zwangslufig
Informationen zu dem anzulegenden Benutzerkonto. Da eine benutzerdefinierte Aktion mit verzgerter
Ausfhrung nicht auf die Informationen der Installations-Session zugreifen kann, mssen die
erforderlichen Daten dem Installationsskript angefgt werden. Dieses wird durch die
benutzerdefinierte Aktion CreateUser.SetProperty realisiert. Es ist zu erkennen dass im Feld Source
eine Referenz auf die Aktion CreateUser zu erkennen ist und dass im Feld Target die zu erforderlichen
Daten angegeben werden. Es besteht jedoch nur die Mglichkeit eine Zeichenfolge zu bergeben,
wodurch ein Algorithmus angewendet werden muss, mehrere Informationen zusammenzufassen.
Dieser Algorithmus ist individuell gestaltbar, da in der benutzerdefinierten Aktion eine Funktionalitt
enthalten sein muss, diese Zeichenfolge wieder in ihre Bestandteile zu berfhren.
Die Deployment Tools Foundation stellt bereits einen entsprechenden Parser zur Verfgung, der die
einzelnen Elemente der Zeichenfolge in eine Auflistung bertrgt, auf die ber den Namen zugegriffen
werden kann. Zur Verwendung dieses Parsers mssen die Informationen als Wertepaare bergeben
werden, wobei mehrere solcher Paare durch Semikolon voneinander getrennt werden mssen.
Name=Wert;[Name=Wert];[]
Nachdem die Aktionen in der Tabelle CustomAction definiert wurden, mssen sie noch aus der
Installationstransaktion aufgerufen werden. Hierzu ist es erforderlich sie der Tabelle
InstallExecuteSequence anzufgen, wobei sie sich zwischen den Aktionen InstallInitialize und
InstallFinalize befinden mssen.
Action
InstallInitialize
170
Condition
Sequence
1500
Kapitel 4
CreateUser.SetProperty
$C__Main.exe>2
4001
CreateUser
$C__Main.exe>2
4002
InstallFinalize
6600
Die Ausfhrung der Aktionen wurde von einer Bedingung abhngig gemacht, so dass das
Benutzerkonto nur erzeugt wird, wenn eine bestimmte Komponente installiert wird. Zu erkennen ist
weiterhin, dass die Eigenschaftszuweisung vor der eigentlichen benutzerdefinierten Aktion erfolgt.
Hierdurch werden die erforderlichen Argumente einer aktionsspezifischen Eigenschaft mit der
Bezeichnung CustomActionData zugewiesen, wie auch der nachfolgende Auszug des
Installationsprotokolls zeigt.
MSI (s) (0C:94) [15:24:06:732]: Doing action: CreateUser.SetProperty
MSI (s) (0C:94) [15:24:06:732]: PROPERTY CHANGE: Adding CreateUser property.
Its value is 'Name=MSI;Description=Windows Installer-Testaccount;Password=ABCDE*1'.
(s)
(s)
(s)
(s)
(0C:A0)
(0C:A0)
(0C:54)
(0C:54)
[15:24:06:779]:
[15:24:06:779]:
[15:24:06:810]:
[15:24:06:810]:
Bei der Betrachtung des Protokollauszugs ist auffallend, dass alle Informationen im Klartext
dargestellt werden, so dass hierdurch das Passwort offen gelegt wird. Um dieses zu vermeiden, sollten
benutzerdefinierte Aktionen, die sicherheitsrelevante Daten bentigen, mit dem Attribut
msidbCustomActionTypeHideTarget gekennzeichnet werden. Zur Realisierung ist in der Tabelle
CustomAction der Wert der Spalte Type fr die benutzerdefinierten Aktion CreateUser von 3073 auf
11265 zu ndern. Nach erfolgter nderung werden die Argumente im Installationsprotokoll durch
Platzhalter ersetzt.
MSI (s) (0C:78) [15:31:25:332]: Executing op: CustomActionSchedule(Action=CreateUser,ActionType=11265,
Source=BinaryData,Target=**********,CustomActionData=**********)
Eine benutzerdefinierte Aktion mit verzgerter Ausfhrung kann nur bestimmte Funktionen des
Windows Installer-API verwenden, da nur ein Zugriff auf das Installationsskript, jedoch nicht auf alle
Informationen der Installations-Session mglich ist. Die Eigenschaft CustomActionData steht hierbei
selbstverstndlich zur Verfgung, da hiermit die erforderlichen Informationen transportiert werden.
Der Zugriff auf die bertragenen Daten innerhalb der programmtechnischen Implementierung ist unter
Verwendung der Deployment Tools Foundation relativ einfach, wenn die Zuweisung der Wertepaare
nach dem obigen Schema erfolgt. Auf diese Informationen kann anschlieend ber das Objekt
Session.CustomActionData zugegriffen werden.
Die bisherigen Ausfhrungen bezogen sich ausnahmslos auf das Hinzufgen eines Benutzerkontos. In
einem Installationspaket fr den produktiven Einsatz wrden sich natrlich auch Implementierungen
zum Entfernen eines solchen Kontos finden. Die im Listing 4.42 dargestellte Implementierung zeigt
Persnliche Ausfertigung fr Martin Martinsson
171
Kapitel 4
172
Kapitel 4
Die Funktionen AddAccount() und RemoveAccount() stellen hierbei die Einsprungpunkte der
benutzerdefinierten Aktion dar. Die eigentliche Verarbeitung findet in der Funktion ManageAccounts()
statt, die von den zuvor genannten Funktionen aufgerufen wird. Zu Beginn wird durch
Session.GetMode() geprft, ob die Aktion verzgert oder whrend des Rollbacks ausgefhrt wird. Ist
dies nicht der Fall, wird die Installation an dieser Stelle abgebrochen und eine entsprechende
Information dem Installationsprotokoll angefgt. Im Anschluss werden Funktionen einer Hilfsklasse
aufgerufen, mit denen das Benutzerkonto letztlich erstellt oder entfernt wird. Diesen Funktionsaufrufen
werden Informationen zu dem Benutzerkonto bergeben, die ber die Eigenschaft CustomActionData
an die Implementierung bertragen wurden. Hierbei wird deutlich, dass sich diese Informationen in
einer Auflistung befinden, auf die ber den Namen des Eintrags zugegriffen werden kann. Was an
dieser Stelle natrlich noch fehlt ist die Gestaltung des Installationspaketes und die Definition der
benutzerdefinierten Aktionen.
<!-- Passwort sollte ber die Befehlszeile oder UI angegeben werden -->
<Property Id="ACCOUNTPASSWORD" Value="ABCDE*1" Secure="yes" Hidden="yes"/>
<Property Id="ACCOUNTNAME" Value="MSI" Secure="yes"/>
<Property Id="ACCOUNTDESCRIPTION" Value="Windows Installer-Testaccount" Secure="yes"/>
<!--Objektbibliothek dem Binr-Stream anfgen-->
<Binary Id="CADLL" SourceFile="$(var.ManageUsers.TargetDir)$(var.ManageUsers.TargetName).CA.dll"/>
<!--Benutzerdefinierte Aktionen-->
<CustomAction Id="DeleteUser.SetProperty" Property="DeleteUser" Value="Name=[ACCOUNTNAME]" />
<CustomAction Id="DeleteUser" BinaryKey="CADLL" DllEntry="RemoveAccount" Execute="deferred"
Impersonate="no" />
<CustomAction Id="CreateUser.SetProperty" Property="CreateUser"
Value="Name=[ACCOUNTNAME];Description=[ACCOUNTDESCRIPTION];Password=[ACCOUNTPASSWORD]" />
<CustomAction Id="CreateUser" BinaryKey="CADLL" DllEntry="AddAccount" Execute="deferred" HideTarget="yes"
Impersonate="no" />
<CustomAction Id="RollbackUser.SetProperty" Property="RollbackUser" Value="Name=[ACCOUNTNAME]" />
<CustomAction Id="RollbackUser" BinaryKey="CADLL" DllEntry="RemoveAccount" Execute="rollback"
Impersonate="no" />
<!--Einordnen in die Sequenztabelle-->
<InstallExecuteSequence>
<Custom Action="DeleteUser" Before="RemoveFiles" >$C__Main.exe=2</Custom>
<Custom Action="DeleteUser.SetProperty" Before="DeleteUser" >$C__Main.exe=2</Custom>
<Custom Action="RollbackUser.SetProperty" After="InstallFiles">$C__Main.exe>2</Custom>
<Custom Action="RollbackUser" After="RollbackUser.SetProperty">$C__Main.exe>2</Custom>
<Custom Action="CreateUser.SetProperty" After="RollbackUser">$C__Main.exe>2</Custom>
<Custom Action="CreateUser" After="CreateUser.SetProperty">$C__Main.exe>2</Custom>
</InstallExecuteSequence>
In dem vorliegenden Listing fllt das paarweise Auftreten der benutzerdefinierten Aktionen besonders
auf. Fr jede verzgert ausgefhrte Aktion existiert eine weitere benutzerdefinierte Aktion, die
relevante Daten dem Installationsskript anfgt. Die Wertepaare entsprechen hierbei der Namensgebung
innerhalb der Implementierung, so dass die bentigten Informationen auch verwendet werden knnen.
Im Weiteren ist in dem Listing die Implementierung fr den Rollback zu erkennen. Hierbei wird
ebenfalls die Funktion zum Entfernen des Benutzerkontos aufgerufen, denn fr die Implementierung
ist es unerheblich, ob dieses whrend der Deinstallation oder whrend des Rollbacks geschieht. Der
173
Kapitel 4
Unterschied liegt lediglich in der Definition der benutzerdefinierten Aktion. Hierdurch wird sie dem
Rollback-Skript angefgt und wird im Fehlerfall ausgefhrt, so dass die Konsistenz des Systems
gewhrleistet werden kann.
Fazit
Durch die Bereitstellung der Deployment Tools Foundation wird der programmtechnische Zugriff auf
die Windows Installer-Funktionalitt nun auch fr .NET-Anwendungen auf elegante Weise ermglicht.
Die Funktionalitten und Implementierungen sind uerst mchtig, so dass nahezu alle Anforderungen
hiermit umgesetzt werden knnen. Die Nutzung der Deployment Tools Foundation ist auch innerhalb
des Installationsprozesses mglich, denn hierdurch wird eine Mglichkeit geschaffen,
benutzerdefinierte Aktionen in einer .NET-Sprache zu erstellen und zu verwenden. Die Deployment
Tools Foundation ist Bestandteil der Toolsammlung Windows Installer-XML und ist daher ebenfalls
frei verfgbar. Die Nutzung im kommerziellen Umfeld ist ebenfalls gestattet, so dass der Nutzung
kaum Grenzen gesetzt werden.
174
Teil B
Installationen
unter Windows
Vista und
Windows Server
2008
Persnliche Ausfertigung fr Martin Martinsson
175
Kapitel 5
Benutzerkontensteuerung in Windows
Vista und Windows Server 2008
176
178
188
201
208
224
238
241
Dem Installationsprozess wird unter Windows Vista eine sehr hohe Bedeutung beigemessen, denn
durch fehlerhafte Implementierungen kann die Stabilitt des Betriebssystems und anderer
Anwendungen stark beeintrchtigt werden. Aus diesem Grund sehen die Zertifizierungsrichtlinien zur
Erlangung des Logos Certified for Windows Vista nur Click-Once und den Windows Installer als
mgliche Technologien fr die Anwendungsinstallation vor. Click-Once ist eine Technologie, die auf
dem Microsoft .NET Framework 2.0 basiert und die Vorteile einer webbasierten Verteilung auch fr
Windows Anwendungen mglich macht. Allerdings eignet sich Click-Once nicht fr jede Art von
Anwendung, da durch die isolierte Ausfhrung, der Zugriff auf Systemressourcen stark eingeschrnkt
ist.
Version
Anmerkungen
4.0.6000.16386
4.0.6001.18000
176
Wie jede Version des Windows Installers wurde auch der Windows Installer 4.0 um neue
Funktionalitten ergnzt und bestehende Funktionalitten wurden verndert. Die folgende Auflistung
zeigt diese neu hinzugefgten und genderten Funktionalitten gegenber der Windows Installer
Version 4.0.
Neue Funktionen
MsiGetPatchFileList()
Neue Eigenschaften
MSIARPSETTINGSIDENTIFIER
MsiLogging
MsiLogFileLocation
MsiSystemRebootPending
MsiRunningElevated
MSIRESTARTMANAGERCONTROL
MsiRestartManagerSessionKey
MSIDISABLERMRESTART
MSIRMSHUTDOWN
MSIUSEREALADMINDETECTION
Eigenschaften des Summary Information Streams
Die Eigenschaft Word Count (PID_WORDCOUNT) wurde um ein zustzliches Attribut erweitert,
durch das UAC-Konforme Installationspakete definiert werden knnen.
Genderte Datenbanktabellen
In der Spalte Attributes der Tabelle Component kann nun das Attribut
msidbComponentAttributesDisableRegistryReflection verwendet werden, um die Spiegelung der
Systemregistrierung bei 64-Bit-Betriebssystemen zu verhindern.
Die Tabelle Shortcut wurde um die Spalten DisplayResourceDLL, DisplayResourceId,
DescriptionResourceDLL und DescriptionResourceId erweitert.
Neuer Dialog
MsiRMFilesInUse
Neue Steuerelement-Attribute
ElevationShield
Neue Steuerelement-Ereignisse
RmShutdownAndRestart
Neue Fenster-Meldung
INSTALLLOGMODE_RMFILESINUSE
Neue Systemrichtlinien
DisableLoggingFromPackage
DisableAutomaticApplicationShutdown
Neue Methoden des Automations-Objektes
Persnliche Ausfertigung fr Martin Martinsson
177
Kapitel 5
Installer.AdvertiseProduct()
Installer.AdvertiseScript()
Installer.CreateAdvertiseScript()
Installer.ProvideAssembly()
Neue Eigenschaften des Automations-Objektes
Installer.PatchFiles
Installer.ProductElevated
Installer.ProductInfoFromScript
Der Windows Installer 4.0 adressiert schwerpunktmig die Themen Sicherheit, Verfgbarkeit
und Komfort. Dem Thema Sicherheit sind hierbei Technologien wie die Benutzerkontensteuerung
und der Windows-Ressourcenschutz zugeordnet. Die Funktionalitt des Neustart-Managers fllt
hingegen in die Kategorie Verfgbarkeit und die Themen Protokollierung und Mehrsprachigkeit
sind eindeutig dem Komfort anzurechnen.
Die Funktionalitt des Windows Installers 4.0 wird in den folgenden drei Kapiteln erlutert. In diesem
Kapitel geht es zunchst allgemein um Sicherheit und darauf aufbauend um die
Benutzerkontensteuerung. Das zweite Kapitel dieses Teils befasst sich dann mit den
Computerneustarts und der neuen Technologie des Neustart-Managers. Im dritten und letzten Kapitel
dieses Teils sind mehrere Themen zusammengefasst. So finden sich dort Erluterungen zum WindowsRessourcenschutz, zur Protokollierung und zu mehrsprachigen Benutzeroberflchen.
Sicherheit
Sicherheit nimmt bei den aktuellen Betriebssystemen einen immer hheren Stellenwert ein. Sicherheit
bedeutet Stabilitt und Stabilitt bedeutet Effizienz. Effizienz fhrt schlielich zur Kostenminimierung
und somit auf Unternehmensseite zu einem positiven Betriebsergebnis. Sicherheit lsst sich nicht nur
mit harter Whrung auf Unternehmenserfolge und Misserfolge abbilden; Sicherheit betrifft alle
Computernutzer, denn nur abgesicherte Betriebssysteme erreichen deutlich geringere Ausfallzeiten und
frdern gleichermaen den Spa bei der Arbeit am Computer.
Bereits bei Windows 2000 wurden sehr viele sicherheitsrelevante Implementierungen im
Betriebssystem vorgenommen, wodurch dem Ziel der Schaffung einer stabilen Umgebung sehr nahe
gekommen wurde. Um dieses zu erreichen enthlt Windows 2000 Funktionalitten und Technologien
zur Einschrnkung der Zugriffsrechte einer Anwendung durch die Verwendung eingeschrnkter Token
(Restricted Token). Windows XP und Windows Server 2003 enthalten weitere Verbesserungen und
Optimierungen auf dieser Grundlage und versprechen somit einen noch hheren Sicherheitsfaktor.
Doch was ntzen die besten Schlsser und Alarmanlagen, wenn die Haustr nicht verschlossen wird was ntzen die besten Funktionalitten und Implementierungen, wenn diese nicht genutzt werden und
somit die heroischen Ziele der Schaffung eines sicheren Betriebssystems zum Scheitern verurteilt
werden.
Der grte Problemfaktor oder besser gesagt das hchste Sicherheitsrisiko ist der Administrator. Er hat
uneingeschrnkten Zugriff auf das System, kann nahezu jede Aktion ausfhren und kritisch betrachtet
natrlich auch die meisten Schden anrichten. Jede Anwendung die von einem Administrator gestartet
wird verwendet die gleichen Privilegien und ist hinsichtlich der Zugriffsmglichkeiten nicht oder nur
178
minimal eingeschrnkt. Das hieraus resultierende Gefahrenpotential ist besonders hoch, denn
bsartiger Software sind hierdurch Tor und Tr geffnet, da sie auf nahezu alle Bereiche des
Betriebssystems schreibend zugreifen kann. Eine einfache Lsungsmglichkeit zur Vermeidung
solcher und hnlich gelagerter Problemfaktoren ist der Verzicht auf administrative Privilegien whrend
der tglichen Arbeit, also das standardmige Arbeiten mit den Rechten eines normalen Benutzers.
Die Privilegien eines solchen Benutzers sind stark eingeschrnkt, wodurch es ihm nicht mglich ist,
auf die sicherheitsrelevanten Bereiche des Betriebssystems schreibend zuzugreifen. Hieraus folgt
zwangslufig, dass die von einem Standardbenutzer aufgerufene Anwendung keine Mglichkeit besitzt
die sicherheitsrelevanten Bereiche des Betriebssystems nachhaltig zu schdigen. Schreibzugriffe sind
nur fr das jeweilige Benutzerprofil mglich, so dass ein potentieller Angriff bsartiger Software
vergleichsweise harmlose Folgen hat.
Nachdem ein einfacher Lsungsansatz zur effizienten Minimierung der Sicherheitsrisiken existiert,
stellt sich die Frage, warum dieser Lsungsansatz nur geringe Akzeptanz fand und auch noch findet.
Die Antworten sind einfach und einleuchtend und zeigen ganz deutlich die Schwachstellen des
Systems auf:
Vielen Benutzern fehlt die Sensibilisierung fr diese Problematik, hufig werden die potentiellen
Gefahrenquellen nicht bedacht oder falsch eingeschtzt.
Bei der Installation wird automatisch ein Administratorenkonto erzeugt, dass auch nach der
Installation weiter verwendet wird. Viele Benutzer lassen das entsprechende Fachwissen
vermissen, dieses Konto zu deaktivieren und ein eingeschrnktes Benutzerkonto einzurichten.
Fr bestimmte Aktionen werden immer administrative Privilegien erforderlich sein, so dass immer
ein Benutzerkonto existieren muss, dass ber diese Rechte verfgt. Werden bei der tglichen Arbeit
nun diese erhhten Rechte bentigt, muss zwangslufig ein Wechsel zu diesem
Administratorenkonto erfolgen. Diese Mglichkeit ist in den aktuellen Betriebssystemen
vorhanden, sie ist allerdings nicht als sonderlich komfortabel anzusehen.
Aus den Ausfhrungen lsst sich jedoch ganz klar erkennen, dass an der standardmigen Verwendung
der eingeschrnkten Rechte im Tagesgeschft nicht vorbeigegangen werden kann. Die Problematik
liegt vielmehr im Zusammenspiel zwischen Sicherheit und Komfort begrndet. Diesem Problempunkt
wurde jedoch bei der Entwicklung von Windows Vista und Windows Server 2008 Rechnung getragen;
es wurde ein Mechanismus integriert, der Sicherheit und Komfort nicht mehr gegenstzlich erscheinen
lsst. Dieser Mechanismus wird als Benutzerkontensteuerung (User Account Control) oder abgekrzt
UAC bezeichnet.
Sicherheitskontext
Sicherheit wird schon seit geraumer Zeit immer grer geschrieben. So verwenden alle aktuellen
Microsoft Betriebssysteme ein ausgeklgeltes Sicherheitssystem um Informationen vor unbefugten
Zugriff zu schtzen. Einfach ausgedrckt muss das Betriebssystem zunchst prfen, ob ein Benutzer
oder eine Benutzergruppe die erforderlichen Berechtigungen aufweist um auf eine spezifische
Ressource zugreifen zu knnen. Die erforderlichen Berechtigungen fr den Zugriff sind Bestandteil
der Ressource und sind gemeinsam mit ihr gespeichert. Die erteilten Berechtigungen lassen sich ber
den Eigenschaftendialog der Ressource anzeigen, wie dieses in Abbildung 5.33 fr die Datei
notepad.exe dargestellt wird, die sich im Windows-Ordner befindet.
179
Kapitel 5
Der grundstzliche Aufbau dieses Dialoges oder besser gesagt der Registerkarte Sicherheit ist fr alle
Arten von Ressourcen identisch, allerdings sind die mglichen Berechtigungen von der Art der
Ressource abhngig. So finden sich bei einer Datei Berechtigungen zum Lesen oder Schreiben, bei
einem Drucker hingegen sind es Optionen zum Drucken oder Verwalten des Druckers. Kommen wir
aber zurck zu den Sicherheitseinstellungen von notepad.exe. Die obere Liste enthlt die Benutzer und
Benutzergruppen, die auf die Ressource zugreifen drfen oder denen der Zugriff entzogen wurde. Die
untere Liste enthlt schlielich die mglichen Zugriffsberechtigungen fr jeden Benutzer oder
Benutzergruppe der oberen Liste. Es wird deutlich, dass die Mitglieder der Gruppe Administratoren
ber Lesezugriffe fr die Datei verfgen und diese auch ausfhren also starten drfen. Modifikationen
an der Datei, also das Ersetzen oder Entfernen sind den Mitgliedern der Administratorengruppe nicht
gestattet, sondern sind einem speziellen Benutzerkonto, dem TrustedInstaller vorbehalten. Wie bereits
angedeutet, sind diese Einstellungen und Vorgaben Bestandteil der Datei, wie dieses schematisch auch
in Abbildung 5.34 dargestellt wird.
180
Jede Ressource verfgt neben ihrem eigentlichen Inhalt noch ber eine Sicherheitsbeschreibung
(Security Descriptor), die letztlich die Zugriffsmglichkeiten regelt. Die Sicherheitsbeschreibung
selbst enthlt die freigegebene Zugriffssteuerungsliste (Discretionary Access Control List) oder kurz
DACL. Hierbei handelt es sich um eine Liste, in der die einzelnen Berechtigungen aufgefhrt sind.
Jeder einzelne Eintrag dieser Liste ist eine Struktur vom Typ Zugriffssteuerungseintrag (Access
Control Entry) oder ACE. Ein solcher Zugriffssteuerungseintrag enthlt immer eine
Sicherheitskennung (SID) mit deren Hilfe der Benutzer oder die Benutzergruppe identifiziert wird.
Weiterhin verfgt dieser ACE ber eine Liste mit Berechtigungen und Verboten, anhand der
entschieden wird, ob der Zugriff durch diesen Benutzer erlaubt oder abgewiesen wird. In einem
Zugriffssteuerungseintrag drfen keine Verbote (Access Denied ACE) und Genehmigungen (Access
Allowed ACE) gemischt werden, so dass fr eine Sicherheitskennung unter Umstnden mehrere
Zugriffssteuerungseintrge vorhanden sind.
Es wird deutlich, dass es zu Konflikten kommen kann. Dem Benutzer XYZ kann es untersagt
werden, auf eine Datei zuzugreifen. Gleichzeitig kann er aber Mitglied einer Benutzergruppe sein, die
wiederum auf die Datei zugreifen darf. Bei der berprfung werden die Zugriffssteuerungseintrge
sequentiell abgearbeitet. Wird hierbei auf einen Eintrag getroffen, der eine der angeforderten
Berechtigungen verbietet, so wird der Vergleich an dieser Stelle abgebrochen und der Zugriff wird
verweigert. Wird hingegen ein Zugriffssteuerungseintrag angetroffen, der die angeforderte Rechte
gestattet, wird der Zugriff logischerweise erlaubt. Es wird deutlich, dass die Reihenfolge, in der die
181
Kapitel 5
182
Ein Bestandteil der Informationen des Benutzerkontos ist die Sicherheitskennung (SID). Hierbei
handelt es sich um einen numerischen Wert variabler Lnge, der weltweit eindeutig ist und somit einen
Benutzer eindeutig ausweisen kann.
S-1-5-21-2215374185-4733489-3158440935-500
Die SID beginnt mit dem Prfix S. Danach folgt die sogenannte Revisionsnummer, in diesem Fall
die 1 und die Autorittsnummer, in diesem Fall die 5, die fr SECURITY_NT_AUTHORITY steht.
Dahinter folgt die individuelle Subautoritt, die den Rechner oder die Domne kennzeichnet, auf der
diese SID erstellt wurde. Dieser Zifferncode wird aus verschiedenen Faktoren berechnet, so dass
hiermit eine Eindeutigkeit erreicht werden kann. Die 21 der Subautoritt kennzeichnet in dem
Beispiel ein Benutzerkonto, dass nachtrglich angelegt wurde. Eine 32 wrde hingegen eine von
Windows automatisch erzeugte Benutzergruppe kennzeichnen. Der letzte Teil der SID, nmlich die
500, ist die Relative ID (RID). Nachtrglich erstellte Benutzerkonten beginnen mit der Zahl 1000
und werden fortlaufend vergeben. RIDs zwischen 500 und 999 sind systemeigene RIDs, die fest
zugeordnet sind. Das Administratorkonto hat beispielsweise die 500. Darber hinaus existieren noch
weitere vordefinierte RIDs fr bestimmte Benutzergruppen.
Zustzlich zum Identifizierungsmerkmal des Benutzers enthlt der Zugriffstoken eine Auflistung aller
Gruppen denen der Benutzer angehrt. Blicken wir an diese Stelle zurck zu unserem Zugriff auf die
Ressource. Der bei der Anmeldung erzeugte Zugriffstoken wird im Verlauf der Windows-Sitzung
jedem Prozess bergeben, den der Benutzer startet, wie die nachfolgende Deklaration der Funktion
CreateProcessAsUser() auch zeigt.
[DllImport("kernel32.dll")]
private static extern bool CreateProcessAsUser (
183
Kapitel 5
int hToken,
string lpApplicationName,
string lpCommandLine,
ref SECURITY_ATTRIBUTES lpProcessAttributes,
ref SECURITY_ATTRIBUTES lpThreadAttributes,
int bInheritHandles,
int dwCreationFlags,
string lpEnvironment,
string lpCurrentDirectory,
ref STARTUPINFO lpStartupInfo,
ref PROCESS_INFORMATION lpProcessInformation
);
Hieraus folgt, dass jeder Prozess, der auf dem Betriebssystem ausgefhrt wird, immer ber ein Token
verfgt, welches abgefragt werden kann, und welches Informationen ber den Erzeuger des Prozesses
besitzt. Wird also versucht die Datei notepad.exe zu starten, werden die Informationen des Tokens des
aufrufenden Prozesses mit den erforderlichen Sicherheitseinstellungen der Ressource verglichen und in
Abhngigkeit zum Ergebnis die Aktion ausgefhrt oder abgebrochen, wie dieses in Abbildung 5.36
gezeigt wird.
Der Zugriffstoken enthlt zustzlich zu den gerade erluterten Daten noch eine Liste der Privilegien
des Benutzers. Hierunter versteht man Rechte die sich nicht auf einzelne Objekte abbilden lassen,
sondern Berechtigungen zum Durchfhren bestimmter Aktionen, wie zum Beispiel das Recht zum
Herunterfahren des Systems, dass durch das Privileg SeShutdownPrivilege gekennzeichnet ist. Alle
diese Informationen sind in ihrer Gesamtheit relevant fr die Ausfhrung von Benutzeraktivitten. So
wird beispielsweise anhand der SID geprft, ob auf bestimmte Bereiche des Dateisystems oder die
Systemregistrierung zugegriffen werden darf. Die Privilegien finden hingegen beim Ausfhren
systemrelevanter Aktivitten ihre Anwendung.
offensichtlich; handelt es sich bei dem Benutzer um ein Mitglied der Administratorengruppe sind die
Benutzerrechte kaum eingeschrnkt, so dass gestartete Software auf alle systemrelevanten Bereiche
des Betriebssystems zugreifen und dieses modifizieren kann. Handelt es sich hingegen um einen
normalen Benutzer, reichen diese Berechtigungen zur Durchfhrung bestimmter Aktivitten hufig
nicht aus, so dass diese Aktionen von einem anderen Benutzerkonto aus gesteuert werden mssen.
Windows Vista und Windows Server 2008 enthalten hier einen abweichenden Lsungsansatz, der das
bisher bekannte Standardbenutzermodell wesentlich flexibler und sicherer gestaltet. Einfach
ausgedrckt werden fr einen Administrator zwei Zugriffstoken erstellt, ein gefilterter Token fr den
Standardzugriff und ein weiterer Token fr den vollen Administratorzugriff. Anstatt die WindowsOberflche mit dem Token des Administrators zu starten, wird hierfr der gefilterte Zugriffstoken des
Standardbenutzers verwendet. Alle untergeordneten Prozesse erben diesen Zugriffstoken, was somit
zur Verringerung der Angriffsflche von Windows Vista und Windows Server 2008 beitrgt.
Hierdurch wurde weiterhin auch die Problematik des erforderlichen technischen Wissens adressiert,
die zum Anlegen eines neuen Benutzerkontos vorhanden sein muss. Bei der Installation des
Betriebssystems wird der Benutzer aufgefordert eine Bezeichnung fr das zu erzeugende
Benutzerkonto anzulegen. Dieses Konto wird automatisch der Administratorengruppe hinzugefgt und
im Rahmen der Installation verwendet. Nach Abschluss der Installation ist dann die
Benutzerkontensteuerung aktiv, so dass durch die Verwendung des gefilterten Tokens die
ursprngliche Problematik beseitigt wurde. Ergnzend sei anzumerken, dass es nach wie vor das
vordefinierte Administratorenkonto (Built-In Administrator) existiert, dieses aber standardmig
deaktiviert ist.
Es ist erkennbar, dass zunchst nur die Rechte des Standardbenutzers zur Verfgung stehen, wodurch
zwangslufig gewisse Aktivitten nicht durchgefhrt werden knnen. Hier hat es jedoch bei Windows
Vista und Windows Server 2008 eine Anpassung gegeben, so dass ein Standardbenutzer unter diesen
Betriebssystemen zustzliche Privilegien besitzt. Zu diesen neuen Berechtigungen fr
Standardbenutzer gehren:
Anzeigen der Systemuhr und des Kalenders.
ndern der Zeitzone.
Installation von WEP (Wired Equivalent Privacy), um eine Verbindung zu einem WLAN
aufzubauen.
ndern der Anzeigeeinstellungen.
ndern der Energiesparoptionen.
Installation von Schriftarten.
Hinzufgen von Druckern und anderen Gerten, fr die die Installation von Treibern erforderlich
ist.
Erstellen und Konfigurieren von VPN-Verbindungen.
Herunterladen und Installieren von Updates mit einem UAC-kompatiblen Installer.
An vorheriger Stelle habe ich bereits erwhnt, dass bei einem Administrator zwei Zugriffstoken erstellt
werden. Dieses ist zwar nicht falsch, doch technisch gesehen nicht ganz korrekt. Przise ausgedrckt
werden zunchst die Privilegien des Benutzers betrachtet. Verfgt der Benutzer im Gegensatz zu
einem Standardbenutzer ber zustzliche Privilegien werden zwei Zugriffstoken erstellt, wobei ein
Standardbenutzerkonto ausschlielich ber die folgenden Privilegien verfgt:
SeChangeNotifyPrivilege
Persnliche Ausfertigung fr Martin Martinsson
185
Kapitel 5
SeShutdownPrivilege
SeUndockPrivilege
SeReserveProcessorPrivilege
Besitzt ein Benutzer beispielsweise das Privileg SeDebugPrivilege, werden zwei Zugriffstoken erstellt,
da SeDebugPrivilege nicht zu den Privilegien eines Standardbenutzers gehrt.
Darber hinaus existiert noch ein anderes Szenario, in dem zwei Zugriffstoken erstellt werden. Hierbei
wird die Gruppenzugehrigkeit des Benutzers betrachtet. Meldet sich beispielsweise ein Benutzer am
System an, der zur Administratorengruppe gehrt, werden natrlich zwei Zugriffstoken erstellt. Der zu
Grunde liegende Algorithmus verwendet hierbei die Sicherheitskennung (SID) der jeweiligen
Benutzergruppe, wie S-1-5-32-544 fr die Administratoren. Relevant ist hierbei ausschlielich die
Relative ID (RID), also der letzte Teil der SID. Dieses Identifizierungsmerkmal wird mit einer
Auflistung verglichen, wie sie auch in Tabelle 5.40 dargestellt ist. Fr das Beispiel ist erkennbar, dass
sich die 544 in der Tabelle wieder findet (DOMAIN_ALIAS_RID_ADMIN), wodurch zwei
Zugriffstoken erstellt werden.
RID
Wert
DOMAIN_GROUP_RID_ADMINS
0x200 (512)
DOMAIN_GROUP_RID_CONTROLLERS
0x204 (516)
DOMAIN_GROUP_RID_CERT_ADMINS
0x205 (517)
DOMAIN_GROUP_RID_SCHEMA_ADMINS
0x206 (518)
DOMAIN_GROUP_RID_ENTERPRISE_ADMINS
0x207 (519)
DOMAIN_GROUP_RID_POLICY_ADMINS
0x208 (520)
DOMAIN_ALIAS_RID_ADMINS
0x220 (544)
DOMAIN_ALIAS_RID_POWER_USERS
0x223 (547)
DOMAIN_ALIAS_RID_ACCOUNT_OPS
0x224 (548)
DOMAIN_ALIAS_RID_SYSTEM_OPS
0x225 (549)
DOMAIN_ALIAS_RID_PRINT_OPS
0x226 (550)
DOMAIN_ALIAS_RID_BACKUP_OPS
0x227 (551)
DOMAIN_ALIAS_RID_RAS_SERVERS
0x229 (553)
DOMAIN_ALIAS_RID_PREW2KCOMPACCESS
0x22A (554)
DOMAIN_ALIAS_RID_NETWORK_CONFIGURATION_OPS
0x22C (556)
In dem konstruierten Beispiel existieren fr ein Mitglied der Administratorengruppe nun zwei
Zugriffstoken. Unter Verwendung des ersten Tokens, der auch als gefilterter Token, eingeschrnkter
Token oder auch UAC-Token bezeichnet wird, werden standardmig alle Benutzeraktivitten
durchgefhrt. So wird zum Starten der Windows-Oberflche dieser Token verwendet, wodurch alle
von der Oberflche ausgefhrten Aktionen ebenfalls diesen Token verwenden.
Wie bereits angedeutet, sollen diese Aktivitten mit geringeren Privilegien ausgefhrt werden, wozu
186
ein geeigneter Token zunchst erzeugt werden muss. Zu diesem Zweck wird die Funktion
CreateRestrictedToken() auf eine Kopie des unvernderten Zugriffstokens verwendet:
[DllImport("advapi32.dll")]
private static extern bool CreateRestrictedToken (
int ExistingTokenHandle,
int Flags,
int DisableSidCount,
ref SID_AND_ATTRIBUTES SidsToDisable,
int DeletePrivilegeCount,
ref LUID_AND_ATTRIBUTES PrivilegesToDelete,
int RestrictedSidCount,
ref SID_AND_ATTRIBUTES SidsToRestrict,
int NewTokenHandle
);
Dem Parameter PrivilegesToDelete wird hierbei eine Auflistung von Privilegien bergeben, die aus
dem Token entfernt werden sollen. Zwangslufig mssen hier allen Privilegien angegeben werden, die
einem Standardbenutzer nicht zur Verfgung stehen. Der Benutzer wird hierdurch in der Ausfhrung
systemrelevanter Operationen eingeschrnkt. Es fehlen schlielich noch die Einschrnkungen beim
Zugriff auf Objekte. Wie bereits verdeutlicht, wird dieser Zugriff durch die Gruppenzugehrigkeit
ermglicht. Es ist somit erforderlich, diese Zuordnungen zu modifizieren, wozu der Parameter
SidsToDisable dient. Diesem ist eine Auflistung der Benutzergruppen zu bergeben, deren
Zugehrigkeit dem Benutzer aberkannt werden soll. Das Betriebssystem enthlt die Anwendung
whoami.exe die dieses unter Verwendung des Parameters /groups veranschaulicht. So wird deutlich,
dass der Benutzer nach wie vor zur Gruppe der Administratoren gehrt, allerdings ist erkennbar, dass
es sich nun um eine geschtzte Gruppe handelt:
Gruppe: BUILTIN\Administrators, Alias: S-1-5-32-544, Gruppe, die nur zum
Ablehnen verwendet wird (Group used for deny only)
Bei dem zweiten Token handelt es sich um den vollstndigen, unvernderten Token, der auch als FullAdmin-Token bezeichnet wird. Dieser Token wird nur verwendet, falls vollstndige Privilegien
erforderlich werden. Wird beispielsweise die Eingabeaufforderung im Startmen markiert und im
Kontextmen der Befehl Als Administrator ausfhren ausgewhlt, erscheint zunchst ein Dialog um
die Verwendung des vollstndigen Tokens zu besttigen. Wird nun der Befehl whoami.exe /groups in
das Befehlsfenster eingegeben, wird die Verwendung des vollstndigen Tokens deutlich, denn hierbei
wird nun die uneingeschrnkte Administratorengruppe ausgegeben:
Gruppe: BUILTIN\Administrators, Alias: S-1-5-32-544, Verbindliche Gruppe,
Standardmig aktiviert, Aktivierte Gruppe, Gruppenbesitzer (Mandatory
Group, Enabled by default, Enabled Group)
Deutlich wird in diesem Beispiel auch die Verbindung von Sicherheit und Komfort, die sich ja bei
frheren Betriebssystemen gegenseitig ausgeschlossen haben. Der angemeldete Benutzer arbeitet mit
den normalen Standardberechtigungen. Durch eine Manahme wird das Betriebssystem informiert,
dass fr die folgende Aktivitt diese Rechte nicht ausreichend sind und der Benutzer vollstndige
Privilegien bentigt. Das Betriebssystem holt sich daraufhin nochmal die Besttigung vom Benutzer
Persnliche Ausfertigung fr Martin Martinsson
187
Kapitel 5
zum Starten des Prozesses unter Verwendung des vollstndigen Zugriffstokens. Dieses Szenario wird
als Administratorbesttigungsmodus (Admin Approval Mode) bezeichnet.
Beschreibung,
Original
188
wurde
das
Die Anwendung wurde ber den Menpunkt Als Administrator ausfhren des Kontextmens
gestartet.
Die letzten Optionen dieser Liste verndern die Datei nicht, sondern bieten die Mglichkeit der
nachtrglichen Konfiguration einer Anwendung. Dieses ist natrlich erforderlich, da viele
Anwendungen existieren, die vor dem Erscheinen von Windows Vista entwickelt wurden und somit
ber keine spezielle Anpassung verfgen. Bei Neuentwicklungen oder speziell fr Windows Vista und
Windows Server 2008 angepasste Dateiversionen sollte immer die erste Option verwendet werden,
denn hierdurch sind die Ausfhrungsprivilegien untrennbar mit der Datei verbunden und gelten auf
jeder untersttzten Plattform. Das heit natrlich auch, dass bei der Anwendungsentwicklung geprft
werden muss, welche Privilegien tatschlich erforderlich sind. Hilfestellung hierbei bietet der Standard
User Analyzer, der Bestandteil des Microsoft Application Compatibility Toolkit ist. Das Ergebnis
dieser Prfung muss sich letztlich in einer Ausfhrungsebene niederschlagen und im
Anwendungsmanifest abgelegt werden. Die folgenden Ausfhrungsebenen stehen hierfr zur
Verfgung:
asInvoker: Die Anwendung wird mit dem identischen Token ausgefhrt, wie der aufrufende
Prozess.
highestAvailable: Die Anwendung wird mit den hchsten Privilegien ausgefhrt, die dem
jeweiligen Benutzer zur Verfgung stehen. Bei einem Standardbenutzer, wird nicht nach hheren
Privilegien verlangt, sondern die Anwendung wird mit Standardberechtigungen ausgefhrt. Bei
einem Administrator hingegen, wird die Verwendung vollstndiger Privilegien veranlasst.
requireAdministrator: Die Anwendung erfordert administrative Privilegien und verlangt dazu den
vollstndigen Zugriffstoken.
Das zu erstellende Anwendungsmanifest kann sich hierbei als externe Datei (application.exe.manifest)
im Anwendungsordner befinden oder als Ressource RT_MANIFEST in die ausfhrbare Datei integriert
werden, wobei die letzte Mglichkeit zu bevorzugen ist. Listing 5.44 zeigt ein Manifest, das fr die
Anwendung vollstndige Privilegien erfordert. Mit Hilfe des Attributs uiAccess wird es mglich
Sicherheitsebenen fr Benutzeroberflchen zu umgehen, so dass quasi eine Fernsteuerung der
Fensterinhalte erfolgen kann. Dieses Szenario ist hufig im Rahmen der Testautomatisierung und bei
der Verwendung von Eingabehilfen wie beispielsweise eine Bildschirmtastatur anzutreffen. Um
hierbei auch einen mglichst hohen Sicherheitsanspruch zu gewhrleisten, muss die so
gekennzeichnete Anwendung digital signiert werden. Im Weiteren ist es erforderlich, dass eine solche
Anwendung aus einem vertrauenswrdigen Verzeichnis gestartet wird, wie das bei %SystemRoot%
oder %ProgramFiles% der Fall ist. Dieses kann jedoch mit Hilfe der Richtlinie
Benutzerkontensteuerung: Nur erhhte Rechte fr UIAccess-Anwendungen, die an sicheren Orten
installiert sind unterbunden werden.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
189
Kapitel 5
<assemblyIdentity version="1.0.0.0"
processorArchitecture="X86"
name="UACSample"
type="win32"/>
<description>Beschreibung der Anwendung</description>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel
level="requireAdministrator"
uiAccess="false"/>
</requestedPrivileges>
</security>
</trustInfo>
</assembly>
Bei der Verwendung von Visual Studio 2005 ist zu beachten, dass nur bei C++ Anwendungen, die
direkte Integration des Manifests seitens der Entwicklungsumgebung bereitgestellt wird. Bei der
Erstellung von VB.NET und C# Anwendungen mssen die Manifest-Dateien nachtrglich in die
Anwendung integriert werden. Das Windows SDK stellt fr solche Zwecke das Befehlszeilentool
mt.exe zur Verfgung. Der erforderliche Aufruf kann als Postbuildereignis (Post-Build Event) in den
Projekteigenschaften hinzugefgt werden, so dass die Integration des Manifestes bei jedem
Erstellungsvorgang automatisch erfolgt.
mt.exe
-manifest
outputresource:"$(TargetPath)";#1
"$(ProjectDir)Admin.manifest"
Mit Visual Studio 2008 ist dieses nicht mehr erforderlich. Diese Version der Entwicklungsumgebung
bietet umfangreiche Einstellungsmglichkeiten zur Verwendung von Manifest-Dateien ber die
Einstellungsdialoge der Projekteigenschaften. Standardmig wird jeder Anwendung ein Manifest
hinzugefgt, bei dem die Ausfhrungsebene auf asInvoker festgelegt wurde. Bitte beachten Sie, dass
dieses auch die grundstzliche Zielsetzung der Benutzerkontensteuerung darstellt. Bei der
Softwareentwicklung sind immer Anwendungen anzustreben, die unter Verwendung von
Standardbenutzerrechten ausgefhrt werden knnen. Natrlich mssen auch Anwendungen geschaffen
werden, die administrative Privilegien erfordern, so dass ein Manifest mit festgelegter
Ausfhrungsebene auf requireAdministrator verwendet werden muss. Dieses Manifest kann dem
Visual Studio-Projekt als Ressource hinzugefgt werden und die Verwendung kann ber die
Projekteigenschaften vorgenommen werden. Bei Starten eines Prozesses wird der festgelegte
Ausfhrungslevel ausgewertet und in den weiteren Workflow einbezogen, wie dieses auch Abbildung
5.37 darstellt.
190
Wie bereits angedeutet, sollte die Zielsetzung bei der Softwareentwicklung jedoch immer auf die
Verwendung von Standardbenutzerrechten abzielen. Hierdurch ist gewhrleistet, dass keine bsartigen
Zugriffe auf das System erfolgen und dass die Mechanismen der Benutzerkontensteuerung nicht als
strend empfunden werden.
Hinweis Beginn
Ein einfacher Weg zur berprfung, ob die Anwendung ber ein Manifest verfgt und welche Werte
dieses Manifest aufweist ermglicht das Tool sigcheck.exe von Windows Sysinternals. Ein Aufruf
unter Verwendung des Parameters m zeigt die relevanten Einstellungen an.
Hinweis Ende
191
Kapitel 5
vollstndige Anwendungen und deren Verknpfungen, sondern kann auch einzelne Anwendungsteile
betreffen. Betrachten Sie hierzu den Dialog Datum und Uhrzeit, der auch in Abbildung 5.38
dargestellt ist. Dieser Dialog lsst sich von jedem Benutzer ohne Besttigung weiterer Privilegien
ffnen. Sollen jedoch das Datum oder die Uhrzeit gendert werden, sind vollstndige Privilegien
erforderlich, worauf das Schild-Symbol auf der entsprechenden Schaltflche hinweist.
Wird eine Anwendung gestartet, wird vom Betriebssystem die erforderliche Ausfhrungsebene
ausgewertet. Wird hierbei festgestellt, dass vollstndige Privilegien erforderlich sind, erscheint ein
Dialog, in dem der Anwender die Verwendung dieser Privilegien explizit besttigen muss. Sind
hingegen nur die Rechte eines Standardbenutzers erforderlich, erscheint kein zustzlicher Dialog,
wodurch der gefhlte Arbeitskomfort des Benutzers erhht wird. Die interne Implementierung
verschiedener Win32-Funktionen wurde in Windows Vista und Windows Server 2008 angepasst um
Sicherheit und Komfort zu vereinbaren. Das zentrale Element innerhalb der UAC-Infrastruktur ist der
Anwendungsinformationsdienst (Application Information Service) oder kurz AIS, wie dieses auch der
nachfolgend skizzierte Workflow zeigt, der beim Starten einer Anwendung durchlaufen wird:
Der Benutzer startet das Defragmentierungsprogramm defrag.exe.
ShellExecute() erstellt einen neuen Prozess indem CreateProcess() aufgerufen wird.
CreateProcess() prft nun ob erhhte Privilegien fr die Prozessausfhrung bentigt werden.
Hierzu werden zunchst Informationen der Kompatibilittsdatenbank ausgewertet. Anschlieend
wird in der ausfhrbaren Datei nach einer festgelegten Ausfhrungsebene im Manifest gesucht.
Verfgt die ausfhrbare Datei ber kein Anwendungsmanifest mit festgelegter Ausfhrungsebene
wird schlielich noch anhand der Installer-Erkennung geprft.
Wurde festgestellt, dass erhhte Privilegien erforderlich sind, gibt CreateProcess() den neuen
Win32-Fehler ERROR_ELEVATION_REQUIRED zurck.
ShellExecute() reagiert auf diesen neuen Fehler und informiert den Anwendungsinformationsdienst
192
Bedeutung
Die Anwendung ist nicht signiert oder sie ist signiert aber nicht
vertrauenswrdig.
Darber hinaus wird die Darstellungsform des UAC-Besttigungsdialogs noch durch die Anzahl der
Zugriffstoken des Benutzers beeinflusst. Bei einem Benutzer der ber den eingeschrnkten und den
vollstndigen Zugriffstoken verfgt, also beispielsweise bei einem Mitglied der
Administratorengruppe, findet sich der Dialog in einer sehr einfachen Ausprgung. Er enthlt im
Wesentlichen lediglich eine Besttigungsfunktion fr die Verwendung erweiterten Privilegien. Dieser
Dialog wird als Aufforderung zur Eingabe der Zustimmung (Prompt for Consent) oder Einfacher
Besttigungsdialog bezeichnet. Handelt es sich bei dem Anwender um einen Standardbenutzer,
Persnliche Ausfertigung fr Martin Martinsson
193
Kapitel 5
verfgt er zwangslufig nur ber einen eingeschrnkten Zugriffstoken, wodurch die erforderlichen
Rechte zum Ausfhren der Anwendung nicht gegeben sind. In diesem Fall wird der erweiterte
Besttigungsdialog oder die Aufforderung zur Eingabe der Anmeldeinformationen (Prompt for
Credentials) angezeigt. Mit Hilfe dieses Dialogs ist es nun mglich einen Benutzer auszuwhlen oder
anzugeben mit dessen Privilegien die Anwendung ausgefhrt werden soll. An dieser Stelle muss noch
zustzlich zwischen der Verwendung in einer Domne und einer Arbeitsgruppe unterschieden werden.
Bei der Verwendung in einer Arbeitsgruppe werden alle lokalen Benutzerkonten zur Auswahl
angeboten, die ber vollstndige Privilegien verfgen. In einer Domne ist dieses nicht der Fall; hier
muss der Benutzername manuell eingegeben werden. Die unterschiedlichen Ausprgungen des UACBesttigungsdialoges sind in Abbildung 5.39 aufgefhrt.
bergeordneter
Prozesstoken
Einstellungen
highestAvailable oder
requireAdministrator
Eingeschrnkter Token
Eingeschrnkter Token
Eingeschrnkter Token
Vollstndiger Token
(Nicht relevant)
Einstellungen
asInvoker,
highestAvailable oder
kein Manifest
requireAdministrator
Eingeschrnkter Token
Anhebungsaufforderung
automatisch abweisen
(Automatically deny
elevation requests).
Eingeschrnkter Token
195
Kapitel 5
kann die Win32-Funktion GetTokenInformation() verwendet werden, wie dieses auch in Listing 5.45
demonstriert wird.
internal static void CheckElevationType(Process process)
{
// Deklarationen
int tokenInfoLen = sizeof(int);
int tokenInfo = 0;
IntPtr hToken;
// Prozess-Token ffnen
if (OpenProcessToken(process.Handle, TOKEN_QUERY, out hToken))
{
// Token-Informationen abrufen
if (GetTokenInformation(hToken, TOKEN_INFORMATION_CLASS.TokenElevationType, ref tokenInfo,
tokenInfoLen, out tokenInfoLen))
{
// Elevation-Typ auswerten
switch ((TOKEN_ELEVATION_TYPE)tokenInfo)
{
case TOKEN_ELEVATION_TYPE.TokenElevationTypeDefault:
Console.WriteLine("TokenElevationTypeDefault - Ein Token vorhanden (Standardbenutzer oder
vordefinierter Administrator).");
break;
case TOKEN_ELEVATION_TYPE.TokenElevationTypeFull:
Console.WriteLine("TokenElevationTypeFull - Zwei Token vorhanden. Prozess wird mit
erhhten Rechten ausgefhrt.");
break;
case TOKEN_ELEVATION_TYPE.TokenElevationTypeLimited:
Console.WriteLine("TokenElevationTypeLimited - Zwei Token vorhanden. Prozess wird mit
Standardbenutzerrechten ausgefhrt.");
break;
}
}
}
}
Zusammenfassend lsst sich feststellen, dass die Benutzerkontensteuerung nicht nur zur Absicherung
des Systems dient, sondern auch dem Komfort des Benutzers zu Gute kommt. So ist die
Benutzerkontensteuerung auch als Erweiterung und Verbesserung der RunAs-Funktionalitt von
Windows XP zu verstehen. Das begrndet sich darauf, dass jede Anwendung die zur Ausfhrung
erforderlichen Privilegien offen legt und das System die bentigten Rechte automatisch anfordern
kann. Weiterhin kann jede Anwendung zur Ausfhrung in einem anderen Kontext veranlasst werden,
wozu geeignete Optionen im Kontextmen vorhanden sind. Die gravierende Zielsetzung der
Benutzerkontensteuerung basiert jedoch auf der Ausfhrung von Anwendungen im Kontext des
Standardbenutzers, wodurch Sicherheitsrisiken stark minimiert werden. Hierzu ist es allerdings
zwingend erforderlich das Design der Anwendung zu prfen und zu korrigieren.
196
Virtualisierung
Viele Anwendungen legen Informationen in Speicherbereichen des Systems ab, auf die ein
Standardbenutzer nur ber lesenden Zugriff verfgt. Dieses ist sehr hufig historisch bedingt, denn die
programmtechnische Ermittlung der Systemverzeichnisse wurde seit jeher hervorragend untersttzt.
Das Auffinden der benutzerspezifischen Verzeichnisse war hufig nur rudimentr implementiert, so
dass der Weg des geringsten Widerstandes genommen wurde und die Systemverzeichnisse hierfr
verwendet wurden. Wird nun eine solche Anwendung unter Windows Vista oder Windows Server
2008 ausgefhrt, msste die Verwendung erhhter Privilegien sichergestellt werden. Dieses Vorhaben
ist zwar relativ einfach umsetzbar, allerdings verstt es gegen den Grundgedanken der
Benutzerkontensteuerung, da die Rechte des Standardbenutzers zur Ausfhrung einer normalen
Anwendung nicht mehr ausreichend wren. Folglich msste die Anwendung umprogrammiert werden,
was jedoch in vielen Fllen sehr aufwendig und somit sehr kostenintensiv ist, so dass hufig davon
Abstand genommen wird.
Windows Vista und Windows Server 2008 enthalten eine Migrationslsung fr solche Szenarien, die
als Virtualisierung bezeichnet wird. Hierdurch wird es fr einen Standardbenutzer mglich, auch eine
solche Anwendung unter diesen Betriebssystemen auszufhren. Ermglicht wird dieses durch eine
Umleitung der Zugriffe auf das Dateisystem und auf die Systemregistrierung. Soll beispielsweise eine
INI-Datei im Windows-Ordner angelegt werden, wird dieser Zielordner auf einen virtuellen Ordner im
Benutzerprofil umgelenkt. Beim Lesezugriff geschieht dieses in umgekehrter Reihenfolge. Das
Betriebssystem schaut zunchst im virtuellen Verzeichnis nach. Wird dort keine entsprechende Datei
gefunden, wird im Windows-Ordner nachgesehen. Virtualisierung funktioniert fr die folgenden
Ordner:
%ProgramFiles%
%ProgramData%
%SystemRoot%
Soll durch einen Standardbenutzer eine Datei in einem der vorher genannten Ordner angelegt werden,
wird diese Datei physisch unter %LocalAppData%\VirtualStore\<Ordner> gespeichert. Was sich
zunchst sehr interessant anhrt, offenbart bei nherer Betrachtung einige Schwachstellen. Zum
besseren Verstndnis soll hier ein einfaches Szenario dienen, bei dem ein Spiel die Bestenliste (High
Score) in einer Datei ablegt. Diese Anwendung wurde so konstruiert, dass diese Datei im Verzeichnis
%ProgramFiles%\Games gespeichert wird. Hieraus folgt, dass bei einem Standardbenutzer der
Virtualisierungs-Mechanismus des Betriebssystems greift und die Datei physisch unter
%LocalAppData %\VirtualStore\ProgramFile\Games abgelegt wird. Hierbei gilt es zu beachten, dass
sich dieser Ordner im Benutzerprofil befindet, wodurch ein solcher Ordner fr jeden Benutzer angelegt
wird, der das Spiel spielt. Hieraus folgt auch, dass jeder Benutzer eine eigene Bestenliste verwendet.
Dieses ist zwar aus Motivationsgrnden eine hervorragende Umsetzung, allerdings ist dieses nicht im
Sinne des Entwicklers.
Ein sehr hufig anzutreffendes und auch problematisches Szenario liegt in der Verwendung von INIDateien. Vielfach sind diese Dateiarten nur mit einer speziellen Version einer Anwendung kompatibel,
so dass es durch die Virtualisierung hier zu einigen Problemen kommen kann. Auch hier zum besseren
Verstndnis ein Beispiel. Eine Anwendung wird unter Verwendung des Windows Installers installiert,
wobei eine INI-Datei im Windows-Verzeichnis abgelegt wird. Die INI-Datei enthlt allgemeine
Konfigurationseinstellungen, die auch vom Benutzer verndert werden knnen. Bitte beachten Sie,
dass dieses kein Anwendungsfall ist, der den Richtlinien entspricht. Dennoch existieren viele solcher
197
Kapitel 5
Anwendungen, die Konfigurationen auf Maschinen- und Benutzerebene nicht trennen. Der Benutzer
fhrt nun seine Einstellungen aus, die in der INI-Datei abgelegt werden sollen. Da er ber keine
ausreichenden Privilegien verfgt, schlgt die Virtualisierung zu und die Einstellungen werden in einer
INI-Datei im Virtualisierungs-Verzeichnis gespeichert. Existiert diese INI-Datei bereits im
Virtualisierungs-Verzeichnis, werden die entsprechenden Eintrge lediglich modifiziert oder ergnzt.
Falls die Datei noch nicht vorhanden ist, wird zunchst die INI-Datei aus dem Windows-Verzeichnis
kopiert und anschlieend werden die nderungen vorgenommen. Wird nun zu einem spteren
Zeitpunkt eine Aktualisierung der Anwendung ausgefhrt und werden hierbei auch Modifikationen an
der INI-Datei ausgefhrt oder wird diese gegen eine neue Version ausgetauscht, wirkt sich dieses nur
auf die INI-Datei des Windows-Verzeichnisses aus; die virtualisierten Kopien sind hiervon nicht
betroffen. Werden im Rahmen dieser Produktaktualisierung funktionsrelevante nderungen an der
INI-Datei ausgefhrt, werden diese nicht beachtet, da die private Kopie verwendet wird, die ber diese
Einstellungen nicht verfgt. Dieses kann dazu fhren, dass die Anwendung nicht mehr funktionsfhig
ist.
Es sollte erkennbar sein, dass durch die Virtualisierung einige Probleme auftreten knnen, die vielfach
auf ein unglckliches und nicht den Richtlinien entsprechendes Anwendungsdesign zurckzufhren
sind. Eine mgliche Abhilfe knnte in der Synchronisierung der unterschiedlichen
Konfigurationseinstellungen liegen, wobei das Microsoft Active Setup (Siehe Anhang G) mitunter
helfen kann. Die Grundvoraussetzung fr alle Lsungsszenarien liegt natrlich zunchst darin,
herauszufinden, wo die Dateien physisch abgelegt wurden. Der Windows-Explorer enthlt zum
besseren Auffinden dieser virtuell abgelegten Dateien eine Erweiterung. Wird einer der oben
erwhnten Ordner im Windows-Explorer ausgewhlt und enthlt dieser Ordner virtuelle Dateien,
erscheint in der Symbolleiste die Schaltflche Kompatibilittsdateien. Eine Aktivierung dieser
Schaltflche wechselt zu dem entsprechenden virtuellen Verzeichnis.
Virtualisierung funktioniert nicht fr alle Dateitypen. So sind ausfhrbare Dateien, die u.a. durch die
Dateiendungen .exe, .bat, .cmd, .scr und .vbs charakterisiert sind, von der Virtualisierung
ausgeschlossen. Wre das nicht der Fall, knnte jedes selbstaktualisierende Programm eine private
Version anlegen, die fr das eigentliche Installationsprogramm nicht sichtbar wre. Hierdurch wre
eine geordnete Verwaltung der einzelnen Produktversionen nicht mehr gewhrleistet.
Ein hnliches Verhalten wird im Rahmen der Virtualisierung fr Teile der Systemregistrierung
untersttzt. Soll durch einen Standardbenutzer ein Wert unter HKEY_LOCAL_MACHINE\Software
angelegt
werden,
wird
dieser
Wert
tatschlich
unter
HKEY_CURRENT_USER\Classes\VirtualStore\Machine\Software angelegt. Ausgenommen hiervon
sind die folgenden fest definierten Registrierungsschlssel:
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT
HKEY_LOCAL_MACHINE\Software\Classes
Im Weiteren knnen Registrierungsschlssel so markiert werden, dass sie von der Virtualisierung
ausgenommen werden. Zur berprfung, ob ein Registrierungsschlssel so gekennzeichnet ist, eignet
sich das Betriebssystem-Tool reg.exe. Durch den folgenden Aufruf werden Attribute fr einen
spezifischen Schlssel ausgegeben.
reg.exe flags hklm\software\demo
198
199
Kapitel 5
Es ist erkennbar, dass Virtualisierung viele Vorteile bietet aber auch einige Problempunkte offenbart.
An dieser Stelle kann nur individuell entschieden werden, ob Virtualisierung in der jeweiligen
Umgebung geeignet erscheint oder nicht. Virtualisierung kann systemweit durch die Richtlinie
Benutzerkontensteuerung: Datei- und Registrierungsschreibfehler an Einzelbenutzerstandorte
virtualisieren (EnableVirtualization) deaktiviert werden. Wer jedoch auf die VirtualisierungsFunktionalitt setzt, sollte immer bercksichtigen, dass Virtualisierung ausschlielich als
Migrationsmittel zu verstehen ist. Dieses wird deutlich, da Virtualisierung fr 64-Bit Anwendungen
nicht funktioniert und auch fr Anwendungen nicht, die ber eine definierte Ausfhrungsebene
verfgen. Hier wird davon ausgegangen, dass es im 64-Bit Bereich nur sehr wenige Altlasten gibt, so
dass Migrationsoptionen nur sehr selten bentigt werden. Verfgt eine Anwendung bereits ber eine
konfigurierte Ausfhrungsebene wird davon ausgegangen, dass diese Anwendung schon auf die
Betriebssysteme Windows Vista und Windows Server 2008 abgestimmt wurde. Dieses wird durch das
Schema der Abbildung 5.41 besonders deutlich.
200
Abbildung 5.41: Virtualisierung beim Zugriff auf das Dateisystem und die Systemregistrierung
201
Kapitel 5
allerdings diese Privilegien, wodurch eine eventuell gestartet Installation fehlschlgt. Dennoch ist ein
solches Modell umsetzbar, denn der Windows Installer untersttzt seit jeher die Installation in
geschtzten Umgebungen. Hierunter sind Szenarien zu verstehen, in denen Installationen von einem
Standardbenutzer ausgefhrt werden, obwohl administrative Privilegien erforderlich wren. Dieses
wird mglich, da der Server-Prozess des Windows Installers mit den Rechten des lokalen
Systemkontos ausgefhrt wird und somit auf nahezu alle Bereiche des Systems schreibend zugreifen
kann. Im Normalfall werden die erforderlichen Aktionen jedoch nicht mit den Privilegien des
Systemkontos ausgefhrt, vielmehr findet stattdessen ein Identittswechsel auf den aktuellen Benutzer
statt, dessen Privilegien dann fr die Installationsaufgaben verwendet werden. Hierdurch wird zunchst
sichergestellt, dass ein Benutzer nur die Aktionen ausfhren kann, fr die er auch ermchtigt wurde. Es
wird jedoch auch deutlich, dass die Mglichkeit der Verwendung der hheren Rechte grundstzlich
existiert. Eine solche Verwendung ist nicht so einfach mglich, sondern setzt entsprechende
Autorisierungen voraus, damit die Einordnung in die Sicherheits-Infrastruktur des Betriebssystems
gewhrleistet werden kann. Einfach ausgedrckt muss ein Administrator einen Benutzer autorisieren
bei der Installation hhere Privilegien zu verwenden. Entscheidend ist hierbei, dass die Autorisierung
von einem privilegierten Benutzer durchgefhrt wird und nicht durch das Installationspaket selbst
erfolgen kann.
Wichtig Beginn
Ein Installationspaket kann sich nicht selbst fr die Verwendung erhhter Rechte autorisieren.
Wichtig Ende
Erfolgt eine Autorisierung, so dass die Installation von einem Standardbenutzer ausgefhrt werden
kann, werden die folgenden Privilegien im Rahmen des Installationsprozesses verwendet:
Alle Aktionen der Tabelle InstallUISequence werden mit den Privilegien des Benutzers ausgefhrt,
der die Installation startet.
Alle
benutzerdefinierten
Aktionen
der
Tabelle
InstallExecuteSequence
die
als
msidbCustomActionTypeInScript + msidbCustomActionTypeNoImpersonate (3072) gekennzeichnet
sind, werden mit den Privilegien des lokalen Systemkontos ausgefhrt.
Alle anderen benutzerdefinierten Aktionen der Tabelle InstallExecuteSequence werden im Kontext
des Benutzers ausgefhrt.
Alle lokalen Zugriffe auf das Dateisystem und die Systemregistrierung werden mit den Rechten des
lokalen Systemkontos ausgefhrt.
Alle Netzwerkzugriffe erfolgen mit den Privilegien des Benutzers.
Die technische Umsetzung der Autorisierung ist recht einfach. Ein Administrator registriert das zu
installierende Produkt ohne es physisch zu installieren. Hierdurch werden nur rudimentre Elemente
des Produktes auf das System gebracht; wesentlicher ist hierbei jedoch die Autorisierung zur
Verwendung erhhter Privilegien, die im Repository des Windows Installers abgelegt wird. Wird die
Installation fortan von einem Standardbenutzer durchgefhrt, werden fr die Installationsaktionen
erhhte Rechte verwendet, falls dieses erforderlich ist. Hierzu werden fr die lokalen Aktivitten die
Privilegien des lokalen Systemkontos verwendet; Netzwerkzugriffe werden hingegen im Kontext des
aktuellen Benutzers ausgefhrt. Es stellt sich noch die Frage, wie die Autorisierung durch einen
Administrator praktisch erfolgen kann. Hierzu muss zunchst zwischen dem Privatanwender und dem
Firmenbenutzer (Corporate User) unterschieden werden, oder technisch ausgedrckt muss zwischen
der Verwendung in einer Domne und in einer Arbeitsgruppe unterschieden werden. Im DomnenUmfeld kann die Autorisierung durch jeden Domnen-Administrator erfolgen. Der manuelle Ansatz
202
fr solche Szenarien erfordert die Remote-Ausfhrung des Windows Installers unter Verwendung
geeigneter Tools auf dem jeweiligen Rechner, wodurch das Produkt angekndigt werden muss, wie es
mit der folgenden Befehlszeile mglich ist:
msiexec.exe /jm <Pfad zum Installationspaket>
Ein hervorragendes Tool, mit dem die Produktankndigung remote durchgefhrt werden kann ist
psexec.exe, das ber die Seite von Windows Sysinternals bereitgestellt wird. Eine entsprechende
Verwendung des Tools knnte wie folgt erfolgen:
psexec.exe \\Eagle -s -i -d msiexec.exe /jm "\\Eagle\Files\demo.msi"
Ein anderer Lsungsansatz verwendet Windows Management Instrumentation (WMI) wie das
folgende Code-Fragment darstellt. Es gilt es zu beachten, dass die Windows-Firewall standardmig
WMI blockiert, so dass hierfr eine Ausnahme erstellt werden muss.
public static void AdvertisePackage(string domainName,
string computerName,
string userName,
string loginPassword,
string msiFilePath,
string installOptions,
bool allUsers)
{
ManagementScope managementScope = null;
// Optionen fr den Verbindung
ConnectionOptions connectionOption = new ConnectionOptions();
connectionOption.Impersonation = ImpersonationLevel.Impersonate;
connectionOption.Authentication = AuthenticationLevel.PacketPrivacy;
connectionOption.Authority = "ntlmdomain:" + domainName;
// Prfen ob die Installation lokal oder Remote erfolgen soll
if (computerName.Equals(Environment.MachineName, StringComparison.InvariantCultureIgnoreCase))
{
managementScope = new ManagementScope(@"\ROOT\CIMV2", connectionOption);
}
else
{
connectionOption.Username = userName;
connectionOption.Password = loginPassword;
// Scope definieren
managementScope = new ManagementScope(string.Format(@"\\{0}\root\cimv2",
computerName), connectionOption);
managementScope.Options.Impersonation = ImpersonationLevel.Impersonate;
}
// Verbinden
managementScope.Connect();
203
Kapitel 5
Die gerade skizzierten Vorgehensweisen zeigen einfache Mglichkeiten zur Lsung der Anforderung.
Allerdings sind diese Lsungsanstze in greren Netzwerkumgebungen nicht praktikabel, da der
Komfort und die Verwaltung nur uerst gering zu bezeichnen sind. Wesentlich komfortabler und
einfacher gestaltet sich Softwareverteilung ber die Gruppenrichtlinien des Active Directories. Im
Rahmen dieser Softwareverteilungs-Methode wird zwischen dem Zuweisen und dem Verffentlichen
von Installationspaketen unterschieden. Das Zuweisen von Software entspricht hierbei der klassischen
Produktankndigung des Windows Installers, also die Registrierung von Schnittstellen ohne dabei das
Produkt physisch zu installieren. Die Zuweisung kann sowohl fr den Computer als auch fr den
Benutzer erfolgen. Wird die Software einem Benutzer zugewiesen, wird sie auf jedem Computer
installiert, an dem sich der Benutzer anmeldet. Die physische Installation erfolgt nicht automatisch,
sondern erst wenn der Benutzer die Software startet. Wird die Software einem Computer zugewiesen,
wird diese beim nchsten Start des Computers automatisch installiert. Die Verffentlichung erfolgt
immer benutzerbezogen. Hierbei wird die Software nach der nchsten Anmeldung des Benutzers in der
Systemsteuerung zur Installation angeboten. Hieraus wird deutlich, dass spezielle Implementierungen
im Active Directory vorhanden sind, die auf die Softwareverteilung abzielen.
Wesentlich komplizierter und unkomfortabler sind solche Szenarien in Arbeitsgruppen und auf
Einzelplatzrechnern umzusetzen. Problematisch ist hierbei, dass es keine bergeordneten
Administratoren gibt, die auf alle Computer zugreifen knnen. Es ist somit der lokale Administrator
gefordert, die Registrierung der Produkte nach den oben skizzierten Vorgehensweisen ber die
Befehlszeile, Windows Management Instrumentation oder sonstige Programmiertechniken
durchzufhren. Hufig stellt sich hier natrlich die Frage, warum der Administrator nicht gleich die
Installation ausfhrt, wenn er sich eh auf dem System lokal anmelden muss. Die Frage ist legitim und
in vielen Fllen auch der praktikabelste Ansatz. Soll eine Anwendung allen Benutzern zugnglich
gemacht werden, warum denn nicht diesen Weg beschreiten. Aber soll die Anwendung nur bestimmten
Benutzern zugnglich gemacht werden, also eine Benutzerinstallation durchgefhrt werden, ist die
Vorabregistrierung oder Produktankndigung der geeignete Weg. An dieser Stelle kommt natrlich
auch die Benutzerkontensteuerung von Windows Vista und Windows Server 2008 als komfortable
Umsetzung des RunAs-Befehls zur Verwendung, aber dazu spter mehr.
besonders deutlich. Bei der Installation einer Anwendung erscheint der Dialog mit dem die
Verwendung erhhter Privilegien besttigt werden muss; identisches gilt fr die Deinstallation. Aber
was ist bei der Reparatur oder der Nachinstallation von Features, warum erscheint der
Besttigungsdialog hier nicht, oder erscheint er doch? Ich denke diese Frage ist uerst wichtig wenn
es um das Design von Installationspaketen fr Windows Vista und Windows Server 2008 geht. Aber
auch hierbei zunchst zurck zum Anfang und einigen grundlegenden Aspekten.
Der Lsungsansatz fr die Frage ist einfach und auch nicht verwunderlich. Anwendungen die fr den
Computer (per-machine) oder als verwaltete Benutzerinstallation (per-user managed) auf das System
gebracht werden, verwenden automatisch erhhte Privilegien bei nachgeordneten Installationen. Dieser
Mechanismus, der als Sticky Elevation bezeichnet wird, sorgt dafr, dass bei der Reparatur oder
Nachinstallation von Features die Verwendung erhhter Rechte unter Windows Vista und Windows
Server 2008 nicht explizit besttigt werden muss. Oder einfach ausgedrckt werden alle
untergeordneten Installationen automatisch mit erhhten Privilegien ausgefhrt. Wird also ein Produkt
in diesem Kontext registriert, verwendet es immer erhhte Privilegien. Problematisch ist hierbei die
Deinstallationsoption. Wie bereits erlutert, muss die Deinstallation des Produktes durch den UACDialog explizit besttigt werden. Wird jedoch der Wartungsmodus ausgefhrt, erfolgt die Sticky
Elevation. Wird nun im Wartungsmodus die Option zur Deinstallation des Produktes gewhlt, fhrt
dieses zum Fehler, da die erforderlichen Rechte nicht gegeben sind. Es ist somit im Rahmen der
Wartung nur mglich, einige Features zu entfernen, das Entfernen aller Features (REMOVE=ALL),
also die Produktdeinstallation, schlgt fehl.
Es existiert noch eine weitere Mglichkeit die Installation mit erhhten Rechten durch einen
Standardbenutzer durchfhren zu lassen, wozu die Systemrichtlinie Immer mit erhhten Rechten
installieren (AlwaysInstallElevated) verwendet werden kann. Wird diese Richtline in der
Benutzerkonfiguration und der Computerkonfiguration auf True gesetzt, werden alle Installationen
unter Verwendung erhhter Rechte ausgefhrt.
Achtung Beginn
Die Verwendung der Systemrichtlinie AlwaysInstallElevated stellt ein enormes Sicherheitsrisiko dar,
da alle Installationen schreibend auf das System zugreifen und es somit potentiell gefhrden knnen.
Bei gesetzter Systemrichtlinie wird unter Windows Vista und Windows Server 2008 kein
Besttigungsdialog angezeigt.
Achtung Ende
In der Praxis wird diese Richtlinie dennoch hufig verwendet, jedoch nicht permanent. Soll heien, die
Richtlinie wird aktiviert, das Produkt wird installiert oder angekndigt und anschlieend wird die
Richtlinie wieder deaktiviert. In diesem Szenario gilt besonders zu beachten, dass keine Sticky
Elevation durchgefhrt wird, wie vorhergehend beschrieben. Die Richtlinie AlwaysInstallElevated
wirkt sich nur auf die aktuelle Installationstransaktion aus. Das bedeutet, dass das Installationsszenario
umsetzbar wre, aber untergeordnete Installationen wie beispielsweise die Reparatur wahrscheinlich
nicht. Dieses begrndet sich darauf, dass zum Zeitpunkt der Reparatur die Richtlinie nicht aktiv ist,
wodurch keine erhhten Rechte angefordert werden. Somit erfolgt die Reparatur im Kontext des
aktuellen Benutzers. Sind dessen Rechte fr die jeweilige Aktion nicht ausreichend kommt es
zwangslufig zum Installationsfehler.
Es ist erkennbar, dass die mglichen Szenarien oder Verhaltensmuster durchaus zu abweichenden
Ergebnissen fhren knnen. Dennoch ist der unterliegende Algorithmus sehr einfach und konkret
gehalten. Nur verwaltete Anwendungen (managed applications) verwenden Sticky Elevation.
Verwaltete Anwendungen sind Installationen die unter der Kontrolle des Systemadministrators
Persnliche Ausfertigung fr Martin Martinsson
205
Kapitel 5
207
Kapitel 5
208
Kommen wir zunchst zur Anzeige des Dialogs. Die Frage die hierzu gestellt wurde, ist nicht so
einfach zu beantworten. Das liegt darin begrndet, dass eine Vielzahl von Rahmenparametern zu
bercksichtigen sind. Die genaue Ablaufsteuerung fr die Installation eines Produktes ist in
Abbildung 5.42 dargestellt.
Abbildung 5.42: Anzeige des UAC-Dialogs bei der Installation eines Produktes
Es ist ersichtlich, dass zunchst geprft wird, ob es sich um eine Erst- oder eine Folgeinstallation
handelt. Handelt es sich um eine Erstinstallation, prft der Windows Installer ob das Produkt bereits
zur Verwendung mit erhhten Rechten angekndigt wurde. Falls dieses zutrifft wird kein Dialog
angezeigt und die physische Installation des Produktes erfolgt. Im anderen Fall wird geprft ob die
Installation bereits mit vollstndigen Privilegien gestartet wurde, wie das beispielsweise beim Aufruf
durch eine setup.exe der Fall wre. Ist dieses zutreffend wird kein Dialog angezeigt und die Installation
wird ausgefhrt. Falls keine vollstndigen Privilegien vorhanden sind, wird nun geprft, ob es sich um
ein Standardbenutzer-Paket handelt, also ob es sich um ein Paket handelt, dass nur das aktuelle
Benutzerprofil beeinflusst. In diesem Fall ist eine Anzeige des Dialogs nicht erforderlich, da
Standardbenutzerrechte fr die Installation ausreichend sind. Im nchsten Schritt wird geprft ob die
Benutzerkontensteuerung oder die relevanten Teile davon aktiviert sind. Falls nicht, ist die Anzeige
des Dialogs natrlich nicht erforderlich. Als letztes wird die Anzeigestufe der Benutzeroberflche
(UILevel) geprft. Falls die Installation nicht unbeaufsichtigt (silent) ausgefhrt wird, wird der
Besttigungsdialog angezeigt, ansonsten erscheint der Dialog nicht. Hieraus folgt dass bei einer
unbeaufsichtigten Ausfhrung die Besttigung der erhhten Privilegien vor dem Aufruf des Installers
erfolgen muss. Eine einfache programmtechnische Umsetzung zeigt Listing 5.48.
public void InstallPrivileged()
{
// Argumente konstruieren
string installPackage = System.IO.Path.Combine(Application.StartupPath, "demo.msi");
string arguments = string.Format("/i \"{0}\" /qn+", installPackage);
209
Kapitel 5
Handelt es sich um keine Erstinstallation, also um eine Folge- oder Wartungsinstallation wird bei einer
verwalteten Installation (per-machine und per-user managed) die Anzeige des Besttigungsdialogs
unterdrckt. Ansonsten wird mit der Prfung der administrativen Privilegien fortgefahren. Die
Deinstallation des Produktes wurde in dem Schema nicht bercksichtigt. Hierbei wird zunchst vom
Windows Installer geprft ob vollstndige Privilegien fr die Deinstallation erforderlich sind, wie das
beim Entfernen einer Maschineninstallation der Fall wre. Im nchsten Schritt wird geprft, ob bereits
administrative Berechtigungen vorhanden sind. In diesem Fall wird die Deinstallation ohne erneute
Anzeige des Dialogs ausgefhrt. Im anderen Fall erscheint natrlich der Dialog, damit die
Verwendung der vollstndigen Privilegien besttigt werden kann.
Was an dieser Stelle noch fehlt ist die Frage nach der Darstellung und der Farbgebung des UACBesttigungsdialogs. Wie bereits zu Beginn dieses Kapitels erlutert, hngt die Illustration von
diversen Faktoren ab. Relevant fr die Installation ist zunchst, ob das Installationspaket digital
signiert wurde. Falls das nicht der Fall ist, erscheint der Dialog mit einem orangenen Farbbalken, der
den Hinweis Ein nicht identifiziertes Programm mchte auf den Computer zugreifen trgt. Wurde
das
Installationspaket
hingegen
mit
dem
Zertifikat
einer
vertrauenswrdigen
Stammzertifizierungsstelle (trusted root authority) digital signiert, wird der Dialog durch einen grauen
Balken mit dem Hinweis Zur Fortsetzung des Programms ist Ihre Zustimmung erforderlich
gekennzeichnet. In diesem Fall werden noch zustzliche Metainformationen des Paketes, wie die
Eigenschaften Manufacturer, ProductVersion und ProductLanguage, angezeigt.
Eine etwas unglckliche Implementierung zeigt sich hingegen bei der Deinstallation. Auch hier wird
der Besttigungsdialog angezeigt, allerdings erscheint er immer in der Darstellung nicht signierter
Installationspakete. Das hat damit zu tun, dass bei der Deinstallation das im Cache befindliche
Installationspaket verwendet wird. Dieses Paket wurde allerdings im Rahmen der Installation in der
Form modifiziert, dass interne Kabinett-Dateien entfernt wurden. Vom Sicherheitsaspekt hat hier also
eine physische Modifikation des Paketes stattgefunden, wodurch die digitale Signatur durchbrochen
wurde. Somit wird es als nicht signiertes, also als nicht identifiziertes Programm angesehen, dass auf
den Computer zugreifen mchte. Dieses Szenario ist im Artikel Q929467 erlutert; eine Lsung ist erst
bei Windows 7 zu erwarten.
ber die Befehlszeile veranlasst wurde. Diese Unterscheidung ist uerst relevant fr die Speicherung
der Benutzerdaten und die zur Verfgung stehenden Privilegien, wie die folgenden Szenarien
verdeutlichen.
Eine Windows Installer basierte Installation wird durch Benutzer A unter Verwendung einer
setup.exe (Bootstrapper) gestartet. Wie zu Beginn des Kapitels beschrieben, kommt hier nun die
Installer-Erkennung der Benutzerkontensteuerung ins Spiel, da die Datei setup.exe heit. Hieraus wird
abgeleitet, dass es sich um ein Installationsprogramm handelt und dass solche Programme
normalerweise administrative Privilegien bentigen, weshalb der UAC-Besttigungsdialog angezeigt
wird. Da es sich bei Benutzer A um einen Standardbenutzer handelt wird der erweiterte
Besttigungsdialog (prompt for credentials) angezeigt. Benutzer A whlt hier nun einen Benutzer
aus, der ber ausreichende Privilegien verfgt; in diesem Fall Benutzer B. Die Installation wird nun
privilegiert ausgefhrt, wobei die folgenden Rahmenparameter verwendet werden:
Alle Aktionen und benutzerdefinierten Aktionen der Tabelle InstallUISequence werden mit den
Privilegien von Benutzer B ausgefhrt.
Der Client-Prozess wird ebenfalls mit den Rechten von Benutzer B ausgefhrt.
Alle Zugriffe auf das gemeinsam genutzte Dateisystem und den maschinenbasierten Teil der
Systemregistrierung (HKEY_LOCAL_MACHINE) werden mit den Rechten des lokalen
Systemkontos ausgefhrt. Alle Zugriffe auf den benutzerspezifischen Teil des Dateisystems werden
mit den Privilegien von Benutzer B ausgefhrt.
Benutzerdefinierte
Aktionen
der
Tabelle
InstallExecuteSequence
die
als
msidbCustomActionTypeInScript + msidbCustomActionTypeNoImpersonate (3072) gekennzeichnet
sind, werden mit den Privilegien des lokalen Systemkontos ausgefhrt.
Alle anderen benutzerdefinierten Aktionen der Tabelle InstallExecuteSequence werden im Kontext
des Benutzers B ausgefhrt.
Alle Netzwerkzugriffe erfolgen mit den Privilegien des Benutzers B.
Alle
Zugriffe
auf
den
benutzerbezogenen
Teil
der
(HKEY_CURRENT_USER) werden durch Benutzer B durchgefhrt.
Systemregistrierung
Gleiches gilt fr die Umgebungsvariablen, auf die wiederum im Kontext von Benutzer B
zugegriffen wird.
Aus diesem Schema lsst sich sehr gut erkennen, dass die Ablagestruktur nicht sehr einfach
nachvollziehbar ist. Das liegt daran, dass benutzerspezifische Informationen im Benutzerprofil von
B abgeleitet werden. Hieraus folgt auch, dass beispielsweise solche Dateiverknpfungen fr
Benutzer A gar nicht sichtbar sind. Problematisch ist hierbei, dass Benutzer A die Installation
startet aber dass fr ihn keine Elemente auf dem Desktop und im Startmen des Betriebssystems
angezeigt werden. Das Installationsergebnis ist so nicht direkt nachvollziehbar.
Ein anderes Bild ergibt sich beim Starten der Installation durch einen Doppelklick auf die Windows
Installer-Datei oder unter Verwendung der Befehlszeile. Hierdurch erfolgt die Anforderung der
erhhten Privilegien durch den Windows Installer selbst. Auch hier wird wiederum Benutzer B
ausgewhlt, damit eine privilegierte Installation erfolgen kann. Allerdings sind die Rahmenparameter
abweichend gestaltet.
Alle Aktionen und benutzerdefinierten Aktionen der Tabelle InstallUISequence werden in diesem
Szenario mit den Privilegien von Benutzer A ausgefhrt.
Der Client-Prozess wird auch mit den Rechten von Benutzer A ausgefhrt.
Persnliche Ausfertigung fr Martin Martinsson
211
Kapitel 5
Alle Zugriffe auf das Dateisystem und den maschinenbasierten Teil der Systemregistrierung
(HKEY_LOCAL_MACHINE) werden mit den Rechten des lokalen Systemkontos ausgefhrt.
Benutzerdefinierte
Aktionen
der
Tabelle
InstallExecuteSequence
die
als
msidbCustomActionTypeInScript + msidbCustomActionTypeNoImpersonate (3072) gekennzeichnet
sind, werden mit den Privilegien des lokalen Systemkontos ausgefhrt.
Alle anderen benutzerdefinierten Aktionen der Tabelle InstallExecuteSequence werden im Kontext
des Benutzers A ausgefhrt.
Alle Netzwerkzugriffe erfolgen mit den Privilegien des Benutzers A.
Die Zugriffe auf den benutzerbezogenen Teil der Systemregistrierung (HKEY_CURRENT_USER)
werden auch hier durch Benutzer A durchgefhrt.
Gleiches gilt fr die Umgebungsvariablen, auf die wiederum im Kontext von Benutzer A
zugegriffen wird.
Hierbei lsst sich gut erkennen, dass die benutzerspezifischen Informationen wie erwartet im
Benutzerprofil von A abgelegt werden, also im Profil des Benutzers, der auch die Installation
ausfhrt und nicht im Profil des Benutzers, dessen Privilegien verwendet werden. Hieraus wird
deutlich, dass mehrere Mglichkeiten existieren, zu einem Installationserfolg zu gelangen. Beachtet
werden mssen jedoch die Rahmenparameter im Installationsszenario. Erkennbar ist auch, dass das
letzte Szenario dem erwarteten Ergebnis entspricht, womit diese Vorgehensweise favorisiert werden
sollte. Ist es zwingend erforderlich einen Bootstrapper zu verwenden, sollte die abweichenden
Verhaltensmuster und Installationsbilder immer Bercksichtigung finden.
Standardbenutzerinstallationen
Analog zu dem Festlegen eines Ausfhrungslevels auf Anwendungsebene existiert ein hnlicher
Mechanismus auch fr Installationspakete. Hierdurch wird es mglich, Installationspakete zu
kennzeichnen, die lediglich die Rechte eines Standardbenutzers bei der Installation bentigen. Diese
Installationspakete werden als Standardbenutzer-Pakete oder UAC-Konforme Installationspakete
bezeichnet.
Bevor ein Installationspaket fr die ausschlieliche Verwendung der Standardbenutzerrechte
gekennzeichnet werden kann, ist natrlich zu prfen, ob diese Rechte fr den Installationserfolg
tatschlich ausreichend sind. Wird ein Paket als UAC-Konform gekennzeichnet, wird logischerweise
kein UAC-Besttigungsdialog angezeigt. Enthlt das Installationspaket nun Elemente oder Aktionen
die vollstndige Privilegien erwarten kommt es zwangslufig zum Installationsfehler. Um im Vorfeld
diesbezgliche Fehlerquellen auszuschlieen sollten die folgenden Vorgaben bercksichtigt werden.
In der Tabelle InstallUISequence sollte eine benutzerdefinierte Aktion vom Typ 51 verwendet
werden, mit der die Eigenschaft ALLUSERS zurckgesetzt wird.
Dateien mssen in einem Ordner abgelegt werden, auf den ein Standardbenutzer schreibend
zugreifen kann. Es knnen natrlich die variablen Ordnerbezeichner wie beispielsweise
DesktopFolder, ProgramMenuFolder oder StartMenuFolder verwendet werden, die in
Abhngigkeit zur Eigenschaft ALLUSERS auf ein Computer- oder Benutzerverzeichnis verweisen.
Es ist jedoch zu beachten, dass ProgramFilesFolder hiervon nicht abhngig ist.
Die Anwendung sollte unter LocalAppDataFolder installiert werden.
Alle Registrierungseintrge sind unter HKEY_CURRENT_USER zu schreiben, was durch die 1
in der Spalte Root der Tabelle Registry festzulegen ist.
212
Wert
Beschreibung
Lange Dateinamen
Kurze Dateinamen
Bei der Quelle handelt es sich um das Abbild einer administrativen Installation
Da es sich bei dieser Eigenschaft um ein Bit-Feld handelt, sind die einzelnen Werte zu kombinieren.
Soll also ein Paket gekennzeichnet werden, das mit Standardbenutzer-Privilegien bei der Installation
auskommt, das lange Dateinamen verwendet und bei dem die zu installierenden Ressourcen in
komprimierter Form vorliegen, ist dieser Eigenschaft der Wert 10 zuzuordnen. Zum Festlegen der
Eigenschaft eignet sich das Tool msiinfo.exe, das sich im Windows Installer-SDK befindet und wie
folgt aufzurufen ist:
msiinfo.exe <Pfad zum Installationspaket> /W 10
Alternativ bietet auch Orca in der aktuellen Version die Mglichkeit diese Eigenschaft zu
modifizieren. Hierzu ist das Feld UAC Compliant im Dialog Edit Summary Information zu aktivieren,
wie auch Abbildung 5.43 verdeutlicht.
213
Kapitel 5
Bei der Verwendung von Windows Installer-XML kann die entsprechende Information direkt im WIXDokument angegeben werden. Hierzu ist das Attribut InstallPrivileges des Elementes <Package/> auf
den Wert limited zu setzen. Ein WIX-Dokument zur Definition eines UAC-Konformen
Installationspaketes zeigt Listing 5.49.
<?xml version="1.0" ?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<!-- Produktdefinition -->
<Product UpgradeCode="2501DE56-6CC9-4078-B87E-F6664896125F" Manufacturer="Microsoft Deutschland GmbH"
Language="1031" Version="1.00.0000" Name="Vista UAC Non-Admin"
Id="7BF40BDA-E554-4949-8A6E-10297BD30BB6" Codepage="1252">
<!-- Definition des Summary Information Streams -->
<Package Keywords="Microsoft Windows Installer, MSI"
Description="UAC-Konformes Installationspaket" Manufacturer="Andreas Kerl" InstallerVersion="400"
Platform="x86" Languages="1031" Compressed="yes" SummaryCodepage="1252"
InstallPrivileges="limited" />
<!-- Eigenschaften und Bedingungen -->
<Condition Message='Bentigt Microsoft Windows Vista oder ein neueres
Betriebssystem'>VersionNT >= 600</Condition>
<Condition Message ='Die Verwendung dieses Installationspaketes als Nested Installation
wird nicht untersttzt.'>Not ParentProductCode</Condition>
<Property Id="INSTALLLEVEL" Value="3" />
<Property Id="MsiLogging" Value="icewarmupvxo" />
<!-- Icons fr Shortcuts -->
<Icon Id="AdminIcon.exe" SourceFile="$(var.SourceFolder)Admin.ico.exe" />
214
215
Kapitel 5
Wird hingegen das Attribut InstallPrivileges auf elevated gesetzt oder wird keine Kennzeichnung im
Summary Information Stream vorgenommen, geht der Windows Installer davon aus, dass vollstndige
Privilegien fr die Installation erforderlich sind und dass der Besttigungsdialog angezeigt wird. Hier
sei anzumerken, dass das dargestellte Verhalten unabhngig von den tatschlich erforderlichen
Rechten fr die Installationsttigkeit ist, sondern ausschlielich von der definierten Eigenschaft
abhngig ist. Wird ein Installationspaket erstellt, das Dateien lediglich im Benutzerprofil speichert,
sind folglich keine vollstndigen Berechtigungen erforderlich, so dass unbedingt ein StandardbenutzerPaket erstellt werden sollte. Existiert hingegen ein UAC-Konformes Installationspaket und sollen
hiermit Eintrge in der Systemregistrierung unter HKEY_LOCAL_MACHINE angelegt werden, kommt
es zum Fehler im Installationsprozess, da die Benutzerrechte nicht ausreichend sind. Es gilt somit das
Gleiche wie bei der Entwicklung einer Anwendung. Es muss genau geprft werden, an welchen Stellen
des Systems Modifikationen vorgenommen werden und anhand dieser Ergebnisse ist der
Ausfhrungslevel zu setzen
216
Abbildung 5.44: Anzeige des UAC-Dialogs bei der Anwendung eines Patches
Im ersten Schritt wird geprft, ob bereits vollstndige Privilegien fr die Anwendung des Patches
vorliegen. In diesem Fall ist eine weitere Besttigung des Benutzers nicht erforderlich und der Patch
wird auf das installierte Produkt angewendet. Im nchsten Schritt wird zunchst geprft, ob das
Produkt fr alle Benutzer (per-machine) oder nur fr den aktuellen Benutzer (per-user) installiert
wurde. Nehmen wir zunchst die Benutzerinstallation. Hier wird geprft, ob es sich bei zu
aktualisierenden Produkt um ein UAC-Konformes Installationspaket handelt. In diesem Fall sind fr
die Aktualisierung logischerweise auch nur Standardbenutzerrechte erforderlich, wodurch keine
Besttigung erfolgen muss. Handelt es sich um kein Standardbenutzer-Paket werden zur Installation
des Patches wiederum vollstndige Privilegien bentigt, so dass die Verwendung explizit besttigt
werden muss. Im Rahmen der Computerinstallation kommen nun die LUA-Patches oder auch UACPatches ins Spiel. Zunchst wird geprft ob die Verwendung von LUA-Patches berhaupt mglich ist
und nicht durch Systemrichtlinien oder anderen Vorkehrungen auer Kraft gesetzt wurde. Im nchsten
Schritt wird festgestellt, ob es sich um einen LUA-Patch handelt. Ist dieses der Fall wird der Patch auf
das Produkt angewendet, ohne dass der Besttigungsdialog erscheint.
LUA-Patching
Die Untersttzung und Verwendung von LUA-Patches ist nicht neu in Windows Vista, sondern wurde
auf Initiative der Spielhersteller fr die Windows-Plattform bereits in den Windows Installer 3.0
integriert. Eine Vielzahl dieser Hersteller verfolgte das Ziel, fr ihre Spiele den Windows XP Logo
Status zu erlangen. Hierzu ist es jedoch erforderlich, dass sich das Standardinstallationsverzeichnis
unterhalb des Ordners %ProgramFiles% befindet und dass die Spiele auch von Benutzern ohne
administrative Berechtigungen ausgefhrt werden knnen. Im Normalfall ist dieses problemlos
mglich, da jeder Benutzer standardmig auf die Dateien und Ordner unterhalb von
%ProgramFiles% schreibgeschtzt zugreifen kann. Problematische Aspekte ergeben sich hingegen bei
Anwendungen, die relativ hufig aktualisiert werden mssen, wie es bei MMOGS (massive multi user
online games) der Fall ist. Zur Ausfhrung dieser Spiele ist die Anwendung eines Patches vielfach
erforderlich, um die clientseitige Version des Spiels auf den Versionsstand des Servers anzupassen.
Persnliche Ausfertigung fr Martin Martinsson
217
Kapitel 5
Die Aktualisierung erstreckt sich hierbei zwangslufig auch auf Bereiche, auf die ein Standardbenutzer
nur ber einen schreibgeschtzten Zugriff verfgt, so dass die Aktualisierung nicht durchgefhrt
werden kann.
Zur Verwendung von LUA-Patches sind Richtlinien sowohl bei der Erstellung des Installationspaketes
als auch bei der Erstellung der jeweiligen Patches zu beachten. Der gesamte Algorithmus zur
Anwendung von LUA-Patches beruht auf der Prfung eines Zertifikates mit dem die jeweiligen
Patches digital signiert werden mssen. Bevor der Patch auf das Produkt angewendet wird, wird die
digitale Signatur des Patches extrahiert und mit dem Zertifikat verglichen, das im
Originalinstallationspaket gespeichert ist. Fllt dieser Vergleich positiv aus, kann der Patch auf das
jeweilige Produkt angewendet werden. Erkennbar ist hierbei, dass das Installationspaket ber
Mglichkeiten verfgen muss, das Zertifikat aufzunehmen. Hierzu sind die beiden Tabellen
MsiDigitalCertificate und MsiPatchCertificate erforderlich.
MsiDigitalCertificate: Windows Installer verwendet digitale Signaturen, um fehlerhafte
Ressourcen festzustellen. Die Tabelle MsiDigitalCertificate speichert Zertifikate als binren
Datenstrom und verknpft jedes Zertifikat mit einem Primrschlssel. Der Primrschlssel wird
bentigt, um die Zertifikate von mehreren digital signierten Objekten gemeinsam zu verwenden.
Windows Installer Version 2.0 kann ausschlielich die digitalen Signaturen von externen
Kabinettdateien
durch
die
Verwendung der
Tabellen MsiDigitalSignature
und
MsiDigitalCertificate verifizieren. Mit den neueren Versionen des Windows Installers wird diese
Tabelle auch verwendet, um Zertifikate zu speichern, mit denen Windows Installer-Patches digital
signiert wurden.
MsiPatchCertificate: Die Tabelle MsiPatchCertificate enthlt Referenzen auf die mglichen
Zertifikate, mit denen ein Patch digital signiert werden kann. Die Informationen dieser Tabelle sind
erforderlich, um das LUA-Patching zu ermglichen.
Die einzige Vorgabe, die bei der Erstellung des Patches zu bercksichtigen ist, betrifft die digitale
Signatur des Patches selbst. Es ist erforderlich, die MSP-Datei mit einem Zertifikat digital zu
signieren, das im Originalinstallationspaket gespeichert ist. Das Aufbringen der digitalen Signatur
kann mit dem Tool signcode.exe oder signtool.exe vorgenommen werden.
Im Normalfall werden Softwareprodukte ber eine sehr lange Zeitdauer verwendet, die hufig die
Gltigkeitsdauer der Zertifikate bersteigt. Aus diesem Grund wird bei der Anwendung des Patches
lediglich die bereinstimmung der Zertifikate geprft, wobei die Gltigkeitsdauer der Zertifikate nicht
bercksichtigt wird. Hieraus ergibt sich, dass ein Patch angewendet werden kann, obwohl die
Gltigkeitsdauer des Zertifikats verstrichen ist. Ein potentielles Sicherheitsproblem hingegen sind
gesperrte Zertifikate, da die Ursache hierfr hufig in der Offenlegung des privaten Schlssels zu
finden ist. Falls ein Zertifikat gesperrt wird, nachdem der Patch auf das Produkt angewendet wurde,
tritt kein Fehler bei zuknftigen Installationsttigkeiten auf, solange sich die Kopie des Patch-Paketes
im Ordner %windir%\installer befindet. In bestimmten Situationen und Umgebungen kann es jedoch
erforderlich werden, ein neues Zertifikat fr die Signatur der Patches zu verwenden. Hierzu kann ein
weiterer Patch verwendet werden, der der Tabelle MsiPatchCertificate einen neuen Eintrag hinzufgt
oder einen existierenden Eintrag aktualisiert. Hierdurch kann es geschehen, dass mehrere Zertifikate in
der jeweiligen Tabelle des Installationspaketes vorhanden sind. Zur Anwendung eines Patches muss
jedoch nur eine bereinstimmung vorliegen.
ausgefhrt. Gibt diese Funktionen einen der folgenden Werte zurck, wird das Zertifikat als nicht
vertrauenswrdig eingestuft und der Patch kann nicht angewendet werden:
TRUST_E_NOSIGNATURE (0x800B0100): Es war keine Signatur vorhanden.
TRUST_E_BAD_DIGEST (0x80096010): Die digitale Signatur des Objekts konnte nicht
besttigt werden.
TRUST_E_NO_SIGNER_CERT (0x80096002): Das Zertifikat fr den Signaturgeber fr diese
Nachricht ist ungltig oder wurde nicht gefunden.
TRUST_E_SUBJECT_NOT_TRUSTED (0x800B0004): Der Antragsteller gilt fr den
angegebenen Vorgang nicht als vertrauenswrdig.
CERT_E_MALFORMED (0x800B0108): Es fehlt ein Zertifikat, oder es hat keinen Wert fr ein
wichtiges Feld, z. B. ein Antragsteller- oder Ausstellername.
CERT_E_REVOKED (0x800B010C): Ein Zertifikat wurde explizit durch den Aussteller gesperrt.
TRUST_E_PROVIDER_UNKNOWN (0x800B0001): Unbekannter Vertrauensanbieter.
TRUST_E_SUBJECT_FORM_UNKNOWN (0x800B0003): Das fr den Antragsteller
angegebene Formular wird vom angegebenen Vertrauensanbieter nicht untersttzt oder ist ihm
nicht bekannt.
TRUST_E_ACTION_UNKNOWN
(0x800B0002):
Die
angegebene
Vorgang
der
Vertrauensberprfung wird von dem angegebenen Vertrauensanbieter nicht untersttzt.
Bei den folgenden Rckgabewerten handelt es sich um einige Sonderflle, die hingegen die
Anwendung des Patches zulassen.
CERT_E_EXPIRED (0x800B0101): Ein erforderliches Zertifikat befindet sich nicht im
Gltigkeitszeitraum gemessen an der aktuellen Systemzeit oder dem Zeitstempel in der signierten
Datei.
CERT_E_UNTRUSTED_ROOT (0x800B0109): Eine Zertifikatkette wurde zwar verarbeitet,
endete jedoch mit einem Stammzertifikat, das beim Vertrauensanbieter nicht als vertrauenswrdig
gilt.
CERT_E_UNTRUSTEDTESTROOT (0x800B010D): Der Zertifizierungspfad endet mit dem
Teststamm, der mit den aktuellen Richtlinieneinstellungen nicht vertrauenswrdig ist.
CERT_E_UNTRUSTEDCA (0x800B0112): Die Zertifizierungskette wurde richtig verarbeitet,
doch wird eines der Zertifizierungsstellen-Zertifikate vom Richtlinienanbieter nicht fr
vertrauenswrdig gehalten.
Zwei Formen dieser berprfungsergebnisse erfordern eine besondere Betrachtung, da diese durch den
Windows Installer abweichend interpretiert und verwendet werden.
Abgelaufene Zertifikate
Die Lebensdauer von Produkten ist im Normalfall wesentlich hher als die Gltigkeitsdauer von
Zertifikaten. Aus diesem Grund wird bei der Anwendung von LUA-Patches die Gltigkeitsdauer des
Zertifikates nicht berprft. Das Zertifikat wird lediglich mit der digitalen Signatur des Patches
verglichen. Ein problematischer Aspekt ergibt sich hierbei lediglich bei der Erstellung eines LUAPatches, da dieser mit einem abgelaufenen Zertifikat nicht signiert werden kann.
Um eine solche Problemsituation zu vermeiden ist es vor dem Ablauf des Zertifikates erforderlich,
dem Installationspaket ein neues Zertifikat hinzuzufgen. Solange das Zertifikat gltig ist, kann fr die
Persnliche Ausfertigung fr Martin Martinsson
219
Kapitel 5
Anwendungsvoraussetzungen
Der Verwendung von LUA-Patches setzt Windows XP oder Windows Vista als Betriebssystem und
mindestens die Version 3.0 des Windows Installer voraus. Falls die Forderung besteht, LUA-Patching
auf den untersttzten Betriebssystemen generell zu deaktivieren, kann hierfr die Systemrichtlinie
Installation von Updates, die durch Hersteller signiert wurden, fr Nichtadministratoren nicht
zulassen (DisableLUAPatching) verwendet werden. Diese Richtlinie wirkt sich auf alle Patches aus,
die zuknftig auf Produkte angewendet werden sollen. Wie bereits bei den bisherigen Richtlinien, gilt
auch diese global, so dass alle Patches davon betroffen sind. Um das LUA-Patching in Abhngigkeit
zu
bestimmten
Produkten
zu
verhindern,
kann
die
ffentliche
Eigenschaft
MSIDISABLELUAPATCHING verwendet werden. Auf den Server-Betriebssystemen Windows Server
2003 und Windows Server 2008 steht LUA-Patching nicht zur Verfgung.
Wie bereits dargestellt sind einige Voraussetzungen erforderlich, um LUA-Patches verwenden zu
knnen. So darf beispielsweise die Systemrichtlinie DisableLUAPatching nicht deaktiviert sein und die
richtige Version des Betriebssystems muss vorliegen. Diese und weitere Kriterien mssen bei der
Installation des Produktes erfllt sein, damit dieses Produkt durch LUA-Patches aktualisiert werden
kann. Die Erfllung dieser Kriterien wird in der Eigenschaft AuthorizedLUAApp in den
Konfigurationsdaten des Produktes abgelegt. Ein Wert von 1 fr diese Eigenschaft besagt, dass
LUA-Patches auf dieses Produkt angewendet werden knnen. Ein Wert von 0 oder ein fehlender
Wert kennzeichnet ein Produkt, auf das LUA-Patches nicht angewendet werden knnen.
Bei der Verwendung der Deployment Tools Foundation kann mit Hilfe der Eigenschaft
PrivilegedPatchingAuthorized des Objektes ProductInstallation ermittelt werden, ob LUA-Patches fr
220
die Anwendung untersttzt werden. Im nachfolgenden Codefragment wird dieses fr Visual Studio
2008 durchgefhrt, das Ergebnis ist positiv.
// Produkt: Visual Studio Team System 2008 - Team Suite
string productCode = "{80C06CCD-7D07-3DB6-86CD-B57B3F0614D8}";
// Objekt mit Installationseigenschaften abrufen
ProductInstallation product = new ProductInstallation(productCode);
// Entsprechende Eigenschaft verwenden
bool isAuthorizedLUAApp = product.PrivilegedPatchingAuthorized;
Der Wert der gerade dargestellten Eigenschaft kann whrend der Gltigkeitsdauer eines Produktes
nicht mehr verndert werden; sie wird bei der Basisinstallation des Produkts durch den Windows
Installer automatisch gesetzt. Bei der Entscheidung ob ein Produkt die Verwendung von LUA-Patches
untersttzt, wendet der Windows Installer den in Abbildung 5.45 dargestellten Algorithmus an:
Abbildung 5.45: Algorithmus zur Feststellung ob LUA-Patches fr das Produkt untersttzt werden
Hieraus ergeben sich die folgenden Kriterien, die bei der Installation des Produktes erfllt sein mssen,
damit der Windows Installer das Produkt zur Verwendung von LUA-Patches autorisiert.
Die Eigenschaft MSIDISABLELUAPATCHING darf nicht festgelegt sein.
Die Tabelle MsiPatchCertificate muss im Installationspaket vorhanden sein und gltige Daten
enthalten.
Persnliche Ausfertigung fr Martin Martinsson
221
Kapitel 5
AuthorizedLUAApp
Begrndung
LUA-Patching wird fr
Installationen von einem
administrativen Abbild nicht
untersttzt.
LUA-Patching wird fr
Installationen vom
Wechseldatentrger generell
untersttzt, wenn die Tabelle
MsiPatchCertificate gefllt ist und
der Mechanismus nicht durch die
Richtlinie oder die Eigenschaft
auer Kraft gesetzt wird.
Tabelle 5.45: Szenarien zur Kennzeichnung eines Produktes das LUA-Patches untersttzt
222
Bei der Erstellung von Installationspaketen fr Windows Vista sollte die perspektivische Verwendung
von LUA-Patches immer bercksichtigt werden. Wie bereits erlutert ist es erforderlich die Tabelle
MsiPatchCertificate in das Installationspaket zu integrieren und mit einem geeigneten Zertifikat zu
versehen. Entsprechende Szenarien sind natrlich auch mit Windows Installer-XML umsetzbar wie das
bereits bekannte Listing 5.49 zeigt. Bei der Betrachtung des Listings stellt sich die Frage, warum muss
das Zertifikat in das Paket integriert werden, wenn es sich doch um ein Standardbenutzerpaket handelt
und somit keine erhhten Privilegien fr die Installation von Patches erforderlich sind. Das ist
natrlich richtig, aber zunchst ist der Aufwand zum Integrieren eines Zertifikates sehr gering und man
ist hierdurch fr alle Eventualitten gerstet. Die Kennzeichnung als UAC-Konformes Paket besagt ja
zunchst nur, dass keine administrativen Privilegien fr die Installation erforderlich sind und das kein
UAC-Besttigungsdialog angezeigt wird. Es ist ja dennoch mglich die Installation privilegiert
auszufhren. Wenn dieses dann als Maschineninstallation erfolgt sind zwangslufig beim Anwenden
von Patches wiederum vollstndige Privilegien erforderlich.
Was fr die Installation gilt, ist natrlich auch fr die Deinstallation von Patches zutreffend. Seit dem
Windows Installer 3.0 knnen Patches deinstalliert werden, falls bestimmte Voraussetzungen
vorliegen. Hierbei ist es einem Benutzer ohne administrative Berechtigungen jedoch nicht mglich,
Patches von privilegierten Produkten zu deinstallieren. Falls es sich um einen LUA-Patch handelt,
kann dieser jedoch auch von einem Benutzer deinstalliert werden, der ber keine administrativen
Berechtigungen verfgt. Bei der Verwendung von Windows Vista ist dieses natrlich analog
anzuwenden; hier erscheint bei der Deinstallation des Patches kein UAC-Besttigungsdialog.
Bei der Anwendung eines LUA-Patches auf ein entsprechendes Produkt, werden Informationen zu der
Gltigkeit des Zertifikates ausgegeben. Im Weiteren wird ausgegeben ob der Patch den erforderlichen
Kriterien entspricht, was sich letztlich in der Operationsanweisung zur Registrierung des Patches
wieder findet.
Persnliche Ausfertigung fr Martin Martinsson
223
Kapitel 5
Falls das Zertifikat gesperrt wurde, werden diesbezgliche Informationen ebenfalls dem
Installationsprotokoll angefgt.
MSI (c) (8C:80) [10:20:53:708]: SOFTWARE RESTRICTION POLICY: Verifying patch --> '\\eagle\setup\update.msp'
against software restriction policy
MSI (c) (8C:80) [10:20:53:708]: SOFTWARE RESTRICTION POLICY: \\eagle\setup\update.msp has a digital signature
MSI (c) (8C:80) [10:20:53:708]: SOFTWARE RESTRICTION POLICY: \\eagle\setup\update.msp is not permitted
to run at the 'unrestricted' authorization level.
MSI (c) (8C:80) [10:20:53:708]: SOFTWARE RESTRICTION POLICY: \\eagle\setup\update.msp was disallowed
because a required certificate in its digital signature has been revoked by its issuer
(status = 0x800B010C). The returned execution level was 0
MSI (c) (8C:80) [10:20:53:708]: Die Installation von \\eagle\setup\update.msp wurde durch die
Richtlinie fr Softwareeinschrnkungen nicht zugelassen. Der Windows Installer lsst nur
die Installation von Elementen zu, die ber keine Einschrnkungen verfgen. Die von der
Richtlinie fr Softwareeinschrnkungen zurckgelieferte Autorisierungsstufe war 0x0
(Statusrckgabewert 0x800b010c).
Wird ein Zertifikat verwendet, bei dem die Gltigkeitsdauer erloschen ist, sind keine diesbezglichen
Informationen im Protokoll zu finden. Der Patch wird fehlerfrei angewendet.
Beschreibung
DesktopFolder
ProgramMenuFolder
StartMenuFolder
StartUpFolder
TemplateFolder
AdminToolsFolder
AppDataFolder
CommonAppDataFolder
FavoritesFolder
PersonalFolder
SendToFolder
FontsFolder
ProgramFilesFolder
CommonFilesFolder
225
Kapitel 5
WindowsFolder
SystemFolder
LocalAppDataFolder
MyPicturesFolder
Computerinstallation bedeutet hingegen, dass diese fr alle Benutzer verfgbar ist. Die Installation und
Konfiguration wird wie folgt vorgenommen:
Dateiverknpfungen werden im Profil aller Benutzer angelegt.
COM-Komponenten werden immer unter HKEY_LOCAL_MACHINE\Software\Classes registriert.
Die Installation muss immer mit erhhten Rechten durchgefhrt werden.
Symbole und Transformationen werden unter %Windows%\Installer\{ProductCode} abgelegt.
Die nachfolgende Tabelle zeigt, auf welche Werte der Windows Installer die dargestellten
Eigenschaften setzt:
Eigenschaft
Beschreibung
DesktopFolder
ProgramMenuFolder
StartMenuFolder
StartUpFolder
TemplateFolder
AdminToolsFolder
AppDataFolder
CommonAppDataFolder
FavoritesFolder
PersonalFolder
SendToFolder
FontsFolder
ProgramFilesFolder
CommonFilesFolder
WindowsFolder
SystemFolder
LocalAppDataFolder
MyPicturesFolder
226
Bei der Verwendung von Windows XP und Windows Server 2003 spielt die Eigenschaft ALLUSERS
eine gravierende Rolle hinsichtlich der erforderlichen Berechtigungen, wie dieses auch in Tabelle 5.48
gezeigt wird. Hier wird die verwendete Installationsart in Abhngigkeit zu der Eigenschaft ALLUSERS
und den zugewiesenen Privilegien aufgefhrt.
Berechtigungen
ALLUSERS nicht
definiert (Standard)
ALLUSERS = 1
ALLUSERS = 2
Benutzerrechte
Benutzerinstallation.
Verwendet Ordner im
Profil des Anwenders.
Benutzerinstallation.
Verwendet Ordner im
Profil des Anwenders.
Administrative Rechte
Benutzerinstallation.
Verwendet Ordner im
Profil des Anwenders.
Computerinstallation.
Verwendet Ordner im
Profil aller Benutzer.
Computerinstallation.
Verwendet Ordner im
Profil aller Benutzer.
Tabelle 5.48: Auswirkungen der Eigenschaft ALLUSERS unter Windows XP und Windows Server 2003
Unter Windows Vista und Windows Server 2008 wurde die Bedeutung dieser Eigenschaft in der Form
gendert, dass sie nicht mehr fr die Festlegung der erforderlichen Privilegien verantwortlich ist. Die
bentigten Privilegien werden nun durch eine zustzliche Kennzeichnung des Installationspaketes
spezifiziert, wie dieses an spterer Stelle noch erlutert wird. Hierdurch ergeben sich natrlich
abweichende Verhaltensmuster wie dieses auch Tabelle 5.49 zeigt. Wesentlich gendert wurde das
Verhalten, wenn ALLUSERS auf 2 festgelegt wurde. Hierbei wird nun in allen Fllen eine
Maschineninstallation veranlasst; stehen jedoch keine ausreichenden Rechte zur Verfgung kommt es
zum Installationsfehler.
UAC-Konformitt
ALLUSERS nicht
definiert (Standard)
ALLUSERS = 1
ALLUSERS = 2
Standardbenutzer-Paket
Benutzerinstallation.
Verwendet Ordner im
Profil des Anwenders.
Kein StandardbenutzerPaket
Benutzerinstallation.
Verwendet Ordner im
Profil des Anwenders.
Computerinstallation.
Verwendet Ordner im
Profil aller Benutzer.
Computerinstallation.
Verwendet Ordner im
Profil aller Benutzer.
Tabelle 5.49: Auswirkungen der Eigenschaft ALLUSERS unter Windows Vista und Windows Server 2008
227
Kapitel 5
228
MSI (c) (9C:84) [12:54:24:701]: PROPERTY CHANGE: Adding Privileged property. Its value is '1'.
Aus dieser nderung des Algorithmus ergibt sich fr das oben skizzierte Beispiel nun ein genderter
Ablauf. Die UI-Sequenz wird immer durchlaufen; die relevante berprfung der Berechtigungen
erfolgt erst in der Ausfhrungssequenz, da hier reale Vergleichswerte vorliegen. Hieraus folgt, dass
nicht speziell auf die Benutzerkontensteuerung optimierte Installationspakete dennoch ausgefhrt
werden knnen. Abweichend ist der Zeitpunkt, an dem eine Installation auf Grund fehlender
Berechtigungen abgebrochen wird, da dieses nun erst nach der UI-Sequenz erfolgt.
Aus Grnden der Kompatibilitt wurde die neue Eigenschaft MSIUSEREALADMINDETECTION
eingefhrt. Wird diese Eigenschaft auf den Wert 1 gesetzt, wird der bisherige Algorithmus zur
Ermittlung der Eigenschaften AdminUser und Privileged verwendet.
Beim Erstellen von Installationspaketen fr Windows Vista und Windows Server 2008 sollten einige
Dinge hinsichtlich der Ausfhrungsbedingungen beachtet werden. Sollte es erforderlich sein, dass der
Client-Prozess bereits mit administrativen Privilegien ausgefhrt wird, sollten folgende Vorkehrungen
getroffen werden:
Die Verwendung erhhter Rechte ist durch die Eigenschaft Privileged in der Tabelle
LaunchCondition zu prfen.
Es ist ein Bootstrapper (setup.exe) zum Starten der Installation zu verwenden. Der Bootstrapper ist
mit einem Manifest zu versehen, mit dem die Ausfhrungsebene auf requireAdministrator
festgelegt wird.
Ist es hingegen ausreichend, dass erst whrend der Ausfhrungssequenz mit erhhten Privilegien
gearbeitet wird, so sind zunchst alle Referenzen auf die Eigenschaften AdminUser und Privileged zu
entfernen, die whrend der UI-Sequenz ausgewertet werden. Hierzu gehren auch entsprechende
Eintragungen in der Tabelle LaunchCondition. Die Prfung auf ausreichende Berechtigungen ist durch
eine Benutzerdefinierte Aktion vom Typ 19 zu veranlassen. Diese benutzerdefinierte Aktion ist aus
der Tabelle InstallExecuteSequence zu referenzieren, wenn die Installation nicht privilegiert ausgefhrt
wird, wie das auch in Listing 5.50 dargestellt wird.
<!--Fehlermeldung definieren-->
<CustomAction Id="CheckPrivilges" Error ="Zur Installation sind erhhte Privilegien erforderlich."/>
<!--Einordnen in die Tabelle der Ausfhrungssequenz-->
<InstallExecuteSequence>
<Custom Action="CheckPrivilges" Before ="LaunchConditions">NOT Privileged</Custom>
</InstallExecuteSequence>
Die Verwendung einer benutzerdefinierten Aktion fr diese Zwecke ist erforderlich, da eine Nutzung
der Tabelle LaunchCondition fr diese Zwecke nicht immer zu einem aussagekrftigen Ergebnis fhrt.
Wird in einem solchen Szenario die bereits bekannte Eigenschaft MSIUSEREALADMINDETECTION
genutzt, fhrt dieses unweigerlich zum Installationsabbruch. Solche Szenarien und potentielle
Problemquellen sind gerade bei Installationspaketen zu vermeiden, die spezielle fr diese Plattformen
angepasst wurden.
Hinweis Beginn
Die neue Eigenschaft MsiRunningElevated wird vom Windows Installer automatisch gesetzt, wenn die
Installation
privilegiert
durchgefhrt
wird.
Diese
Eigenschaft
wird
nicht
durch
MSIUSEREALADMINDETECTION beeinflusst.
Persnliche Ausfertigung fr Martin Martinsson
229
Kapitel 5
Hinweis Ende
Benutzerdefinierte Aktionen
Die Ausfhrung von benutzerdefinierten Aktionen zhlt unbestreitbar zu den komplexesten und
kritischsten Vorgngen im gesamten Installationsprozess. Dieses resultiert zum einen aus der
Forderung individuellen Programmcode in unterschiedlichen Formaten zu untersttzen und zum
anderen die Stabilitt des Installationsprozesses nicht zu beeintrchtigen. Zur Realisierung dieser
Anforderung wurden speziellen Objekte in den Windows Installer-Service integriert, die es
ermglichen, individuellen Programmcode in einer geschtzten Umgebung unter Verwendung
unterschiedlicher Sicherheitsmodelle isoliert auszufhren. Diese speziellen Objekte werden als Custom
Action-Server bezeichnet. Custom Action-Server knnen nach dem verwendeten Sicherheitsmodell
wie folgt kategorisiert werden:
230
Sollen durch eine benutzerdefinierte Aktion nun Modifikationen am System vorgenommen werden, die
administrative Privilegien erfordern, mssen die zwei folgenden Kriterien zutreffen:
Die Installation muss privilegiert ausgefhrt werden.
Die benutzerdefinierte Aktion muss den Elevated Custom Action-Server verwenden.
Zum ersten Kriterium ist an dieser Stelle keine weitere Erluterung erforderlich. Das zweite Kriterium
ist umso relevanter, zumal es eine potentielle Problemquelle fr den Installationsprozess darstellen
kann. Es ist erforderlich die benutzerdefinierte Aktion fr die privilegierte Ausfhrung zu
231
Kapitel 5
Es sollte erkennbar sein, dass die Verwendung des privilegierten Custom Action-Servers unter
Windows Vista und Windows Server 2008 in den meisten Fllen erforderlich ist, so dass die
ordnungsgeme Verwendung der Attribute sicherzustellen ist. Leider stellt das Windows InstallerSDK keine Prfroutinen zur Verfgung, mit denen entsprechende Validierungen durchgefhrt werden
knnen.An dieser Stelle hilft jedoch ein kleines Codefragment weiter, welches die Prfung des richtig
gewhlten Custom Action-Servers vornimmt. Die Ermittlung der kritischen Aktionen wird unter
Verwendung der Deployment Tools Foundation durchgefhrt wie Listing 5.52 zeigt. Hierbei sei
anzumerken, dass Funktionen aus dem Namensraums Microsoft.Deployment.WindowsInstaller.Linq
verwendet werden, wodurch das Microsoft .NET Framework 3.5 erforderlich ist.
private void CheckCustomAction(string fileName)
{
// Datenbank ffnen
using (QDatabase database = new QDatabase(fileName, DatabaseOpenMode.ReadOnly))
{
// Alle Datenstze durchlaufen
foreach (CustomAction_ ca in database.CustomActions)
{
// Prfen ob die CA innerhalb des Skriptes ausgefhrt wird
if ((ca.Type & CustomActionTypes.InScript) == CustomActionTypes.InScript)
{
// Prfen ob das NoImpersonate-Flag gesetzt wurde
if ((ca.Type & CustomActionTypes.NoImpersonate) != CustomActionTypes.NoImpersonate )
{
// Flag wurde nicht gesetzt. Daher kann es bei UAC zu Problemen fhren
Console.WriteLine(ca.Action + ": " + ca.Type.ToString());
}
}
}
}
}
232
Was auf den ersten Blick einfach aussieht und hinsichtlich der Migration einen nur geringen Aufwand
bedeutet, kann jedoch noch kritische Probleme nach sich ziehen. Grundstzlich sollte ja zunchst
davon ausgegangen werden, dass der Entwickler des Installationspaketes bestimmte
Grundberlegungen getroffen hatte, wenn er das Attribut msidbCustomActionTypeNoImpersonate
bisher nicht verwendet hat. In den wenigsten Fllen ist dieses auf fehlende Fachkenntnis oder einen
Fehler zurckzufhren. In den meisten Fllen wurde der personifizierte Custom Action-Server
verwendet, wenn mittels individueller Implementierung auf das Netzwerk zugegriffen werden musste.
In einem solchen Fall ist es natrlich nicht damit getan, das Attribut zu verndern, denn das fhrt mit
hoher Wahrscheinlichkeit zu einem Fehler, da dem lokalen Systemkonto diese Berechtigungen fehlen.
Hieraus folgt zwangslufig, dass tiefergehende nderungen im Design des Installationspaketes
vorzunehmen sind. Um hier einen entsprechenden Lsungsansatz implementieren zu knnen, ist
zunchst der Grund des Netzwerkzugriffs zu ermitteln. Falls der Netzwerkzugriff bentigt wird um auf
Dateien zuzugreifen, die fr die Installation bentigt werden, sollte an dieser Stelle geprft werden, ob
das einbetten der Dateien in den binren Datenspeicher des Installationspaketes an dieser Stelle
weiterhilft. Wird der Netzwerkzugriff hingegen bentigt um Informationen fr die Installation zu
ermitteln, sollte berlegt werden, ob diese Informationen nicht auch durch eine personifizierte Aktion
ermittelt werden knnen, die mit Standardbenutzerrechten ausgefhrt wird. Falls das mglich ist,
knnen die Informationen mit Hilfe der Eigenschaft CustomActionData an die privilegierte Aktion
bergeben werden.
Eine andere potentielle Problemquelle betrifft den Zugriff auf das Benutzerprofil. Hierunter ist
zunchst kein Berechtigungsproblem zu verstehen, denn solche Aktionen brauchen ja nicht privilegiert
ausgefhrt, da der Vollzugriff auf das Benutzerprofil gewhrleistet ist. Dieses Problem ist vielmehr in
der Verwendung eines privilegierten Bootstrappers zu sehen. Wird der Installationsprozess aus einem
privilegierten Prozess gestartet, steht das Profil des Benutzers, der die Installation startet nicht zur
Verfgung. Modifikationen werden zwangslufig im Profil des Benutzers vorgenommen, mit dessen
Privilegien die Installation ausgefhrt wird. Wird hingegen von einem privilegierten Custom ActionServer versucht, etwas in das Benutzerprofil zu schreiben, wird auch hier ein abweichendes, nmlich
das Systemprofil verwendet. Eine effektive und perspektivische Abhilfe ist nur durch ein Re-Design
des Installationspaketes mglich, wie dieses auch in entsprechenden Richtlinien vorgeschlagen wird.
Grundstzlich wird hier vorgeschlagen, alle benutzerspezifischen Konfigurationen beim ersten Starten
der Anwendung ausfhren zu lassen, so dass auf Informationen die das Benutzerprofil betreffen, im
Installationspaket verzichtet werden kann. Es mag sein, dass dieser Vorschlag widersprchlich zu den
Standardbenutzer-Paketen erscheint, das ist jedoch nicht beabsichtigt, denn bei diesen Paketen sind die
skizzierten Probleme nicht anzutreffen. Dieser Vorschlag und die Problemflle beziehen sich
ausnahmslos auf Installationspakete die vollstndige Privilegien bentigen.
233
Kapitel 5
Die Kennzeichnung wird hierzu in der Tabelle Control vorgenommen. Einem Steuerelement vom Typ
PushButton ist das neue Attribut msidbControlAttributesElevationShield (8388608) zuzuordnen. Das
Sicherheitsschildsymbol wird angezeigt wenn das Attribut gesetzt wurde und die Installation mit den
Rechten des Standardbenutzers ausgefhrt wird. Es wird nicht angezeigt, wenn die Installation bereits
mit erhhten Rechten ausgefhrt wird, wie das bei der Verwendung einer setup.exe der Fall wre. Die
Verwendung des Installationspaketes unter einer lteren Version des Windows Installers ist problemlos
mglich; ltere Installer-Versionen ignorieren das Attribut.
Bei der Verwendung von Windows Installer-XML ist das Attribut ElevationShield fr diesen
Steuerelementtyp zu verwenden.
<Control Id="NextButton" Type="PushButton" X="230" Y="243" Width="66" Height="17"
Default="yes" Text="Installieren" ElevationShield="yes">
<Publish Event="EndDialog" Value="Return"><![CDATA[OutOfDiskSpace <> 1]]></Publish>
</Control>
Werden hingegen die in Windows Installer-XML enthaltenen Standarddialoge verwendet, sind keine
spezifischen Vorkehrungen zu treffen. Die Verwendung des Symbols ist jedoch hierbei mit der
Eigenschaft ALLUSERS verknpft, so dass diese ebenfalls zu setzen ist.
Der zweite Fall betrifft die Dateiverknpfungen, oder besser gesagt die Symbole dieser
Verknpfungen. Gem den Richtlinien fr Windows Vista und Windows Server 2008 sind auch
Dateiverknpfungen mit dem Sicherheitsschildsymbol zu kennzeichnen, wenn die zu startende
Anwendung administrative Privilegien bentigt. Normalerweise wird dieses automatisch vom
Betriebssystem oder detaillierter betrachtet durch die Windows-Shell umgesetzt. Die Windows-Shell
prft ob die referenzierte Anwendung fr die Verwendung administrativer Privilegien gekennzeichnet
wurde. Ist dieses der Fall und wird die Windows-Shell mit eingeschrnkten Privilegien ausgefhrt,
wird die Dateiverknpfung mit dem Sicherheitsschildsymbol gekennzeichnet. Dieses Verhalten ist
ganz einfach zu testen. Stellen Sie sicher, dass auf dem Desktop einige Dateiverknpfungen vorhanden
234
sind, die vom Betriebssystem automatisch mit dem Sicherheitsschildsymbol gekennzeichnet sind.
Schlieen Sie zunchst alle geffneten Instanzen des Windows-Explorers und starten Sie dann den
Windows-Explorer mit vollstndigen Privilegien, beispielsweise ber das Kontextmen Als
Administrator ausfhren. Navigieren Sie nun in diesem Explorer-Fenster zum Desktop. Sie werden
feststellen, dass die betreffenden Symbole keine Kennzeichnung mehr aufweisen. Das Starten dieser
Anwendungen funktioniert dann auch ohne erneute Darstellung des Besttigungsdialogs.
Diese Funktionalitt ist jedoch nur fr Standard-Dateiverknpfungen vorhanden, also bei
Verknpfungen die eine Datei direkt referenzieren. Windows Installer untersttzt jedoch auch die
sogenannten Angekndigten Verknpfungen (Advertised Shortcuts) und die sorgen in diesem Kontext
fr Probleme. Zur Identifizierung der Dateiverknpfung gengt ein Blick in den Eigenschaftendialog.
Bei einer Standardverknpfung befindet sich im Feld Ziel ein Verweis auf das jeweilige
Verknpfungsziel. Bei einem Advertised Shortcut ist das Feld Ziel deaktiviert und es findet sich dort
lediglich eine Bezeichnung fr die zu startende Anwendung. Der einfachste Lsungsansatz lge nun im
vollstndigen Verzicht auf angekndigte Verknpfungen, wie das unter Zuhilfenahme der Eigenschaft
DISABLEADVTSHORTCUTS mglich ist. Aber diese Vorgehensweise sollte natrlich nicht der
Normalfall sein, denn durch den Verzicht auf diese Verknpfungsarten werden einige
Grundfunktionalitten des Windows Installers auer Kraft gesetzt. Besser wre es an dieser Stelle
qualifiziertere Mittel zu verwenden um somit alle denkbaren Szenarien abzudecken.
Mit einem Advertised Shortcut wird keine Datei oder ein anderes Ziel direkt referenziert; eine solche
Verknpfung referenziert immer eine Windows Installer-Komponente oder detaillierter ausgedrckt
die Schlsselressource (KeyPath) einer solchen Komponente. Somit kann eine solche Verknpfung
auch gut mit dem Begriff der logischen Verknpfung umschrieben werden. Die Definition der
Dateiverknpfung wird in der Tabelle Shortcut vorgenommen. Im einfachen Fall, also fr eine
Standard-Dateiverknpfung wird die zu referenzierende Datei in dem Feld Target angegeben. Bei der
Gestaltung einer angekndigten Verknpfung ist diesem Feld die Referenz auf das Feature
hinzuzufgen, das hiermit verknpft wird. Da ein Feature die kleinste installierbare Einheit aus Sicht
des Anwenders darstellt, wird eine solche Dateiverknpfung auf dem Zielsystem angelegt, wenn das
entsprechende Feature zur Installation ausgewhlt wurde. Hierbei ist es unerheblich ob das Feature fr
die physische Installation, fr die Ausfhrung vom Quellmedium oder fr die Installation bei der
ersten Verwendung markiert wurde. Ein Advertised Shortcut wird auch erstellt, wenn die indirekt
referenzierte Datei nicht physisch dem System hinzugefgt wurde. Hier ist es ausreichend dass das
zugehrende Feature fr eine Installationsart bestimmt wurde.
Bei der Aktivierung einer Dateiverknpfung wird seitens der Windows-Shell geprft, ob es sich um
eine physische Dateiverknpfung handelt, also einfach ausgedrckt, ob die referenzierte Datei existiert
und gestartet werden kann. Ist dieses nicht der Fall, findet eine Interaktion mit dem Windows InstallerService statt. Hierbei wird dem Windows Installer-Service der Pfad zu der Verknpfung bergeben, so
dass geprft werden kann, ob es sich um einen gltigen Advertised Shortcut handelt. Falls dieses
zutreffend ist, werden Informationen zum Produkt, zum Feature und letztlich zur Komponente
ermittelt. Anschlieend wird seitens des Windows Installers geprft, ob diese Komponente bereits
vorhanden ist und ob die Schlsselressourcen aller Komponenten des referenzierten Features ebenfalls
vorhanden sind. Ist dieses nicht der Fall, findet eine Reparatur auf Ebene des Features statt.
Anschlieend wird der absolute Pfad zu der Schlsselressource der referenzierten Komponente
ermittelt und wieder an die Windows-Shell zurck gegeben. Die entsprechende Datei wird nun
gestartet. Das nachfolgende Listing 5.53 zeigt die erforderlichen programmtechnischen
Implementierungen auf Basis der Deployment Tools Foundation.
private void GetShortCutInfo(string shortcutFileName)
235
Kapitel 5
{
// Ermitteln der relevanten Informationen des Shortcuts
ShortcutTarget target = Installer.GetShortcutTarget(shortcutFileName);
// Pfad zu der Schlsselressource der Komponente bestimmen,
// hierbei eine Reparatur des Features ausfhren (falls erforderlich)
string componentPath = Installer.ProvideComponent(target.ProductCode,
target.Feature, target.ComponentCode, InstallMode.Default);
// Datei starten (normalerweise durch die Windows-Shell)
Process.Start(componentPath);
}
Listing 5.53: Ermitteln der Eigenschaften und Verwenden einer angekndigten Dateiverknpfung
Die indirekte Referenzierung einer Datei durch einen Advertised Shortcut hat natrlich auch Einfluss
auf das zu verwendende Symbol. Bei einer regulren Verknpfung wird eine Datei referenziert die
Ressourcen in Form von Symbolen enthlt und von denen ein Symbol zur Darstellung ausgewhlt
wurde. Beim Advertised Shortcut ist das nicht mglich, denn eine solche Verknpfung kann bereits auf
dem System vorhanden sein, ohne dass die zu startende Datei physisch existiert. Dennoch wird in
einem solchen Fall bereits das regulre Symbol fr die Verknpfung angezeigt. Dieses wird mglich,
da sich smtliche Symbole in einer separaten Symboldatei befinden, die sich im binren Datenspeicher
des Installations-Paketes befindet. Bei der Installation oder bei der Ankndigung werden diese
Symboldateien im produktspezifischen Windows Installer-Repository abgelegt und von den
Verknpfungen verwendet.
Die Problematik mit dem Sicherheitsschildsymbol sollte nun deutlich werden. Die Windows-Shell
kann keinen direkten Bezug zur referenzierten Datei herstellen, wodurch die konfigurierte
Ausfhrungsebene ebenfalls nicht festgestellt werden kann. Somit kann das Sicherheitsschildsymbol
nicht angezeigt werden. Um die Anzeige des Schilds dennoch zu ermglichen ist es erforderlich, ein
Manifest in die separate Symboldatei zu integrieren, mit dem die Ausfhrungsebene entsprechend
festgelegt wird. Enthlt ein Produkt mehrere Anwendungen, die unterschiedliche Ausfhrungsebenen
bentigen, sind ebenfalls unterschiedliche Symboldateien zu verwenden.
Im ersten Schritt wird ein Manifest bentigt, in dem die entsprechende Ausfhrungsebene, in der Regel
requireAdministrator festgelegt wird.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity version="1.0.0.0"
processorArchitecture="X86"
name="AdminIcon"
type="win32"/>
<!-- Identify the application security requirements. -->
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel
level="requireAdministrator" uiAccess="false"/>
</requestedPrivileges>
</security>
</trustInfo>
</assembly>
236
Als nchstes wird die Ressource Skriptdatei (.rc) bentigt, in der die zu verwendenden Symbole
referenziert werden.
// base resource script.
//
#include "afxres.h"
#define IDI_ICON1
#define MANIFEST_RESOURCE_ID
101
1
/////////////////////////////////////////////////////////////////////////////
//
// Icon
//
// Icon with lowest ID value placed first to ensure application icon
// remains consistent on all systems.
IDI_ICON1
ICON
"icon.ico"
/////////////////////////////////////////////////////////////////////////////
//
// RT_MANIFEST
//
MANIFEST_RESOURCE_ID
RT_MANIFEST
"admin.manifest"
/////////////////////////////////////////////////////////////////////////////
Hierbei ist icon.ico die Bezeichnung der Symboldatei, die in die Ressource integriert werden soll und
admin.manifest die Manifest-Datei. Diese Ressource-Skriptdatei muss im nchsten Schritt kompiliert
werden, wozu der Windows Resource Compiler zu verwenden ist.
rc adminicon.rc
Das Ergebnis dieser Aktion ist die Datei adminicon.res, aus der zum Schluss eine RessourcenBibliothek zu erstellen ist. Windows Installer erwartet, dass diese Bibliotheken die identische
Dateiendung aufweisen, wie die Dateien, die diese verwenden. Zur Erzeugung der Bibliothek wird der
Microsoft Incremental Linker verwendet.
link adminicon.res /noentry /machine:x86 /dll /out:adminicon.exe
Das Ergebnis ist die Ressourcen-Bibliothek icon.exe, die nun in einem Windows Installer-Paket
verwendet werden kann. Im bereits bekannten Listing 5.49 wird dieses unter Verwendung von
Windows Installer-XML demonstriert.
237
Kapitel 5
Die relevanten Informationen befinden sich hierbei hinter dem Parameter ActionType. Der Wert
1025 bedeutet zunchst dass die benutzerdefinierte Aktion in Form einer Objektbibliothek
verwendet wird, die sich als binre Quelle im Installationspaket befindet (msidbCustomActionTypeDll
+ msidbCustomActionTypeBinaryData). Weiterhin besagt dieser Wert dass die benutzerdefinierte
Aktion
whrend
der
Ausfhrung
des
Installationsskriptes
mit
ausgefhrt
wird
(msidbCustomActionTypeInScript). Das Attribut msidbCustomActionTypeNoImpersonate wurde somit
nicht gesetzt, wodurch dieses durchaus die Problemquelle sein knnte. Der verwendete Aktionstyp war
in diesem Beispiel sehr einfach, doch Werte wie 11649 sind da schon schwieriger zu entschlsseln.
Mit Hilfe der Deployment Tools Foundation lsst sich dieses jedoch durch ein sehr kurzes
Codefragment realisieren.
// Aktionstyp bestimmen
CustomActionTypes actionType = (CustomActionTypes)11649;
238
Console.WriteLine(actionType.ToString());
// Ausgabe: Dll, Async, FirstSequence, InScript, NoImpersonate, HideTarget
Es ist somit erkennbar, dass die Probleme vielfach in Verbindung mit der Benutzerkontensteuerung
stehen, so dass es hilfreich ist die spezifischen Eintragungen zu kennen und zu analysieren. Wie spter
noch erlutert wird, ist der Windows Installer 4.5 auch fr die Betriebssysteme Windows XP und
Windows Server 2003 verfgbar. Diese Betriebssysteme verfgen jedoch ber keine
Benutzerkontensteuerung, so dass die folgende Eintragung hierbei im Installationsprotokoll zu finden
ist:
MSI (s) (28:B8) [11:27:55:099]: MSI_LUA: Credential prompt functionality not
available on this operating system
Falls jedoch ein Betriebssystem verwendet wird, dass die Benutzerkontensteuerung untersttzt, wird
die nachfolgende Meldung ausgegeben, falls die Installation bereits privilegiert ausgefhrt wird:
MSI (s) (FC:88) [10:35:49:453]: MSI_LUA: Credential prompt not required, user is an admin
Falls das Produkt zur Verwendung mit erhhten Privilegien bereits angekndigt wurde, oder fr eine
verwaltete Anwendung der Wartungsmodus gestartet wird, erscheint ebenfalls kein UACBesttigungsdialog:
MSI (s) (38:20) [12:31:36:766]: MSI_LUA: Credential prompt is not required at this point, product is managed
Auch bei der Verwendung von Standardbenutzer-Paketen ist die Anzeige des Dialogs nicht
erforderlich, da die Privilegien des Benutzers ausreichend sind. Hierauf weist der folgende Eintrag hin:
MSI (s) (38:EC) [12:25:03:339]: MSI_LUA: Package is marked as LUA installation
capable with no elevation required
Im einem weiteren Fall wird der Dialog ebenfalls nicht angezeigt, nmlich falls die Systemrichtlinie
AlwaysInstallElevated sowohl fr die Computer- als auch die Benutzerkonfiguration festgelegt wurde:
MSI (s) (38:A0) [12:37:25:862]: MSI_LUA: No credentials required as all installs will
run elevated due to AlwaysInstallElevated policy setting
Selbstverstndlich wird der UAC-Besttigungsdialog auch nicht angezeigt, wenn die Installation im
unbeaufsichtigten Modus (silent Installation) ausgefhrt wird.
MSI (s) (38:60) [12:19:16:145]: MSI_LUA: Installation UI level is silent, no credential elevation is possible
Die bisherigen Grnde, die zur Nicht-Anzeige des Dialogs fhrten, ermglichten dennoch eine
privilegierte Installation. Im Gegensatz dazu kann eine unbeaufsichtigte Installation auf einen Fehler
laufen, wenn die erforderlichen Rechte nicht vorhanden sind. Hierbei ist sicherzustellen, dass die
erforderlichen Privilegien bereits vor dem Aufruf der Installation vorhanden sind, oder dass die
Ausfhrung mit den Privilegien des Standardbenutzers ausreichend ist. Ansonsten wird kein Dialog
angezeigt und es wird somit keine Mglichkeit gegeben, die Verwendung erhhter Privilegien zu
besttigen. Abweichungen in diesem Standardverhalten knnen sich natrlich ergeben, wenn die
Sicherheitsrichtlinien fr die Benutzerkontensteuerung modifiziert werden, so dass automatisch mit
erhhten Privilegien installiert wird, was durch die Richtlinie Benutzerkontensteuerung: Verhalten
der
Benutzeraufforderung
mit
erhhten
Rechten
fr
Administratoren
im
Administratorbesttigungsmodus mglich wre.
Persnliche Ausfertigung fr Martin Martinsson
239
Kapitel 5
Sollten alle diese Eventualitten nicht gegeben sein und wird die Installation gestartet, wird der
Besttigungsdialag angezeigt, falls das Installationspaket erhhte Privilegien erfordert.
MSI (s) (38:54) [16:18:54:217]: MSI_LUA: Elevation required to install product, will prompt for credentials
Die darauf folgenden Zeilen im Installationsprotokoll enthalten das Ergebnis der Aktion und geben
Auskunft ber die Privilegien, die anschlieend verwendet werden.
MSI (s) (30:B4) [12:54:29:842]: MSI_LUA: Credential Request return = 0x0
MSI (s) (30:B4) [12:54:29:842]: MSI_LUA: Elevated credential consent provided. Install will run elevated
Falls die Aktion nicht fehlerfrei ausgefhrt wird, enthlt der Rckgabewert die entsprechende
Fehlernummer. In dem folgenden Beispiel ist es 0x800704C7, da die Aktion vom Benutzer
abgebrochen wurde.
MSI (s) (38:D8) [16:33:30:861]: MSI_LUA: Credential Request return = 0x800704C7
Falls der Application Information Service oder andere Bestandteile der UAC-Infrastruktur einen Fehler
verursachen, findet sich der folgenden Eintrag:
MSI (s) (38:D8) [16:33:30:861]: MSI_LUA: Failed to obtain credentials. Error = 0x??????
Vielfach stellt sich die Frage, ob das zu installierende Paket auch die Verwendung von LUA-Patches
untersttzt. Wie bereits angedeutet, finden sich entsprechende Informationen in der
Operationsanweisung ProductInfo. Der relevante Parameter hierbei ist LUASetting. Ist dieser
Parameter auf den Wert 1 gesetzt, handelt es sich um eine autorisierte Anwendung, die LUAPatches untersttzt.
MSI (s) (38:D0) [16:31:52:124]: Executing op: ProductInfo(
ProductKey={5FC3B67B-D782-491C-AFE8-08A5F19647ED},
ProductName=Vista UAC Admin,PackageName=UACAdmin.msi,Language=1031,Version=16777216,
Assignment=1,ObsoleteArg=0,ProductIcon=NonAdminIcon.exe,0,,
PackageCode={7CEF4C66-D23D-40EA-8822-78A664E3EFAE},,,InstanceType=0,LUASetting=1,
RemoteURTInstalls=0,ProductDeploymentFlags=2)
Ist diesem Parameter hingegen der Wert 0 zugewiesen, wird LUA-Patching fr diese Anwendung
nicht untersttzt. Das Installationsprotokoll enthlt in diesem Fall zustzliche Informationen ber die
entsprechende Begrndung. Mgliche Eintragungen wren:
MSI (s) (38:AC) [16:44:28:270]: LUA patching is disabled: missing MsiPatchCertificate table
oder
MSI (s) (AC:00) [16:16:43:148]: LUA patching is disabled: not available on server SKUs
oder
MSI (s) (38:30) [16:53:19:288]: LUA patching is disabled: LUA patching is completely disabled
on the machine (by machine policy)
oder
MSI (s) (38:0C) [16:54:50:776]: LUA patching is disabled: DISABLELUAPATCHING property was set
240
oder
MSI (s) (38:9C) [16:55:42:973]: LUA patching is disabled: not run for non-admins
oder
MSI (s) (38:1C) [16:57:34:626]: LUA patching is disabled: not available for per-user installs
Hilfreich sind auch noch die Eintragungen, die auf die privilegierte Ausfhrung der Installation
hinweisen.
MSI (s) (38:1C) [16:57:34:595]: MSI_LUA: Setting MsiRunningElevated property to 1 because the
install is already running elevated.
Eine potentielle Fehlerquelle ist und bleibt die Verwendung der Eigenschaft AdminUser. Im
Normalfall findet sich die folgende Eintragung:
MSI (c) (D8:DC) [16:54:47:527]: MSI_LUA: Setting AdminUser property to 1 because this is the
client or the user has already permitted elevation
Falls jedoch der ursprngliche Algorithmus zum ermitteln dieser Eigenschaft verwendet wurde, ist die
Eigenschaft MSIREALADMINDETECTION, in der Eigenschaftenauflistung am Ende des Protokolls zu
finden.
Es wird deutlich, dass eine Vielzahl von Informationen im Installationsprotokoll auf die Verwendung
der Benutzerkontensteuerung hinweisen. Wichtig ist hierbei die Kennzeichnung der Eintragungen,
denn alle verfgen ber den Prfix MSI_LUA, so dass die Identifikation entsprechend ausgerichteter
Fehlerbilder, durch eine Suche nach der Zeichenfolge vereinfacht wird.
Fazit
Die Benutzerkontensteuerung ist eine der wichtigsten Pfeiler im Sicherheitskonzept von Windows
Vista und Windows Server 2008. Die Relevanz liegt darin begrndet, dass alle normalen Aktivitten
mit den Privilegien eines Standardbenutzers ausgefhrt werden. Das Sicherheitsschildsymbol wird zur
Kennzeichnung von Operationen verwendet, die hhere Privilegien erfordern, als die eines
Standardbenutzers. Fhrt der Benutzer eine solche Aktion aus, wird ein Dialog angezeigt, in dem der
Benutzer die Verwendung erhhter explizit Privilegien besttigen muss. Im Folgenden wird ein neuer
Prozess gestartet, der ber die vollstndigen Privilegien des entsprechenden Tokens verfgt und somit
nahezu alle Aktivitten vornehmen kann. Die meisten Installationen fhren systemweite
Modifikationen durch, so dass fast immer administrative Privilegien bentigt werden. Aus diesem
Grund ist festzustellen, dass der Einfluss der Benutzerkontensteuerung auf den Installationsprozess
recht gro ist. Umso wichtiger ist es bereits frhzeitig darauf zu reagieren, indem bei der Erstellung
von Installationspaketen die folgenden Vorgaben beachtet werden:
Falls in der Tabelle InstallUISequence die Aktionsausfhrung vom Installationskontext abhngig
gemacht werden muss, ist hierzu eine Bedingung zu verwenden, die auf der Eigenschaft Privileged
basiert. Verwenden Sie keine Bedingung die auf der Eigenschaft AdminUser basiert.
Falls in der Tabelle InstallExecuteSequence die Installationsausfhrung vom Installationskontext
abhngig gemacht werden muss, verwenden Sie eine Benutzerdefinierte Aktion vom Typ 19,
deren Ausfhrung mit einer Bedingung versehen ist, die auf der Eigenschaft Privileged basiert.
Persnliche Ausfertigung fr Martin Martinsson
241
Kapitel 5
242
Computerneustarts im
Installationsprozess
243
245
260
272
291
243
Kapitel 6
Computerneustarts im Installationsprozess
Wie bereits im oberen Beispiel angesprochen liegt ein wesentlicher Grund fr einen Computerneustart
in einem Kommunikationsproblem. Hiermit ist gemeint, dass dem Benutzer suggeriert wird, dass er
den Computer nach der Installation neu starten muss, obwohl vielfach keine technischen Grnde
vorliegen. Diese Aufforderung kann hierbei auf klassische Weise ber die Dokumentation oder
technisch ber einen Dialog im Installationsprogramm erfolgen. Eine solche Vorgehensweise ist hufig
historisch begrndet, da frher auf einen Computerneustart nach der Installation nicht verzichtet
werden konnte. Von dieser Vorgehensweise sollte unbedingt Abstand genommen werden, denn die
heutigen technischen Mglichkeiten zur Erkennung eines Neustarts sind mit denen frherer Systeme
nicht mehr vergleichbar.
Ein anderer Problembereich ist im Konfigurationssektor zu finden. Hierunter sind Szenarien zu
verstehen, in denen das Installationsprogramm selbst konfiguriert oder aktualisiert wird, wie auch der
Windows Installer. Dieser wurde bis zur Version 2.0 als Windows Installer-Paket ausgeliefert,
wodurch er sich nicht selbst aktualisieren konnte. Es gab zwar die Option des verzgerten Neustarts,
aber sptestens nach Abschluss der Installation musste ein Computerneustart erfolgen. Solche
Szenarien sind mitunter noch zu beobachten; eine effektive Abhilfe gibt es aus technischen Grnden
jedoch nicht.
Eine ganz andere Ursache ist bei den Prozessablufen zu finden. Hiermit sind Problemquellen gemeint,
die durch Umgestaltung der Installation oder Bercksichtigung von Richtlinien beseitigt werden
knnen. Unter diesem Gesichtspunkt wurde beispielsweise die Aktualisierung der Windows-Plattform
optimiert. Es enthlt nun jeder Patch eine Kennung, ob er als kritisch eingestuft wurde oder nicht. Falls
es sich um einen unkritischen Patch handelt, wird er zwar installiert, aber auf einen eventuell
notwendigen Computerneustart wird zu diesem Zeitpunkt verzichtet. Dieser wird durch den Benutzer
beim nchsten Starten des Computers unbewusst selbst veranlasst. Weiterhin sind in dieser Kategorie
244
Lsungsanstze zu finden, die sich an Richtlinien orientieren. So wird in vielen Richtlinien von der
Selbstregistrierung von COM-Komponenten abgeraten. Die Selbstregistrierung des Windows Installers
kann mit einem Aufruf von regsvr32.exe verglichen werden. Es wird die interne Funktion
DLLRegisterServer() der jeweiligen COM-Komponente aufgerufen. Fr einen ordnungsgemen
Aufruf der Funktion ist es jedoch erforderlich, dass sich die Komponente im jeweiligen
Installationsverzeichnis auf dem Zielsystem befindet. Ist eine vorherige Version der Komponente in
Verwendung muss das System im Rahmen der Installation zunchst neu gestartet werden, bevor die
eigentliche Registrierung erfolgen kann.
Wichtig Beginn
Soll die Anwendung fr Windows Vista zertifiziert werden, ist ein Neustart whrend der Installation
zu vermeiden. Im Weiteren fordern diese Richtlinien den Verzicht der Selbstregistrierung im
Installationsprozess. Entsprechende Vorgaben sind in den Best Practices des Windows Installer-Teams
zu finden.
Wichtig Ende
Der letzte Grund fr einen Computerneustart kommt in der Praxis sehr hufig vor. Hierbei kann eine
Datei nicht ersetzt oder gelscht werden, da sie derzeitig verwendet wird. Dieses relativ einfach
aussehende Szenario bildet jedoch die Grundlage fr den Rest des Kapitels. Aus diesem Grund folgt
zunchst eine Betrachtung der Ablufe des Installationsprozesses, die zur Ermittlung der verwendeten
Dateien und der darauf basierenden Vorgehensweise des Windows Installer relevant sind.
Neustarts im Installationsprozess
Der Windows Installer enthlt seit jeher viele Funktionalitten, mit denen der Neustart des Computers
und alle damit verbundenen Darstellungsformen beeinflusst werden knnen. So kann festgelegt
werden, ob dem Benutzer ein Dialog angezeigt wird, in dem er den Neustart explizit besttigen muss
oder ob der Neustart automatisch ausgefhrt wird. Im Weiteren stehen natrlichen Mechanismen zur
Verfgung um einen Neustart direkt oder indirekt zu veranlassen:
Durch die Aktionen ForceReboot und ScheduleReboot und auch durch die Eigenschaft REBOOT
wenn diese auf Force gesetzt wird.
Indem das Reboot-Flag (iefReboot) durch die Funktion MsiSetMode() in einer benutzerdefinierten
Aktion
auf
die
mglichen
Werte
MSIRUNMODE_REBOOTATEND
oder
MSIRUNMODE_REBOOTNOW gesetzt wird.
Falls bei der Installation Dateien berschrieben werden mssen, die derzeitig verwendet werden.
Hierbei wird die Eigenschaft ReplacedInUseFiles gesetzt, so dass hierdurch ein solcher Fall
jederzeit identifiziert werden kann.
In allen dieser Szenarien wird die Durchfhrung eines Computerneustarts veranlasst, wobei eine groe
Relevanz auf der im letzten Fall skizzierten Vorgehensweise liegt. Zunchst mchte ich jedoch auf die
Kontrollfunktionen eingehen, die der Windows Installer hierfr bereit stellt.
245
Kapitel 6
Computerneustarts im Installationsprozess
Erluterung
Force
Veranlasst einen Neustart nach dem Abschluss der Installation. In der Benutzeroberflche
wird ein Dialog mit der Aufforderung angezeigt, den Computer neu zu starten. Wird die
Installation ohne Anzeige einer Benutzeroberflche durchgefhrt, wird das System
automatisch nach Abschluss der Installation neu gestartet.
Suppress
Die Aufforderung zum Neustart nach Beendigung der Installation wird unterdrckt. Der
Installer fordert hingegen den Anwender auf, einen Neustart whrend der Installation
durchzufhren, wenn die Aktion ForceReboot whrend des Setups aufgerufen wird. Wird
die Installation ohne Anzeige einer Benutzeroberflche durchgefhrt, wird bei jeder
ForceReboot-Aktion ein Neustart ausgefhrt. Vom Windows Installer veranlasste Neustarts
(z.B. durch verwendete Dateien) am Ende der Installation werden unterdrckt.
ReallySuppress
Unterdrckt alle Aufforderungen zum Neustart, die durch die Aktion ForceReboot whrend
der Installation ausgelst werden. Ein erforderlicher Neustart am Ende der Installation wird
ebenfalls unterdrckt.
Der Eigenschaft REBOOT ist der jeweilige Wert zuzuweisen, wobei nur der erste Buchstabe
bercksichtigt wird. Somit ist die Zuweisung REBOOT=S vollkommen ausreichend. Wird die
Installation unter Verwendung einer Benutzeroberflche durchgefhrt, erscheint ein Dialog in dem der
Benutzer einen eventuellen Neustart besttigen muss. In vielen Fllen ist es notwendig einen
Computerneustart automatisch auszufhren, ohne dem Anwender eine diesbezgliche
Auswahlmglichkeit zu bieten. Setzen Sie hierzu die Eigenschaft REBOOTPROMPT auf den Wert
Suppress (oder S), um einen notwendigen Neustart durchzufhren, ohne dem Anwender eine
Mglichkeit zur Vermeidung des Neustarts zu geben. Die Mglichkeiten zur Steuerung eines
Computerneustarts sind von der Version des Windows Installers abhngig, wie dieses auch Tabelle
6.51 zeigt. So enthalten die Betriebssysteme Windows Vista und Windows Server 2008 eine
Funktionalitt, die als Neustart-Manager (Restart-Manager) bezeichnet wird und die ab der Version 4.0
des Installers auch untersttzt wird, aber dazu spter mehr.
Aktion, Dialog oder Eigenschaft
Beschreibung
Aktion: ForceReboot
246
fortzusetzen.
Aktion: ScheduleReboot
Eigenschaft: REBOOT
Eigenschaft: REBOOTPROMPT
Eigenschaft: AFTERREBOOT
Aktion: InstallValidate
Dialog: FilesInUse
Dialog: MsiRMFilesInUse
Eigenschaft: ReplacedInUseFiles
Eigenschaft:
MSIRESTARTMANAGERCONTROL
Eigenschaft:
MSIDISABLERMRESTART und
MSIRMSHUTDOWN
Eigenschaft: MsiSystemRebootPending
Diese Eigenschaft wird vom Installer auf den Wert 1 gesetzt, falls
ein Computerneustart noch aussteht. Verfgbar mit Windows
Installer 4.0 und hher unter Windows Vista und Windows Server
2008.
Richtlinie:
DisableAutomaticApplicationShutdown
247
Kapitel 6
Computerneustarts im Installationsprozess
MSI (s) (E0:68) [14:32:57:516]: Windows Installer requires a system restart. Product Name: Installer-Demo.
Product Version: 1.00.0000. Product Language: 1033. Type of System Restart: 1. Reason for Restart: 1.
Wurde hingegen ein notwendiger Computerneustart unterdrckt, wird dieses durch den Rckgabewert
3010 verdeutlicht, wobei dieser Wert fr ERROR_SUCCESS_REBOOT_REQUIRED steht. Zustzlich
finden sich ebenfalls Hinweise im Klartext.
MSI (s) (FC:C0) [09:36:16:162]: Product: Installer-Demo -- Installation completed successfully.
MSI (s) (FC:C0) [09:36:16:162]: Windows Installer installed the product. Product Name: Installer-Demo.
Product Version: 1.00.0000. Product Language: 1033. Installation success or error status: 0.
MSI (s) (FC:C0) [09:36:16:163]: Windows Installer requires a system restart. Product Name: Installer-Demo.
Product Version: 1.00.0000. Product Language: 1033. Type of System Restart: 2. Reason for Restart: 1.
MSI (s) (FC:C0) [09:36:16:163]: Product: Installer-Demo. Restart required. The installation or update for
the product required a restart for all changes to take effect. The restart was deferred to a later time.
Wird eine Installation unter Verwendung der Funktion MsiInstallProduct() des Windows Installer-API
oder durch direkten Aufruf der msiexec.exe ausgefhrt, knnen die gerade dargestellten
Rckgabewerte im weiteren Programmablauf verwendet werden. Listing 6.54 zeigt eine Batch-Datei,
die entsprechende Implementierungen enthlt. Die Rckgabewerte werden hierbei ber den
ERRORLEVEL abgefragt, wodurch die eigentmliche Darstellung der Sprunganweisungen begrndet
ist. Das hat damit zu tun, dass eine IF-Abfrage fr einen ERRORLEVEL immer auf grere und gleiche
Werte abprft. Der Befehl If ERRORLEVEL 1615 wird somit als If ERRORLEVEL >= 1615
interpretiert.
@ECHO OFF
REM Starten der Installation
start /wait msiexec.exe /i setup.msi /qb /l*v setup.log
248
If
If
If
If
If
ERRORLEVEL
ERRORLEVEL
ERRORLEVEL
ERRORLEVEL
ERRORLEVEL
:REQUIRED
ECHO Neustart ist erforderlich
GoTo END
:INITIATED
ECHO Neustart wurde veranlasst
GoTO END
:SUCCESS
ECHO Installation erfolgreich. Neustart ist nicht erforderlich
GoTo END
:ERROR
ECHO Installation mit Rckgabewert %ERRORLEVEL% beendet
:END
Listing 6.54: Batch-Datei zum Starten der Installation und Auswerten der Rckgabewerte
Auf programmtechnischen Wege unter Verwendung der Deployment Tools Foundation steht fr diese
Zwecke die Funktion InstallProduct() des Objektes Installer zur Verfgung. Dieses Objekt enthlt
weiterhin die Eigenschaften RebootRequired und RebootInitiated, die Auskunft ber das
Neustartverhalten geben, wie auch in Listing 6.55 verdeutlicht wird.
Try
{
// Installation ohne Benutzeroberflche ausfhren
Installer.SetInternalUI(InstallUIOptions.Silent);
Installer.InstallProduct(fileName, string.Empty);
// Prfen ob ein Reboot erforderlich ist
if (Installer.RebootRequired)
EventLog.WriteEntry(Application.ProductName, "RebootRequired");
// Prfen ob ein Reboot veranlasst wurde
if (Installer.RebootInitiated)
EventLog.WriteEntry(Application.ProductName, "RebootInitiated");
}
catch (Exception ex)
{
// Fehler ins Ereignisprotokoll schreiben
EventLog.WriteEntry(Application.ProductName, ex.Message);
}
Listing 6.55: Starten einer Installation und Reaktionen auf das Neustartverhalten
Es ist erkennbar, dass viele Mglichkeiten bestehen, Auskunft ber das Neustartverhalten im Rahmen
der Installation zu erhalten. Nachteilig ist bei den vorgestellten Methoden, dass diese Szenarien
Persnliche Ausfertigung fr Martin Martinsson
249
Kapitel 6
Computerneustarts im Installationsprozess
zunchst initiiert werden mssen, indem ein Protokoll erstellt oder entsprechende programmtechnische
Anstze gewhlt werden. Vielfach werden Probleme ja erst im Nachhinein festgestellt, wobei sich
dann die Frage nach der mglichen Fehlerquelle stellt. An dieser Stelle hilft das WindowsEreignisprotokoll weiter, denn alle Informationen die einen Computerneustart betreffen, werden
diesem angefgt, wie auch Tabelle 6.52 zeigt.
Ereignis-ID
Quelle
Meldung
1005
MsiInstaller
Der Windows Installer hat einen Neustart des Systems initiiert, um die
Konfiguration von "%1" fortzusetzen bzw. abzuschlieen.
1029
MsiInstaller
1038
MsiInstaller
Die Verwendung des Ereignisprotokolls kann noch weiter optimiert werden, denn bei den
Betriebssystemen Windows Vista und Windows Server 2008 ist es nun mglich, entsprechende
Ereignisse weiter zu verarbeiten. So kann das Auftreten bestimmter Ereignisse mit individuellen
Aktionen, wie dem Senden einer Mail, der Anzeige einer Meldung oder dem Starten eines Programms
verknpft werden. Zur manuellen Erstellung ist die Ereignisanzeige zu ffnen, das entsprechende
Ereignis auszuwhlen und der Kontextmeneintrag Aufgabe an dieses Ereignis anfgen auszuwhlen.
Daraufhin ffnet sich der Assistent zum Erstellen einfacher Aufgaben und fhrt sie durch die weiteren
Schritte. Eine so erstellte Aufgabe wird letztlich der neu gestalteten Aufgabenplanung (Task
Scheduler) von Windows Vista und Windows Server 2008 hinzugefgt. Somit sind die Erstellung und
die nachtrgliche Modifikation auch hierber mglich. Ebenso steht eine Schnittstelle fr den
programmtechnischen Zugriff zur Verfgung.
Besonders interessant ist hierbei, dass alle Aufgaben ins XML-Format exportiert und importiert
werden knnen. Demzufolge ist es mglich, eine entsprechende XML-Datei zu erstellen und diese zu
importieren, wozu neben den Mglichkeiten ber die Benutzeroberflche auch eine
Befehlszeilensteuerung zur Verfgung steht. Bei Verwendung der in Listing 6.56 dargestellten XMLDatei, wird beim Auftreten des Ereignisses mit der ID 1038 der Quelle MsiInstaller eine Meldung mit
dem Titel Windows Installer und dem Text Ein Neustart des Computers ist erforderlich
ausgegeben.
<?xml version="1.0" encoding="UTF-16" ?>
<Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
<Triggers>
<EventTrigger>
<Enabled>true</Enabled>
<Subscription>
<QueryList>
<Query Id="0" Path="Application">
<Select Path="Application">*[System[Provider[@Name='MsiInstaller'] and EventID=1038]]</Select>
</Query>
</QueryList>
</Subscription>
250
</EventTrigger>
</Triggers>
<Actions Context="Author">
<ShowMessage>
<Title>Windows Installer</Title>
<Body> Ein Neustart des Computers ist erforderlich</Body>
</ShowMessage>
</Actions>
</Task>
Die gerade dargestellte XML-Datei kann nun der Aufgabenplanung hinzugefgt werden. Dieses kann
ber den Befehl Aufgabe importieren innerhalb der Benutzeroberflche oder auch ber eine
Befehlszeile erfolgen. Der folgende Befehlt fgt die Aufgabe unter der Bezeichnung MSI1038Event
der Aufgabenplanung hinzu:
Schtasks.exe /Create /TN MSI1038Event /XML d:\Event1038.xml
Es ist noch wichtig zu wissen, dass die Aufgabenplanung nun ein integraler Bestandteil von Windows
geworden ist, auf dem sehr viele Windowsfunktionen basieren. Deshalb kann dieser auch nicht einfach
abgeschaltet werden. Fr Sie bedeutet das: Sie knnen sich darauf verlassen, dass er luft.
251
Kapitel 6
Computerneustarts im Installationsprozess
Nachdem der bentigte Speicherbedarf ermittelt wurde, wird whrend der Aktion InstallValidate
geprft, ob ausreichend Festplattenspeicher zur Verfgung steht, wozu die symbolisch benannte
Verzeichnisstruktur aufgelst wird und anschlieend Berechnungen durchgefhrt werden. Falls nicht
gengend Speicher zur Verfgung steht, wird der Client-Prozess angewiesen, dem Benutzer einen
entsprechenden Dialog anzuzeigen. Falls der Speicher ausreichend ist wird whrend der Aktion
InstallValidate weiterhin geprft, ob zu ersetzende oder zu modifizierende Dateien in Verwendung
sind. In einem solchen Fall wird der Benutzer aufgefordert die jeweilige Anwendung zu schlieen, um
somit einen Computerneustart zu vermeiden. Hierzu findet natrlich wieder eine Kommunikation mit
dem Client-Prozess statt, der letztlich den in Abbildung 6.50 dargestellte Dialog FilesInUse fr diese
Zwecke anzeigt.
Abbildung 6.50: Dialog FilesInUse zeigt Prozesse an die Dateien derzeitig verwenden
Lassen Sie und das ganze noch etwas detaillierter betrachten und auf den Algorithmus eingehen, der
zum Ermitteln der Dateien angewendet wird. Zunchst einmal hat der Windows Installer zum
Zeitpunkt der Aktion InstallValidate festgestellt welche Dateien physisch installiert werden mssen
und welches Zielverzeichnis hierfr verwendet wird. Im nchsten Schritt muss nun geprft werden, ob
diese Dateien bereits verwendet werden. Die bisherige Implementierung zum Ermitteln dieser Dateien
bedient sich dem Registrierungshauptschlssel HKEY_PERFORMANCE_DATA. Hierbei handelt es
sich um einen virtuellen Schlssel der nicht physisch in der Registrierungsdatenbank vorhanden ist und
somit auch von den verfgbaren Editoren nicht angezeigt werden kann. Dieser Schlssel bietet den
Zugriff auf diverse Performance-Daten des Systems unter Verwendung des Registrierungs-API. Er
wird auch von dem in Windows Vista und Windows Server 2008 enthaltenen Tool Zuverlssigkeitsund Leistungsberwachung (Reliability and Performance Monitor) verwendet. Jeder der mit diesem
oder hnlichen Tools bereits gearbeitet hat, wird festgestellt haben, dass viele Informationen
prozessbezogen dargestellt werden knnen. Anhand dieser Prozessauflistung und der Liste der zu
installierenden Dateien kann nun ermittelt werden, welche Dateien derzeitig in Verwendung sind und
von welchen Prozessen sie verwendet werden. Somit ist es nun relativ einfach dem Benutzer eine Liste
mit Prozessen anzuzeigen, die beendet werden mssen um hierdurch einen Computerneustart zu
vermeiden. Dieses ist jedoch nur die Theorie; in der Praxis sind noch einige Besonderheiten zu
beachten.
252
Die Ermittlung der derzeitig verwendeten Dateien bercksichtigt nur PE-Dateien. Das PE steht
hierbei fr Portable Executable und kennzeichnet eine ausfhrbare Datei fr die Microsoft
Windows-Plattform. Es ist zu beachten, dass nicht alle PE-Dateien ber die Dateierweiterung .exe
verfgen. Bei Dateien vom Typ .dll, .scr, .sys, .cpl, .ocx und .msstyles handelt es sich ebenfalls um
PE-Dateien, auch wenn diese alleine nicht lauffhig sind. Das bedeutet, dass der aktuelle Files-InUse-Algorithmus nicht erkennt, wenn beispielsweise eine Textdatei verwendet wird.
Bei dem Prozess der die Datei verwendet, handelt es sich um den Prozess der die Installation
startet. Wird die Installation beispielsweise durch die Funktion MsiInstallProduct() einer eigenen
Anwendung gestartet, wird diese Anwendung nicht bercksichtigt, auch wenn sie derzeitig Dateien
verwendet.
Es werden nur Prozesse bercksichtigt, die ber ein sichtbares Fenster verfgen und die vom
Benutzer tatschlich beendet werden knnen. Hiermit ist jedoch ein sauberes Beenden gemeint und
kein Abschieen der Prozesse. Genau an dieser Stelle liegt jedoch das Problem. Vielfach hat der
Benutzer keine Mglichkeit einen solchen Prozess zu beenden. Aus diesem Grund erscheint er gar
nicht in der Liste.
Es wird deutlich, dass der skizzierte Mechanismus zum Ermitteln der in Verwendung befindlichen
Dateien durchaus einige Schwachpunkte aufweist. So werden nicht alle Dateiformate bercksichtigt
und nicht alle Prozesse dem Benutzer angezeigt. Die Grnde hierfr sind nachvollziehbar und
verstndlich. An dieser Stelle hat sich auch etwas getan, aber dazu spter mehr.
Zunchst nochmal zur Aktion InstallValidate und den relevanten Informationen im
Installationsprotokoll. Zunchst ist erkennbar, dass die Aktion aufgerufen wurde. Anschlieend finden
sich die Informationen zum Installationsumfang, also der Festlegung des relevanten Aktionsstatus der
Features und der Komponenten.
MSI (s) (20:48) [12:05:49:437]: Doing action: InstallValidate
MSI (s) (20:48) [12:05:49:437]: Feature: Application; Installed: Absent; Request: Local; Action: Local
MSI (s) (20:48) [12:05:49:437]: Component: C__RMEditor.exe; Installed: Absent; Request: Local; Action: Local
Falls Dateien in Verwendung sind, wird dieses im Klartext dem Installationsprotokoll mit Hinweis auf
den Prozess, die Prozess-Id und weiteren Informationen angefgt.
MSI (s) (20:48) [12:05:49:968]: 1 application(s) had been reported to have files in use.
Info 1603. The file C:\Program Files (x86)\Tools\RMEditor.exe is being held in use by the following process:
Name: RMEditor, Id: 3752, Window Title: '(not determined yet)'. Close that application and retry.
An dieser Stelle wird nun der Dialog FilesInUse angezeigt, wodurch dem Benutzer mehrere
Mglichkeiten fr den weiteren Ablauf des Installationsprozesses angeboten werden. Falls die
Schaltflche Beenden aktiviert wird, wird der Installationsprozess auch an dieser Stelle abgebrochen.
Im Installationsprotokoll wird dieses durch den Rckgabewert 2 dargestellt, wobei dieser Wert
ERROR_INSTALL_USEREXIT bedeutet.
Action ended 12:27:23: InstallValidate. Return value 2.
Action ended 12:27:23: INSTALL. Return value 2.
Wird hingegen die Schaltflche Wiederholen aktiviert, prft der Windows Installer nochmals, ob
Dateien in Verwendung sind. Falls das der Fall ist wird der Dialog erneut angezeigt. Aktiviert der
Anwender hingegen die Schaltflche Ignorieren, so kann dieses zwangslufig zu dem Szenario fhren,
das es zu vermeiden gilt dem Computerneustart. Das bisher dargestellte Verhaltensmuster des
Windows Installers hat keinen Einfluss auf das physische Kopieren der Datei, sondern lediglich
Persnliche Ausfertigung fr Martin Martinsson
253
Kapitel 6
Computerneustarts im Installationsprozess
informellen Charakter. Hierdurch soll der Anwender frhzeitig auf einen mglichen Computerneustart
hingewiesen werden, weiterhin soll ihm die Mglichkeit gegeben werden, diesen durch geeignete
Manahmen zu vermeiden.
Bei der physischen Modifikation des Zielsystems werden nun diverse Schritte durchlaufen, die
letztlich das Kopieren der Datei sicherstellen sollen. Im Ersten Schritt wird geprft ob die zu
kopierende Datei bereits auf dem Zielsystem existiert. Ist dies der Fall und werden dieser Datei keine
besonderen Zugriffssteuerlisten zugewiesen, werden die Zugriffsteuerlisten der existierenden Datei
gesichert, damit sie spter auf die neue Datei angewendet werden knnen. Ist die Datei auf dem
Zielsystem noch nicht vorhanden, wird lediglich die Operationsanweisung zum Entfernen der Datei in
das Rollback-Skript bertragen. Existiert die Datei bereits, wird sie vor dem Entfernen fr einen
eventuellen Rollback gesichert. Hierzu wird zunchst der Ort bestimmt, an dem die gesicherte Datei
abgelegt werden soll. Als Erstes wird geprft ob der Ordner config.msi im Stammverzeichnis des
Laufwerks erstellt werden kann, auf dem sich die Datei befindet und ob in diesen Ordner geschrieben
werden kann. Ist dieses nicht der Fall wird die Datei unter einem abweichenden Namen im
Originalverzeichnis gesichert. Lsst sich der Ordner config.msi hingegen erstellen, wird die zu
sichernde Datei in diesen Ordner verschoben, wobei die Datei umbenannt wird. Falls beim
Verschieben Probleme auftreten, wird zunchst die Datei kopiert und anschlieend die existierende
gelscht. Schlgt der Lschvorgang fehl wird das Attribut Neustart ist erforderlich gesetzt und die
Datei zum Lschen nach dem Systemneustart markiert, wie dieses auch das Installationsprotokoll
zeigt.
MSI (s) (F0:60) [16:55:14:728]: Executing op: FileCopy(SourceName=RMEditor.exe,SourceCabKey=F__RMEditor.exe,
DestName=RMEditor.exe,Attributes=512,FileSize=76800,PerTick=32768,,VerifyMedia=1,,,,,CheckCRC=0,
Version=2.0.0.0,Language=0,InstallMode=58982400,,,,,,,)
MSI (s) (F0:60) [16:55:14:729]: File: C:\Program Files (x86)\Tools\RMEditor.exe; Overwrite;
Won't patch; Existing file is a lower version
MSI (s) (F0:60) [16:55:14:729]: Re-applying security from existing file.
MSI (s) (F0:60) [16:55:14:730]: Product: Installer-Demo. The file C:\Program Files (x86)\Tools\RMEditor.exe
is being used by the following process: Name: RMEditor , Id 7288.
MSI (s) (F0:60) [16:55:14:731]: Verifying accessibility of file: RMEditor.exe
Info 2318. File does not exist: C:\Config.Msi\1d44c31.rbf
MSI (s) (F0:60) [16:55:14:731]: Using source file security for destination.
Info 2329. Error deleting file: C:\Program Files (x86)\Tools\RMEditor.exe. GetLastError: 32.
Falls Dateien berschrieben werden, die derzeitig in Verwendung sind, wird vom Windows Installer
die Eigenschaft ReplacedInUseFiles auf 1 gesetzt, die sich auch in der Eigenschaftenauflistung des
Protokolls wieder findet.
Property(S): ReplacedInUseFiles = 1
Wie
254
bereits zu Beginn
dieses
Abschnittes erwhnt,
Ende
des
Zum besseren Verstndnis mchte ich die Darstellung dieser Funktion mit den regulren
Dateibezeichnungen aus dem in Listing 6.57 dargestellten Protokollauszug verwenden. Hierbei soll
die Datei C:\Program Files (x86)\Tools\RMEditor.exe ersetzt werden, was jedoch nicht mglich ist, da
sie bereits verwendet wird. Aus diesem Grund wird die neue Datei unter der Bezeichnung
TBM2FBA.tmp ebenfalls im Ordner C:\Program Files (x86)\Tools gespeichert. Zustzlich wird das
Betriebssystem informiert, dass das Umbenennen der Datei nach einem Computerneustart erfolgen
soll. Wird dieses nun auf die Funktion MoveFileAfterReboot() in Listing 6.58 projiziert, wrde sich
folgender Funktionsaufruf ergeben:
255
Kapitel 6
Computerneustarts im Installationsprozess
MoveFileAfterReboot(C:\\Program
Files
(x86)\\Tools\\TBM2FBA.tmp,
C:\\Program Files (x86)\\Tools\\RMEditor.exe);
Letztlich wird hierdurch die bereits bekannte Win32-Funktion MoveFileEx() mit dem Parameter
MOVEFILE_DELAY_UNTIL_REBOOT aufgerufen. Dieser Parameter bewirkt, dass die ursprngliche
Datei RMEditor.exe nach dem Neustart gelscht und die neue Datei TBM2FBA.tmp in RMEditor.exe
umbenannt wird. Hierfr verantwortlich ist das Betriebssystem selbst, denn dieses stellt fr solche
Szenarien einen entsprechenden Mechanismus mit der Bezeichnung PendingFileRenameOperations
zur Verfgung. In Wirklichkeit handelt es sich hierbei lediglich um einen Eintrag in der
Systemregistrierung, dem die jeweiligen Dateien angefgt werden und der beim Neustart des
Computers abgearbeitet wird. Der Eintrag PendingFileRenameOperations ist vom Typ
REG_MULTI_SZ
und
wird
in
der
Systemregistrierung
unter
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager angelegt. Dieser
Eintrag enthlt einen oder mehrere Dateinamenpaare, wobei der erste Name die neue Datei
reprsentiert, die letztlich nach dem Neustart in die zweite Datei umbenannt wird. Die nachfolgenden
Eintragungen finden sich nach dem zuvor beschriebenen Aufruf von MoveFileAfterReboot() in der
Systemregistrierung. Es ist erkennbar, dass den Dateinamen zustzliche Zeichen vorangestellt sind.
Hierbei handelt es sich um ein spezielles Kennzeichnungsformat, das jedoch bei der spteren
Umbenennung nicht bercksichtigt wird.
\??\C:\Program Files (x86)\Tools\TBM2FBA.tmp
!\??\C:\Program Files (x86)\Tools\RMEditor.exe
Mitunter kann es vorkommen, dass im Rahmen der Installation eine Datei gelscht werden soll, die
bereits verwendet wird. Auch dieses Szenario wird unter Verwendung der Funktion MoveFileEx() und
dem bekannten Parameter MOVEFILE_DELAY_UNTIL_REBOOT realisiert. Beim Aufruf der
Funktion ist hier jedoch der zweite Parameter auf Null zu setzen.
Tipp Beginn
Mit Hilfe des Tools pendmoves.exe von Windows Sysinternals kann geprft werden, ob Lsch- oder
Umbenennungsaktionen noch ausstehen und ob die entsprechenden Dateien physisch vorhanden sind.
Ein weiteres Tool von Windows Sysinternals ist movefile.exe. Hiermit ist es mglich, auf einfache
Weise die Funktionalitt der PendingFileRenameOperations zu nutzen.
Tipp Ende
256
Operationen ausgefhrt werden. Diese Fragestellung ist natrlich uerst wichtig, wenn es darum geht,
bereits frhzeitig auf diese neuen Dateien zuzugreifen. Die Erluterung ist etwas komplexer, da hierzu
ein Abriss des Startvorgangs unverzichtbar ist.
Whrend des Computerneustarts werden mehrere Phasen durchlaufen, wobei der Beginn des
Bootvorgangs von der verwendeten Plattform abhngig ist. Zu Beginn kommt hierbei der Boot-Loader
ins Spiel. Hierbei handelt es sich um eine spezielle Software, die sich bereits auf dem bootfhigen
Medium befindet und von einer speziellen Firmware wie dem BIOS geladen und ausgefhrt wird. Fr
die Windows-Plattform sind standardmig zwei dieser Boot-Loader verfgbar:
NT-Loader (NTLDR): Hierbei handelt es sich um den Bootmanager fr die Betriebssysteme
Windows NT, Windows 2000, Windows XP und Windows Server 2003.
Windows Boot Manager (Bootmgr): Hierbei handelt es sich um den Bootmanager von Windows
Vista und Windows Server 2008.
Whrend dieser ersten Phase kann der Benutzer beispielsweise das zu verwendende Betriebssystem
auswhlen, falls Mehrere vorhanden sind. Im Anschluss erfolgt der Wechsel in die Kernel-LoadingPhase. Beim Kernel handelt es sich um den zentralen Bestandteil des Betriebssystems, der an dieser
Stelle vom Boot-Loader geladen. Im Betriebssystemkern ist die Prozess- und Datenorganisation
festgelegt, auf der alle weiteren Softwarebestandteile des Betriebssystems aufbauen. Hierbei handelt es
sich auch um die unterste Softwareschicht, so dass hiermit auf die Hardware zugegriffen werden kann.
Nachdem der Betriebssystemkern geladen wurde kommen wir nun zu dem fr dieses Thema
relevanten Teil des Bootvorgangs; der Kernel ldt den Sitzungs-Manager (Session Manager). Hierbei
handelt es sich um das Subsystem, das fr das Starten von Benutzersitzungen zustndig ist. Im Detail
werden hier die folgenden Aktionen ausgefhrt:
Die
System-Umgebungsvariablen
werden
erstellt.
Diese
sind
unter
HKEYLOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment definiert.
Der Kernelmodus des Win32-Subsystems (win23k.sys) wird gestartet. Hierdurch ist der Wechsel in
den graphischen Darstellungsmodus mglich.
Der Benutzermodus des Win32-Subsystems, also das Client/Server Runtime Server Subsystem
(csrss.exe) wird gestartet. Hierdurch ist es mglich, Anwendungen im Benutzermodus (user-mode
applications) auszufhren.
Die Auslagerungsdatei fr den virtuellen Speicher wird erstellt.
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session
Management definiert.
Die Umbenennungsoperationen werden ausgefhrt. An dieser Stelle werden somit die Elemente
des Registrierungseintrags PendingFileRenameOperations abgearbeitet.
Danach wird der Windows-Anmeldevorgang (winlogon.exe) gestartet, der durch die folgenden
Aktionen charakterisiert ist:
Ermitteln der Anmeldeinformationen. An dieser Stelle gibt es gravierende Unterschiede zwischen
den Betriebssystemgenerationen. Bei Windows Vista und Windows Server 2008 werden hierzu so
genannte Anmeldeinformationsanbieter (Credential Providers) verwendet. Bei den
Betriebssystemen der frheren Generation erfolgte die Authentifizierung ber die Graphical
identification and authentication library, die auch besser unter der Bezeichnung GINA bekannt ist.
berprfen der Anmeldeinformationen durch das Local Security Authority Subsystem, wobei durch
dieses auch ermittelt wird welche Sicherheitskontenverwaltung (SAM) verwendet wird. Zur
257
Kapitel 6
Computerneustarts im Installationsprozess
Auswahl stehen hier die lokale SAM, die Domnen SAM oder das Active Directory.
Der Service Control Manager wird gestartet, so dass alle Betriebssystemdienste ebenfalls
ausgefhrt werden, die fr den automatischen Start konfiguriert wurden.
Nachdem der Benutzer sich erfolgreich am System angemeldet hat, werden durch winlogon.exe noch
die Konfigurationseinstellungen aktualisiert. Hierbei wird die Einstellung LastKnownGood so
angepasst, dass die aktuelle Konfiguration (HKEY_LOCAL_MACHINE\System\CurrentControlSet)
hier abgebildet wird. Nachdem die Benutzer- und maschinenspezifischen Gruppenrichtlinien
angewendet wurden, erfolgt noch der Start vorkonfigurierter Anwendungen. Hierbei werden die
folgenden Orte in der angegebenen Reihenfolge durchlaufen.
7. HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunOnce
8. HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\Run
9. HKEY_LOCAL_MACHINE\Software \Microsoft\Windows\CurrentVersion\Run
10. HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Windows\Run
11. HKEY_CURRENT_USER \Software\Microsoft\Windows\CurrentVersion\Run
12. HKEY_CURRENT_USER \Software\Microsoft\Windows\CurrentVersion\RunOnce
13. % ALLUSERSPROFILE%\Microsoft\Windows\Start Menu\Programs\Startup
14. %APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup
Durch die Darstellung des Startvorgangs kann nun auch die noch offene Frage beantwortet werden.
Das Umbenennen der Dateien erfolgt bereits recht frh, so dass hierdurch sichergestellt ist, dass
beispielsweise Betriebssysteme oder automatisch startende Anwendungen bereits eine neue Version
der Datei verwenden.
Selbstregistrierung: Bei der Registrierung von COM-Komponenten unter Verwendung der Tabelle
SelfReg, kann es zum Neustart kommen, falls die Komponente bereits verwendet wird.
Das zweite Szenario ist wesentlich komplexer und die Umsetzung ist nicht ganz trivial. Hierbei handelt
es sich nicht um ein einzelnes Installationspaket, sondern um mehrere Pakete, die nacheinander
ausgefhrt werden. Die effektive Realisierung eines solchen Szenarios, ist eines der wesentlichen
neuen Features im Windows Installer 4.5, so dass ich spter nochmal hierauf zurck kommen werde.
An dieser Stelle mchte einen allgemeinen oder generischen Ansatz vorstellen, der derzeitig vielfach
verwendet wird. Einfach ausgedrckt werden hierbei nacheinander die Installationen unter
Verwendung der Programmierschnittstelle oder von msiexec.exe ausgefhrt, wobei ein vom System
veranlasster Neustart unterdrckt wird. Wie gesagt diese Vorgehensweise ist derzeitig allgegenwrtig,
obwohl die Installationsergebnisse durchaus problematisch sein knnen, wie die folgenden Szenarien
zeigen:
In diesem Beispiel wird vom ersten Installationspaket eine Datei installiert, die vom zweiten
Installationspaket als benutzerdefinierte Aktion verwendet wird. Sicherlich weisen die Richtlinien
zur Gestaltung von benutzerdefinierten Aktionen auf diese Problematik hin und fordern dazu auf,
den binren Datenspeicher hierfr zu nutzen, aber die Praxis sieht leider anders aus. Kann jetzt
diese Datei dem System nicht hinzugefgt werden, da bereits eine ltere und vielleicht auch
inkompatible Version der Datei in Verwendung ist, kommt es zwangslufig zum Fehler bei
Ausfhren der benutzerdefinierten Aktion. Solange dieser Fehler auch transparent ist, kann auch
entsprechend reagiert werden. Mitunter sind benutzerdefinierte Aktionen so definiert, dass der
Rckgabewert ignoriert wird. Hierdurch kann das Fehlverhalten nicht sofort bemerkt werden, so
dass zwangslufig eine sptere Fehlersuche wesentlich erschwert wird. Hierbei sollte auch immer
bercksichtigt werden, dass vielfach Installationspakete verwendet werden, auf deren Gestaltung
kein Einfluss genommen werden kann und somit bestimmte Verhaltensmuster nicht offengelegt
sind.
Das zweite Beispiel ist etwas anderer Natur, da es sich direkt auf das Erscheinungsbild des finalen
Produktes auswirkt. Hierbei ist eine ausfhrbare Datei der Version 1.0 bereits in Verwendung und
kann somit ohne Computerneustart nicht ersetzt werden. Mit dem ersten Installationspaket soll
diese Datei durch die Version 1.5 ersetzt werden. Das ist zunchst nicht mglich, da die Datei in
Verwendung
ist.
Also
werden
die
entsprechenden
Eintragungen
unter
PendingFileRenameOperations vorgenommen, so dass die Datei nach dem nchsten Neustart
aktualisiert wird. Der Neustart wird unterdrckt und die nchste Installation ausgefhrt. Hierbei
wird die Datei in der Version 1.2 installiert. Windows Installer wendet natrlich die StandardVersionierungsregel an um zu berprfen, ob die bisherige Datei berschrieben werden soll.
Physisch befindet sich die Version 1.0 auf dem Computer, so dass die Versionsnummer 1.2 hher
ist und die Datei aktualisiert werden muss. Die Problematik ist bereits hier erkennbar; die Datei in
der Version 1.5 ist physisch noch nicht in der relevanten Form vorhanden, so dass sie an dieser
Stelle nicht bercksichtigt wird. Es kommt was kommen muss; auch die Version 1.2 der Datei wird
den PendingFileRenameOperations zugefgt. Im Rahmen des Neustarts werden die Eintragungen
dann sequentiell verarbeitet, wodurch zunchst die Version 1.0 gegen die Version 1.5
ausgewechselt wird und diese dann wiederum durch Version 1.2 berschrieben wird.
Sicherlich ist es elegant und mitunter auch notwendig einen Computerneustart zu unterdrcken, alle
Installationen sequentiell durchzufhren und erst im Anschluss das System neu zu starten. Das spart
Zeit ist komfortabel, kann aber auch einige Probleme verursachen, wie dieses auch gerade dargestellt
wurde. Hier muss nun die Frage nach den Lsungsmglichkeiten gestellt werden, falls denn solche
vorhanden sind.
Persnliche Ausfertigung fr Martin Martinsson
259
Kapitel 6
Computerneustarts im Installationsprozess
Die Ursache fr das Verhalten und die daraus resultierende Probleme sind die verwendeten Dateien.
Falls diese frhzeitig freigegeben werden und somit whrend der Installation auch physisch ersetzt
werden knnten, wre ein Computerneustart nicht erforderlich. Hier kann optimiert werden und hier
wurde optimiert. Windows Vista und Windows Server 2008 enthalten eine Technologie, die als
Neustart-Manager bezeichnet wird und durch die diese Probleme adressiert werden. Der nchste groe
Block dieses Kapitels befasst sich intensiv mit dieser Technologie. Falls trotz Neustart-Manager und
anderer Technologien ein Computerneustart unumgnglich ist, sollte der Algorithmus seitens des
Windows Installers zur Nutzung der PendingFileRenameOperations optimiert werden. Auch dieses
Thema wurde adressiert; eine entsprechende Lsung wurde in den Windows Installer 4.5 integriert,
wie spter noch dargestellt wird. Falls aber kein Neustart-Manager vorhanden ist und auch der
Windows Installer 4.5 nicht genutzt wird, sind die Lsungsanstze sehr eingeschrnkt und die
Kreativitt des Entwicklers ist gefragt.
Ein denkbarer Ausweg aus dem Dilemma wre die berwachung der Eigenschaft ReplacedInUseFiles,
die vom Windows Installer automatisch gesetzt wird, falls bereits verwendete Dateien berschrieben
werden mssen. Dieses ist jedoch keine Lsung, denn einen Neustart wrde der Windows Installer
automatisch vornehmen, falls dieser nicht unterdrckt worden wre. Ein anderer Ansatz betrifft die
Eigenschaft MsiSystemRebootPending. Diese Eigenschaft wurde mit dem Windows Installer 4.0 neu
eingefhrt und wird vom Windows Installer automatisch gesetzt, falls ein Computerneustart noch
aussteht. Folgt man der Windows Installer-Dokumentation, sollte diese Eigenschaft von jedem Paket
ber die Tabelle LaunchCondition geprft werden um somit die Installation abzubrechen, falls ein
Neustart noch aussteht. Die Problematik liegt nun darin, dass die Eigenschaft
MsiSystemRebootPending
lediglich
die
Existenz
des
Registrierungseintrages
PendingFileRenameOperations prft. Es wird keine Verbindung zwischen den darin enthaltenen
Werten und den Dateien des Installationspaketes hergestellt. Dominik Oberlin hat in seinem Blog einen
interessanten Lsungsansatz vorgestellt, der diese Funktionalitt ergnzt. Hier wird eine
benutzerdefinierte Aktion vorgestellt, die die Eintrge aus PendingFileRenameOperations mit den
Dateien des Paketes vergleicht und das Ergebnis einer individuellen Eigenschaft zuweist. Hiermit wre
es mglich zu prfen, ob die in PendingFileRenameOperations registrierten Dateien einen
tatschlichen Einfluss auf den Installationsablauf haben. Der Nachteil liegt auch auf der Hand. Die
benutzerdefinierte Aktion muss in jedes Installationspaket integriert werden, was nicht immer mglich
ist. Sicherlich wre es auch denkbar einen hnlichen Mechanismus zwischen die einzelnen
Installationsaufrufe zu integrieren, um hier einen intelligenten Abbruchmechanismus zu schaffen.
Allerdings ist dieses auch keine saubere Lsung, denn vor der Installation kann nur der
Standardumfang der zu installierenden Dateien geprft werden, wodurch es zu Abweichungen
whrend der eigentlichen Installation kommen kann. Es ist erkennbar, dass scheinbar keine wirkliche
Lsungsmglichkeit existiert, dennoch ist dieser Ansatz recht interessant, wie auch die anderen
Eintrge des Blogs, die unter http://windowsinstaller.wordpress.com zu finden sind.
In Abbildung 6.51 ist weiterhin erkennbar, dass sich die Ursachen in einen geplanten und einen nicht
geplanten Bereich unterteilen lassen. Bei den nichtplanbaren Ursachen handelt es sich im
Wesentlichen um Fehler im Betriebssystem, der Anwendung oder der Hardware, die zum Neustart
fhren. Der grere und auch fr dieses Kapitel wichtigere Bereich betrifft die geplanten Aktionen,
also alles was im Zusammenhang mit der Installation steht. Hier wird deutlich dass sich fast 70% der
Neustarts dieser Kategorie zuordnen lassen. An dieser Stelle kommt nun der Neustart-Manager ins
Spiel, mit dem die Neustarts im Rahmen der Anwendungsinstallation um 70% und bei der
Aktualisierung des Betriebssystems um mindestens 50% reduziert werden sollen. Diese Werte sollen
erreicht werden, indem alle gngigen Installationsmechanismen wie Windows Installer, Windows
Update, Microsoft System Management Server und Microsoft System Center Configuration Manager
diese Technologie untersttzen. Hierbei ist zu bercksichtigen, dass nicht alle Ursachen fr einen
Computerneustart im Rahmen des Installationsprozesses hiermit optimiert werden knnen. So sind die
in Abbildung 6.49 skizzierten Prozess-, Kommunikations- und Konfigurationsprobleme aus
nachvollziehbaren Grnden hiervon ausgenommen. Der Neustart-Manager zielt somit auf die bereits
ausgiebig erluterte Hauptursache fr die Durchfhrung eines Computerneustarts hin, die darin
begrndet liegt, dass zum Installationszeitpunkt zu ersetzende Dateien bereits in Verwendung sind.
Das hieraus abzuleitende Ziel ist es, diese Dateien frhzeitig freizugeben, so dass sie problemlos
ersetzt werden knnen. Abbildung 6.52 zeigt die Grnde fr die Durchfhrung eines
Computerneustarts, sowie die darauf basierenden Lsungen. In der Abbildung sind ebenfalls die
Problempunkte erkennbar, die durch den Neustart-Manager adressiert werden:
Anwendungen speichern ihren Status automatisch und werden ohne Interaktion mit dem Benutzer
261
Kapitel 6
Computerneustarts im Installationsprozess
Bevor die entsprechenden Anwendungen durch den Neustart-Manager beendet und wieder gestartet
werden knnen, sind natrlich zunchst die betroffenen Anwendungen zu ermitteln. Blicken wir an
dieser Stelle kurz zurck zum bereits erluterten Files-In-Use-Algorithmus. Bei der Ermittlung der
bereits verwendeten Dateien wurden hierbei nur PE-Dateien bercksichtigt. Im Weiteren wurden nur
Prozesse bercksichtigt, die ber ein sichtbares Fenster verfgen und die vom Benutzer tatschlich
beendet werden konnten. Hieraus lie sich ableiten, dass der Algorithmus fr normale
Anwendungen gut funktioniert, aber in vielen Szenarien doch einige Schwachpunkte aufweist.
Der Neustart-Manager arbeitet hier wesentlich effektiver, da der Algorithmus zum Erkennen der
bereits verwendeten Dateien nicht auf PE-Dateien beschrnkt ist. Dieser neue Mechanismus basiert
somit nicht mehr auf den Informationen des Schlssels HKEY_PERFORMANCE_DATA sondern
262
Beschreibung
RmAddFilter()
Entfernt eine Anwendung oder einen Dienst aus der Liste der zu
beendenden und / oder zu startenden Prozesse.
RmCancelCurrentTask()
RmEndSession()
RmGetFilterList()
Gibt die mit RmAddFilter() erzeugte Liste der Prozesse zurck, die vom
Herunterfahren und / oder Neustarten ausgeschlossen wurden.
RmGetList()
Gibt eine Auflistung aller Anwendungen und Dienste zurck, die eine
Ressource verwenden, die in der Neustart-Manager-Sitzung registriert
wurden.
RmJoinSession()
Ermglicht es einem neuen Prozess sich mit einer bestehenden NeustartManager-Sitzung zu verbinden.
RmRegisterResources()
RmRemoveFilter()
RmRestart()
RmShutdown()
RmStartSession()
Erzeugt eine Neustart-Manager Sitzung. Es knnen maximal 64 NeustartManager-Sitzungen pro Benutzer-Sitzung zur gleichen Zeit gestartet
werden.
263
Kapitel 6
Computerneustarts im Installationsprozess
Die erste Aufgabe des Neustart-Managers besteht in der Ermittlung der derzeitig verwendeten
Ressourcen und die Identifizierung der Prozesse, die diese Ressourcen verwenden. Ich habe hier
bewusst den Begriff der Ressource verwendet, denn der Neustart-Manager ist nicht auf die Erkennung
von Dateien beschrnkt. So ist es auch mglich, den oder die Prozesse herauszufinden, die einen
Dienst, einen anderen Prozess oder lediglich eine Datei verwenden. Nachdem die betroffenen Prozesse
ermittelt wurden, werden diese durch den Neustart-Manager automatisch beendet und anschlieend
wieder neu gestartet, wie dieses auch in Abbildung 6.53 zu sehen ist. Durch die Verwendung einiger
Hilfsfunktionen ist es mglich die Auflistung der betroffenen Prozesse nachtrglich zu korrigieren.
Nachdem der grob gefasste Ablauf innerhalb des Neustart-Managers bekannt ist, folgt eine detaillierte
Betrachtung der beiden relevanten Phasen.
264
Listing 6.59: Ermitteln der verwendeten Dateien mit den Microsoft Logo Testing Tools for Windows
Die programmtechnische Umsetzung der gerade vorgestellten Funktionalitt stellt auch keine groe
Herausforderung dar, wie Listing 6.60 zeigt. Die relevante Funktion fr die Umsetzung ist
RmRegisterResources(), die wie folgt definiert ist:
[DllImport("rstrtmgr.dll", CharSet = CharSet.Unicode)]
internal static extern int RmRegisterResources(uint dwSessionHandle,
uint nFiles, string[] rgsFilenames,
uint nApplications, RM_UNIQUE_PROCESS[] rgApplications,
uint nServices, string[] rgsServiceNames);
Hierbei ist erkennbar, dass dem ersten Parameter das Handle der Neustart-Manager-Sitzung bergeben
wird. Die folgenden Parameter definieren die zu prfenden Ressourcen, wobei es sich immer um
Parameterpaare handelt. Der erste Parameter jeden Paares enthlt die Anzahl der Elemente des Arrays
das im zweiten Parameter bergeben wird. Die Parameterpaare sind wie folgt zu verwenden:
rgsFilenames: Hiermit werden zu berprfende Dateien festgelegt. Diese sind mit vollstndiger
Pfadangabe dem Array anzufgen. Falls keine Dateien zu berprfen sind, ist dieser Parameter auf
Null und der Parameter nFiles auf 0 zu setzen. Das gleiche gilt sinngem fr die weiteren
Parameterpaare.
rgApplications: Hiermit werden zu berprfende Anwendungen festgelegt, die hierzu einem Array
von Strukturen des Typs RM_UNIQUE_PROCESS angefgt werden. Die Struktur
RM_UNIQUE_PROCESS definiert einen eindeutigen Prozess und bentigt somit die Prozess-ID
(PID) und die Startzeit des Prozesses.
rgsServiceNames: Dieser Parameter wird bentigt um Betriebssystemdienste auf Verwendung zu
prfen.
Hierzu
sind
die
kurzen
Namen
des
Dienstes
wie
sie
unter
Persnliche Ausfertigung fr Martin Martinsson
265
Kapitel 6
Computerneustarts im Installationsprozess
266
this.Processes.Add(Process.GetProcessById(processInfo[i].Process.dwProcessId));
}
catch (ArgumentException) { } // Falls der Prozess gerade beendet wurde
}
}
else throw new Win32Exception(rv);
}
else if (rv != 0) throw new Win32Exception(rv);
}
finally
{
// Neutart-Manager Session schlieen
NativeMethods.RmEndSession(sessionHandle);
}
}
else
{
// Exception
throw new Win32Exception(rv);
}
}
Die Funktion RmGetList() erfllt hierbei mehrere Aufgaben. Im ersten Schritt wird eine Auflistung der
Prozesse erstellt, die eine durch RmRegisterResources() registrierte Ressource in Verwendung halten.
Im zweiten Schritt wird ermittelt ob die Prozesse beendet werden knnen und somit auf einen
notwendigen Computerneustart verzichtet werden kann. Zur Erstellung der Prozessauflistung werden
die folgenden Aktivitten durchgefhrt:
1. Ermitteln der Prozesse die Ressourcen verwenden: Es werden alle Prozesse identifiziert und der
Auflistung hinzugefgt, die derzeitig registrierte Ressourcen verwenden. Hierzu erfolgt ein Aufruf
der Funktion NTQueryInformationFile(). Es werden alle ausfhrbaren Prozess-Abbilder
(Executable Images), alle im Speicher abgebildeten Dateien (Memory Mapped Files), sowie alle
geffneten Datendateien bercksichtigt.
2. Hinzufgen der registrierten Prozesse: Es werden alle Prozesse der Auflistung angefgt, die dem
Parameter rgApplications der Funktion RmRegisterResources() bergeben wurden.
3. Hinzufgen der registrierten Dienste: Es werden alle Dienste der Auflistung angefgt, die dem
Parameter rgsServiceNames der Funktion RmRegisterResources() bergeben wurden.
4. Ermitteln abhngiger Dienste: Fr jeden Dienst der Auflistung werden die davon abhngigen
Dienste ermittelt und diese werden ebenfalls der Auflistung hinzugefgt.
5. Klassifizieren der Prozesse: Als letztes werden alle Prozesse der Auflistung klassifiziert. Die
mglichen Klassifizierungen sind in Tabelle 6.54 zusammengefasst. Die entsprechenden Werte
werden in die Eigenschaft ApplicationType der Struktur RM_PROCESS_INFO bertragen.
Hiermit ist die erste Aufgabe der Funktion RmGetList() abgeschlossen. Es wurde eine Liste von den
Prozessen erstellt, die Ressourcen in Verwendung halten und somit zu beenden sind, falls auf einen
Computerneustart verzichtet werden soll.
Wert
Beschreibung
267
Kapitel 6
Computerneustarts im Installationsprozess
RmUnknownApp (0)
Der Typ der Anwendung kann nicht bestimmt werden. Eine Anwendung dieses
Typs kann nur durch einen Computerneustart beendet werden.
RmMainWindow (1)
RmOtherWindow (2)
RmService (3)
RmExplorer (4)
RmConsole (5)
RmCritical (1000)
Ein Systemneustart ist zum Beenden dieses Prozesses erforderlich. Dieses ist
mglich, wenn es sich um einen kritischen Prozess oder Dienst handelt, der
Benutzer keine ausreichenden Privilegien besitzt, den Prozess zu beenden oder es
sich um den Prozess handelt, der die Neustart-Manager-Sitzung erzeugt hat.
Zustzlich zum Erzeugen der Prozessliste wird noch geprft, ob die Prozesse auch beendet werden
knnen. Hierzu wird bei allen Prozessen der Liste u.a. die Eigenschaft ApplicationType ausgewertet.
Das Ergebnis dieser Prfung wird dem Parameter lpdwRebootReasons zugewiesen. Falls mindestens
ein Prozess nicht beendet werden kann, ist ein Neustart des Systems unumgnglich. Die mglichen
Grnde dafr sind in Tabelle 6.55 zusammengefasst.
Wert
Beschreibung
None (0x0)
PermissionDenied (0x1)
SessionMismatch (0x2)
CriticalProcess (0x4)
CriticalService (0x8)
DetectedSelf (0x10)
Tabelle 6.55: Grnde in denen ein Computerneustart trotz Neustart-Managers erforderlich ist.
wird. In das Beenden der Prozesse mglich werden alle Prozesse der Auflistung durch den NeustartManager aufgefordert ihren Status zu speichern und anschlieend werden sie beendet. Nach
Aktualisierung der Ressourcen, werden die Prozesse in umgekehrter Reihenfolge wieder gestartet.
Der wahrscheinlich komplizierteste und undurchsichtigste Aspekt in diesem Szenario ist das Speichern
des aktuellen Status der Anwendung. Der Neustart-Manager enthlt keine Mechanismen zum
Persistieren des Status. Er teilt lediglich der Anwendung mit das diese beendet werden muss. Dieses
setzt zwangslufig eine Implementierung zum Speichern und zum Wiederherstellen des Status in der
Anwendung voraus, wodurch spezielle Anforderungen an das Anwendungsdesign gestellt werden, die
natrlich von der Art der Anwendung abhngig sind. Der schematische Ablauf zum Speichern des
Status und dem Beenden einer Windows-Anwendung wird in Abbildung 6.54 dargestellt.
Abbildung 6.54: Ablauf beim Beenden einer Windows-Anwendung durch den Neustart-Manager
Im ersten Schritt informiert der Neustart-Manager alle Anwendungen, dass diese demnchst beendet
werden. Hierzu sendet er die Fenstermeldung WM_QUERYENDSESSION an die entsprechenden
Anwendungen, wobei der Parameter lParam auf ENDSESSION_CLOSEAPP gesetzt wurde. Die
jeweilige Anwendung gibt True zurck und signalisiert hierdurch dem Neustart-Manager, dass die
Vorbereitungen fr das Beenden und den Neustart abgeschlossen sind. Diese Meldung hat wie gesagt
nur informativen Charakter und verlangt zunchst noch keine besonderen Aktivitten seitens der
Anwendung. Es ist natrlich mglich, an dieser Stelle bereits den Status der Anwendung zu speichern.
Die Problematik liegt jedoch darin, dass der Neustart-Manager die Fenstermeldung an alle betroffenen
Anwendungen sendet. Gibt eine der Anwendungen False zurck oder reagiert innerhalb der
Zeitspanne von 5 Sekunden nicht auf die Meldung, wird der Vorgang zum Beenden der Anwendungen
abgebrochen, so dass ein entsprechender Speichervorgang umsonst ausgefhrt wurde. Gibt jedoch
keine der betroffenen Anwendungen False zurck, setzt der Neustart-Manager den Prozess fort, indem
die Fenstermeldung WM_ENDSESSION wiederum an alle Fenster gesendet wird. Auch bei dieser
Meldung wird Parameter lParam auf ENDSESSION_CLOSEAPP gesetzt. Dieses ist jetzt der Indikator
zum Herunterfahren der Anwendungen. Es ist somit an dieser Stelle zwingend erforderlich den
aktuellen Status der Anwendung zu speichern. Problematisch ist hierbei, dass ebenfalls nur ein
Persnliche Ausfertigung fr Martin Martinsson
269
Kapitel 6
Computerneustarts im Installationsprozess
begrenzter Zeitraum von 5 Sekunden zur Verfgung steht, in dem der Status gespeichert werden muss.
Nach Ablauf dieser Zeitspanne wird die Anwendung beendet. Hierbei ist es unerheblich, ob die
Speicherung des Status abgeschlossen wurde oder nicht. Es kann somit mitunter effektiver sein eine
automatische Speicherung des Status periodisch durchzufhren. Nach dem Speichern der
Statusinformationen muss die Anwendung noch fr den automatischen Neustart registriert werden.
Hierzu ist die Funktion RegisterApplicationRestart() zu verwenden. Dieser Funktion kann eine
Befehlszeile bergeben werden, die wiederum beim Starten der Anwendung durch den NeustartManager verwendet wird. Schlielich sendet der Neustart-Manager noch die Fenstermeldung
WM_CLOSE, um auch Anwendungen zu beenden, die bisher nicht beendet wurden (LegacyApplikationen).
Listing 6.61 zeigt eine einfache Windows-Anwendung, die Implementierungen fr die Verwendung
des Neustart-Managers enthlt. Hierbei wird die Methode wndProc() berschrieben, so dass auf die
einzelnen
Nachrichten
reagiert
werden
kann.
Beim
Empfangen
der
Meldung
WM_QUERYENDSESSION wird als Ergebnis ein von IntPtr.Zero abweichender Wert zurckgeben,
um dem Neustart-Manager zu signalisieren, dass diese Anwendung fr den Neustart vorbereitet ist.
Beim
Empfangen
der
Fenstermeldung
WM_ENDSESSION
und
dem
Parameter
ENDSESSION_CLOSEAPP werden die Daten der verwendeten RichTextBox in einer temporren Datei
gespeichert. Anschlieend wird die Anwendung fr den automatischen Neustart registriert, wobei die
beim Neustart zu verwendenden Befehlszeilenparameter angegeben werden.
protected override void WndProc(ref Message m)
{
switch (m.Msg)
{
case Win32.WM_QUERYENDSESSION:
if (m.LParam.ToInt32() == Win32.ENDSESSION_CLOSEAPP)
{
// Falls Neustart untersttzt werden soll
m.Result = new IntPtr(1);
}
break;
case Win32.WM_ENDSESSION:
if (m.LParam.ToInt32() == Win32.ENDSESSION_CLOSEAPP)
{
// Prfen ob Daten vorhanden sind und ggf. speichern
if (this.richTextBox1.Text.Length > 0)
this.SaveData();
// Registrieren fr den Neustart
Win32.RegisterApplicationRestart(this.commandLineParameter, 0);
}
break;
default:
base.WndProc(ref m);
break;
}
}
270
271
Kapitel 6
Computerneustarts im Installationsprozess
StartSession() returned 0
SUCCESS: StartSession()
Session Key: e5979c37583dd44096891a574cee9164
Registering file
RegisterResources() returned 0
SUCCESS: RegisterResources()
Getting affected apps.
RmGetList() needs 1 structs, reboot reasons 0, returned 0xea
SUCCESS: Allocating RM_PROCESS_INFO array
SUCCESS: GetAffectedApps()
My PID: 3876, Affected Apps: 1, needed 1, reboot reasons 0
PID(1:852, type 1, stat 1) - Microsoft Office Word ()
Shuting down applications
SUCCESS: RmShutdown()
Getting affected apps.
RmGetList() needs 1 structs, reboot reasons 0, returned 0xea
SUCCESS: Allocating RM_PROCESS_INFO array
SUCCESS: GetAffectedApps()
My PID: 3876, Affected Apps: 1, needed 1, reboot reasons 0
PID(1:852, type 1, stat 2) - Microsoft Office Word ()
Restarting Applications
SUCCESS: RmRestart()
Getting affected apps.
RmGetList() needs 1 structs, reboot reasons 0, returned 0xea
SUCCESS: Allocating RM_PROCESS_INFO array
SUCCESS: GetAffectedApps()
My PID: 3876, Affected Apps: 1, needed 1, reboot reasons 0
PID(1:4172, type 1, stat 11) - Microsoft Office Word ()
Ending Session
EndSession() returned 0
SUCCESS: EndSession()
Listing 6.62: Neustarten einer Anwendung mit den Microsoft Logo Testing Tools for Windows
Die bisherigen Erluterungen und Beispiele bezogen sich ausschlielich auf Windows-Anwendungen.
Das Zusammenspiel zwischen dem Neustart-Manager und den Betriebssystemdiensten, sowie den
Konsolenanwendungen funktioniert leicht abweichend, so dass andere Implementierungen im
Anwendungsdesign zu bercksichtigen sind. Zum Beenden von Konsolenanwendungen sendet der
Neustart-Manger das CTRL_SHUTDOWN_EVENT Signal, so dass die mit SetConsoleCtrlHandler()
definierte Handler-Routine die Statusspeicherung veranlassen sollte. Das Beenden und Starten der
Betriebssystemdienste wird durch den Dienststeuerungs-Manager (Service Control Manager) oder kurz
SCM veranlasst. Dieser sendet nach Veranlassung durch den Neustart-Manger die jeweiligen Stoppund Start-Befehle an den entsprechenden Dienst. Falls der Dienst im Host Prozess fr Windows
Dienste (svchost.exe) ausgefhrt wird, muss er so registriert werden, dass die Objektbibliotheken
automatisch beim Beenden entladen werden. Hierzu ist der Registrierungseintrag
des
Schlssel
ServiceDllUnloadOnStop
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\<Dienst>\Parameters auf den Wert
1 zu setzen.
Windows Installer
In den bisherigen Ausfhrungen dieses Kapitels wurden die beiden Mechanismen vorgestellt, mit
deren Hilfe die Probleme mit bereits verwendeten Dateien verringert werden sollen. Die als Files-InUse-, oder auch Legacy-Mechanismus bezeichnete Vorgehensweise ist hierbei das ltere Modell, dass
hervorragend bei Prozessen funktioniert, die ein sichtbares Fenster besitzen und vom Benutzer beendet
werden knnen. Der modernere Mechanismus, der als Neustart-Manager bezeichnet wird, geht einen
Schritt weiter, denn dieser bercksichtigt auch die folgenden Anwendungsarten:
Betriebssystemdienste
Anwendungen fr den Systeminfobereich (System Tray Applications)
Anwendungen, die ber kein sichtbares Fenster verfgen
Dieser Algorithmus ist jedoch nicht nur auf die Erkennung verwendeter Dateien beschrnkt, sondern
stellt noch eine Vielzahl von Funktionen zur Verfgung, mit denen die Notwendigkeit eines
Computerneustarts reduziert werden kann. Das wird ermglicht, durch die folgenden Aktivitten:
Herunterfahren aller ausgewhlten Anwendungen, Dienste und Prozesse.
Automatischer Neustart dieser Anwendungen, Dienste und Prozesse. Hierbei wird der Status
hergestellt, der vor dem Herunterfahren existierte.
Die Mglichkeit mehrere Neustart-Manger Sitzungen zu verknpfen und somit das Herunterfahren
der Anwendungen oder einen Computerneustart ber mehrere Installationen zusammenzufassen.
Es wird deutlich, dass der Neustart-Manager die effizientere Methode zur Adressierung des Problems
darstellt. Es stellt sich nun die Frage, welcher Algorithmus wird in welchem Fall verwendet.
nicht
die
durch
die Eigenschaft
Systemrichtlinie
Der Dialog MsiRMFilesInUse ist im Installationspaket vorhanden, falls die Installation unter
Verwendung der vollstndigen oder reduzierten Benutzeroberflche ausgefhrt wird.
Alle Aufrufe vom Windows Installer zum Neustart-Manager waren erfolgreich.
Eine ganz entscheidende Rolle im Interaktionsmechanismus zwischen dem Windows Installer und dem
Persnliche Ausfertigung fr Martin Martinsson
273
Kapitel 6
Computerneustarts im Installationsprozess
Neustart-Manager spielt der neu geschaffene Dialog MsiRMFilesInUse. Hierbei handelt es sich um
eine fr den Neustart-Manager optimierte Fassung des alt bekannten Dialoges FilesInUse, wie dieses
auch Abbildung 6.55 zeigt.
Abbildung 6.55: Darstellung der Dialoge FilesInUse und MsiRmFilesInUse unter Verwendung der
vollstndigen Oberflche.
In diesem Dialog werden alle Prozesse angezeigt werden, die derzeitig Dateien verwenden, die
whrend des Installationsprozesses berschrieben oder gelscht werden mssen. Hierbei ist es
unerheblich, ob es sich bei den Prozessen um klassische Windows-Anwendungen,
Betriebssystemdienste oder andere Anwendungen handelt. Der Benutzer kann in diesem Dialog nun
auswhlen ob die Anwendungen automatisch geschlossen und wieder gestartet werden sollen, oder ob
die Anwendungen geffnet bleiben sollen, wodurch zwangslufig ein Computerneustart erforderlich
wird. Wird vom Anwender die Option zum automatischen beenden und starten der Anwendungen
gewhlt, muss dieses dem Windows Installer-Service mitgeteilt werden. Zu diesem Zweck steht das
neue Ereignis RMShutdownAndRestart zur Verfgung, dass durch die Besttigungsschaltflche des
Dialoges ausgelst wird. Listing 6.63 zeigt die Definition dieses Dialogs im Windows Installer-XML
Format. Es ist erkennbar, dass dieses Ereignis mit einer Bedingung verknpft ist. Die Bedingung
wiederum ist das Ergebnis der RadioButtonGroup, mit deren Hilfe der Benutzer bestimmen kann ob
die Anwendungen beendet werden sollen oder nicht. Bei der Bedingung ist weiterhin zu erkennen, dass
die Tilde dort dem Vergleichsoperator vorangestellt wird. Hierdurch wird ein Zeichenfolgenvergleich
durchgefhrt, bei dem die Gro- und Kleinschreibung nicht bercksichtigt wird.
<Dialog Id="MsiRMFilesInUse" X="50" Y="50" Width="370" Height="270" Title="Setup" KeepModeless="yes">
<Control Id="OK" Type="PushButton" X="240" Y="243" Width="56" Height="17" Text="OK" Default="yes">
<Publish Event="EndDialog" Value="Return">1</Publish>
<Publish Event="RMShutdownAndRestart" Value="0">WixUIRMOption~="UseRM"</Publish>
</Control>
<Control Id="Cancel" Type="PushButton" X="304" Y="243" Width="56" Height="17" Text="Abbrechen"
Cancel="yes">
274
Die Integration des Dialogs MsiRMFilesInUse in Installationspakete hat keinen Einfluss auf die
Installation bei der Verwendung lterer Versionen des Windows Installer hat. Die Anzeige und die
Verwendung des Dialogs werden hierbei ignoriert.
Hinweis Ende
Die Existenz des Dialogs MsiRMFilesInUse im Installationspaket hat aber noch weiter gehenden
Einfluss. So wirkt sich die Existenz in einigen Fllen auf die Systemrichtlinie
DisableAutomaticApplicationShutdown und die Eigenschaft MSIRESTARTMANAGERCONTROL aus.
Beide Funktionen wurden geschaffen um manuell festzulegen, welcher Algorithmus zu verwenden ist.
Hierbei ist jedoch noch weiter zu differenzieren. Es wird unterschieden, ob der Neustart-Manager zur
Identifizierung der verwendeten Dateien benutzt werden soll und welcher Dialog zur Darstellung zu
verwenden ist. Die Richtlinie legt hierbei die Einstellung systemweit fest, die Eigenschaft fokussiert
hingegen lediglich die einzelne Installation. Das Installationsprotokoll gibt Auskunft ber die
jeweiligen Einstellungen. Wird die Nutzung des Neustart-Managers durch die Eigenschaft
MSIRESTARTMANAGERCONTROL
verhindert,
findet
sich
folgender
Eintrag
im
Installationsprotokoll.
MSI (s) (D0:04) [14:38:01:261]: RESTART MANAGER: Disabled by MSIRESTARTMANAGERCONTROL property; Windows
Installer will use the built-in FilesInUse functionality.
In beiden Fllen ist hervorragend zu erkennen, dass der Legacy-Mechanismus als Fallback verwendet
wird. Die mglichen Einstelloptionen der Eigenschaft und der Richtlinien sowie die Auswirkungen
sind in Tabelle 6.56 zusammengefasst.
Persnliche Ausfertigung fr Martin Martinsson
275
Kapitel 6
Computerneustarts im Installationsprozess
Eigenschaftswert
Einstellung der
Richtlinie
Beschreibung
0 oder Null
Disable
DisableShutDown
Wird die Installation unter Windows Vista oder Windows Server 2008 ausgefhrt und wurde der
Neustart-Manager nicht deaktiviert, verwendet der Windows Installer den Neustart-Manager zur
Ermittlung der Prozesse, die derzeitig Dateien in Benutzung halten. Kommt es hierbei zu Problemen,
in dem die Funktionsaufrufe des Windows Installer zum Neustart-Manager fehlschlagen, wird eine
aussagekrftige Meldung dem Installationsprotokoll hinzugefgt. Weiterhin kommt nun der FallbackMechanismus ins Spiel; der Windows Installer verwendet den Legacy-Mechanismus zur
Identifizierung der entsprechenden Prozesse.
Wird die Installation unter Verwendung der vollstndigen oder reduzierten Benutzeroberflche
ausgefhrt und befindet sich der Dialog MsiRMFilesInUse im Installationspaket, so wird dieser zur
Darstellung der Prozesse verwendet. Ist dieser Dialog jedoch im Paket nicht vorhanden, so wird
geprft ob der Dialog FilesInUse vorhanden ist. Im positiven Fall wird dieser Dialog zur Darstellung
der Prozesse verwendet. Ist der Dialog nicht vorhanden, wird ein Computerneustart nach der
Installation ausgefhrt. Bei Verwendung der Basis-Oberflche, werden generell nur Dialoge angezeigt,
die durch die Windows Installer-Technologie bereitgestellt werden, also nur Dialoge die sich als
Ressource in der Datei msi.dll befinden. Die Ressourcen dieser Objektbibliothek wurden mit dem
Windows Installer 4.x um den Dialog IDD_RMFILESINUSE zur Bereitstellung der Neustart-Manager
Funktionalitt ergnzt, wie er auch in Abbildung 6.56 dargestellt wird. Somit wird bei Verwendung
der Basis-Oberflche der integrierte Dialog MsiRMFilesInUse zur Darstellung der Prozesse angezeigt.
276
Bei der gerade dargestellten Verwendung der Basis-Oberflche gibt es allerdings eine Ausnahme.
Wurde diese so konfiguriert dass keine modalen Dialoge angezeigt werden, beispielsweise durch das
Befehlszeilenargument qb-, gilt das gleiche wie bei einer Installation ohne Benutzeroberflche. Es
werden keine Dialoge angezeigt, so dass die Prozesse automatisch heruntergefahren und neu gestartet
werden. Dieses Verhalten des Windows Installers lsst sich auch sehr im Installationsprotokoll
nachvollziehen, das in einem solchen Fall die folgenden Zeilen enthlt:
MSI (s) (FC:20) [12:21:19:130]: RESTART MANAGER: Will attempt to shut down and restart applications
because the UI does not display any modal dialogs.
oder
MSI (s) (DC:C8) [11:42:52:664]: RESTART MANAGER: Will attempt to shut down and restart applications
in no UI modes.
Es sei anzumerken, dass dieses Standardverhalten noch durch Eigenschaften verndert werden kann,
die an sptere Stelle erlutert werden. Es wurde aber deutlich, dass die Existenz des Dialogs
MsiRMFilesInUse und der gewhlte Darstellungsmodus einen extremen Einfluss auf die Verwendung
des Neustart-Managers ausben, wie auch Tabelle 6.57 zeigt.
Dialog MsiRMFilesInUse
vorhanden
Basis UI
277
Kapitel 6
Ohne UI
Computerneustarts im Installationsprozess
Tabelle 6.57: Interaktion zwischen dem Windows Installer und den Neustart-Manager in Abhngigkeit zur
Benutzeroberflche
Unabhngig von der Existenz des Dialogs MsiRMFilesInUse und dem gewhlten Darstellungsmodus,
lsst sich das Verhalten des Neustart-Managers noch weiter steuern. Die Eigenschaft
MSIRMSHUTDOWN ermglicht hierbei eine exaktere Steuerung des Verhaltens beim beenden oder
herunterfahren eines Prozesses, der Dateien verwendet. Die mglichen Einstellungen zeigt Tabelle
6.58. Fr die Eigenschaft MSIDISABLERMRESTART gilt nahezu das gleiche, hiermit kann hingegen
das Verhalten fr den Neustart beeinflusst werden, wie Tabelle 6.59 zeigt.
Eigenschaftswert
Beschreibung
0 oder Null
Prozesse oder Dienste, die Dateien verwenden, die vom Update betroffen sind, werden
beendet oder heruntergefahren. Dieses ist die Standardeinstellung.
Prozesse oder Dienste, die Dateien verwenden, die vom Update betroffen sind, werden
beendet, auch wenn diese nicht auf die Aufforderung des Neustart-Managers reagieren.
Prozesse oder Dienste die Dateien verwenden, die vom Update betroffen sind, werden
nur beendet oder heruntergefahren, wenn sie sich fr den Neustart registriert haben.
Falls mindestens ein Dienst oder Prozess sich hierfr nicht registriert, wird kein Dienst
oder Prozess beendet.
Das Verhalten durch die Option bedarf noch einiger Erluterungen. Grundlage sind Anwendungen, die
Dateien verwenden, die vom Update betroffen sind. Die Relevanz liegt im Anwendungsdesign bei der
Nachricht WM_QUERYENDSESSION. In der Standardeinstellung werden natrlich die Anwendungen
beendet, die diese Meldung mit True beantworten. Es werden aber auch Anwendungen beendet, die
auf diese Meldung gar nicht reagieren; also Legacy-Anwendungen. Lediglich wenn eine Anwendung
die Meldung mit False beantwortet, werden die betroffenen Anwendungen nicht beendet. Wird
allerdings die Eigenschaft MSIRMSHUTDOWN auf den Wert 1 gesetzt, werden alle Anwendungen
und Dienste beendet. Hierbei ist es unerheblich, ob es sich um Legacy-Anwendungen handelt oder um
Anwendungen fr den Neustart-Manager. Weiterhin ist es unerheblich ob diese Anwendungen die
Fenstermeldung mit True oder False beantworten. Alle Anwendungen werden hierbei beendet. Wird
die Eigenschaft hingegen auf 2 gesetzt, ist die Funktion RegisterApplicationRestart() uerst
interessant, denn nur wenn eine Anwendung sich hiermit fr den Neustart registriert hat, wird sie auch
beendet. Das Verhalten kann ber die Meldung WM_QUERYENDSESSION noch weiter verfeinert
werden. Wird diese Meldung mit False beantwortet, wird die Anwendung nicht beendet, auch wenn
sie fr den Neustart registriert wurde. Wird die Meldung hingegen mit True beantwortet oder wird
darauf gar nicht reagiert, wie es bei einer Legacy-Anwendung der Fall ist, ist nur die Registrierung
ausschlaggebend. Es sei noch anzumerken, dass hierbei das alles oder nichts Prinzip gilt. Existiert
mindestens eine Anwendung die das Beenden verhindert, wird keine betroffene Anwendung beendet
oder heruntergefahren.
Eigenschaftswert
Beschreibung
0 oder Null
278
registriert haben werden auch neu gestartet. Dieses ist die Standardeinstellung.
1
Die Prozesse, die zur Installation des Updates durch den Neustart-Manager
heruntergefahren oder beendet wurden, werden nicht neu gestartet.
Ein weiterer wichtiger Punkt bei der Interaktion zwischen dem Windows Installer und dem NeustartManager betrifft die Verwendung einer externen Benutzeroberflche. Da die Thematik der externen
Benutzeroberflche durchaus als komplex bezeichnet werden kann, ist dieser das Kapitel 9 gewidmet
in dem auch der Neustart-Manager nochmal aufgegriffen wird.
Der relevante Teil der Initialisierungsphase ist danach abgeschlossen, so dass mit der Abarbeitung der
Aktionen der Ausfhrungssequenz-Tabelle begonnen wird. Die ersten bedeutsamen Aktionen dienen
der Berechnung des Speicherbedarfs (CostInitialize, FileCost und CostFinalize). Die Bezeichnung
Costing-Actions fr diese Aktionen ist jedoch nicht sehr glcklich gewhlt, denn die Ausfhrung der
Aktionen ermittelt nicht nur den Speicherbedarf, sondern dient auch dazu, die
Installationsverzeichnisse zu bestimmen. Am Ende dieser Phase stehen somit die finalen
Installationsverzeichnisse und die zu installierenden Komponenten fest. Somit werden nun die zu
berwachenden Datei-Ressourcen an den Neustart-Manager bergeben.
Whrend der Aktion InstallValidate fordert der Windows Installer den Neustart-Manager schlielich
auf, alle Prozesse zu ermitteln die heruntergefahren werden mssen, damit die Installation ohne
Persnliche Ausfertigung fr Martin Martinsson
279
Kapitel 6
Computerneustarts im Installationsprozess
Neustart durchgefhrt werden kann. Stellt der Neustart-Manager fest, dass eine Datei durch einen
kritischen Prozess, durch den aufrufenden Prozess (Windows Installer-Client) oder durch den
Windows Installer-Dienst verwendet wird, kann der Neustart nicht verhindert werden. Dieses wird
auch im Installationsprotokoll entsprechend vermerkt.
MSI (s) (40:84) [16:16:29:541]: RESTART MANAGER: Did detect that the client process of this installation
holds file[s] in use, so a reboot will be necessary.
oder
MSI (s) (DC:9C) [13:34:18:060]: RESTART MANAGER: Did detect that a critical application holds file[s]
in use, so a reboot will be necessary.
In Abhngigkeit zur Existenz des Dialogs MsiRMFilesInUse im Installationspaket, stehen nun die
folgenden Vorgehensweisen zur Auswahl:
Die Installation wird bei Legacy-Installationspaketen, also bei Paketen ohne den Dialog
MsiRMFilesInUse, fortgesetzt.
Der Windows Installer sendet bei Installationspaketen, die den Dialog MsiRMFilesInUse enthalten,
die Meldung Setup muss Dateien oder Dienste aktualisieren, die nicht whrend der Ausfhrung
des Systems aktualisiert werden knnen. Wenn Sie den Vorgang fortsetzen, ist ein Neustart
erforderlich, um das Setup abzuschlieen mit der Fehlernummer 1610.
Im nchsten Schritt wird durch den Neustart-Manager geprft, ob auch Betriebssystemdienste
betroffen sind und somit heruntergefahren werden mssen. Hierbei ist zu beachten, dass Dienste, die
mit Hilfe der Tabellen ServiceInstall und ServiceControl verwaltet und konfiguriert werden, nicht
durch den Neustart-Manager, sondern durch den Windows Installer unter Verwendung der Aktionen
StartServices und StopServices selbst beendet und neu gestartet werden. Lediglich Dienste, die keinen
direkten Bezug zum eigentlichen Installationspaket aufweisen, werden vom Neustart-Manger gestoppt
und gestartet.
Bis zu diesem Zeitpunkt wurden vom Neustart-Manager die Betriebssystemdienste und die sonstigen
Prozesse ermittelt, die von der Installation betroffen sind und somit beendet oder heruntergefahren
werden sollten. Die Verwaltung der betroffenen Betriebssystemdienste stellt keine groe Schwierigkeit
dar, da diese in der gleichen Windows-Sitzung (Session 0) ausgefhrt werden, wie der Windows
Installer selbst. Schwieriger wird es bei den anderen Prozessen, die beispielsweise vom Benutzer direkt
gestartet wurden. Der Neustart-Manager kann den Typ der Anwendung nicht erkennen und er kann die
Anwendung nicht beenden und neu starten, da diese in einer anderen Windows-Sitzung ausgefhrt
wird. Dieses wird auch im nachfolgenden Auszug aus Installationsprotokoll sehr gut verdeutlicht. Der
Betriebssystemdienst wird eindeutig identifiziert, so dass auch der Anwendungstyp bestimmt werden
kann. Die anderen Prozesse knnen vom Server-Prozess nicht weiter analysiert werden; der
Anwendungstyp wird auf RmUnknownApp gesetzt.
MSI (s) (30:10) [12:50:39:208]: RESTART MANAGER: Detected that application with id 3200,
friendly name 'NonAdmin', of type RmUnknownApp and status 1 holds file[s] in use.
MSI (s) (30:10) [12:50:39:208]: RESTART MANAGER: Detected that application with id 1240,
friendly name 'RMEditor', of type RmUnknownApp and status 1 holds file[s] in use.
MSI (s) (30:10) [12:50:39:208]: RESTART MANAGER: Detected that application with id 3984,
friendly name 'Restart Service', service short name 'Service1', of type RmService and
status 1 holds file[s] in use.
An dieser Stelle wird nun der Client-Prozess involviert. Der Server-Prozess sendet eine Meldung zum
280
Client-Prozess und fragt nach, ob er die betroffenen Prozesse beenden oder herunterfahren kann.
Zustzlich werden auch die Informationen zu den Betriebssystemdiensten bertragen, so dass diese
vom Client im entsprechenden Dialog angezeigt werden knnen. Zur Realsierung muss der ClientProzess ebenfalls eine Neustart-Manager-Sitzung erzeugen, wie dieses auch im Installationsprotokoll
dargestellt wird. Zu beachten ist hierbei der Prfix MSI (c), der auf die Eintragungen des ClientProzesses hinweist. Es ist ebenfalls gut zu erkennen, dass der Client-Prozess nun auch den Typ der
Anwendungen bestimmen kann.
MSI (c) (3C:8C) [12:50:39:229]: RESTART MANAGER: Session opened.
MSI (c) (3C:8C) [12:50:39:235]: RESTART MANAGER: Detected that application with id 3200,
friendly name 'NonAdmin', of type RmMainWindow and status 1 holds file[s] in use.
MSI (c) (3C:8C) [12:50:39:235]: RESTART MANAGER: Detected that application with id 1240,
friendly name 'RMEditor', of type RmMainWindow and status 1 holds file[s] in use.
MSI (c) (3C:8C) [12:50:39:235]: RESTART MANAGER: Detected that application with id 3984,
friendly name 'Restart Service', service short name 'Service1', of type RmService and
status 1 holds file[s] in use.
Als nchstes wird vom Client-Prozess geprft, ob alle betroffenen Prozesse vom Neustart-Manager
beendet werden knnen. Hierzu wird der Parameter lpdwRebootReasons der Funktion RmGetList()
ausgewertet, wie das bereits an einer vorherigen Stelle beschrieben wurde. Die beiden folgenden
Szenarien werden hierbei betrachtet:
Es wurde ein Prozess ermittelt, der in einer anderen Benutzer-Sitzung ausgefhrt wird.
Es wurde festgestellt, dass unzureichende Privilegien vorhanden sind um den Prozess zu beenden.
In keinem dieser Flle kann der jeweilige Prozess beendet werden. Der Benutzer wird davon in
Kenntnis gesetzt und ebenfalls darber informiert, dass ein Neustart des Computers erforderlich ist.
Weist der Parameter lpdwRebootReasons hingegen darauf hin, dass kein Computerneustart erforderlich
ist, werden letztlich die zu beendenden Prozesse dem Benutzer angezeigt. Hierzu wird die Meldung
INSTALLMESSAGE_RMFILESINUSE an alle externen UI-Handler gesendet, soweit diese existieren
und auch die Meldung durch das Attribut INSTALLLOGMODE_RMFILESINUSE abonniert haben.
Falls das nicht der Fall ist, wird die Meldung an den internen UI-Handler weitergeleitet.
Letztlich entscheidet der Benutzer an dieser Stelle, was mit den entsprechenden Prozessen geschehen
soll. Wird hier nun der Windows Installer angewiesen, die betroffenen Prozesse zu beenden, kommt
zunchst der Server-Prozess ins Spiel. Dieser veranlasst nun den serverseitigen Neustart-Manager alle
Betriebssystemdienste zu beenden, die heruntergefahren werden mssen. Anschlieend findet wieder
ein Wechsel zum Client-Prozess statt. Hier wird nun der clientseitige Neustart-Manager angewiesen,
die von ihm zu verwaltenden Prozesse zu beenden, wie dieses auch an den beiden folgenden Zeilen des
Protokolls ersichtlich wird.
MSI (s) (30:10) [12:50:46:304]: RESTART MANAGER: Successfully shut down all applications in
the service's session that held files in use.
MSI (c) (3C:8C) [12:50:46:304]: RESTART MANAGER: Successfully shut down all applications that
held files in use.
Es bleibt noch anzumerken, dass diese standardmige Vorgehensweise zum Herunterfahren der
Prozesse durch die Eigenschaft MSIRMSHUTDOWN beeinflusst werden kann.
Der Neustart-Manager kann Prozesse nicht beenden, wenn diese nicht auf die Fenstermeldungen
WM_ENDSESSION oder WM_CLOSE reagieren oder falls es sich um einen Betriebssystemdienst
handelt und dieser nicht auf die Aufforderungen des Dienststeuerungs-Manager (SCM) reagiert. Falls
281
Kapitel 6
Computerneustarts im Installationsprozess
der Neustart-Manager mindestens einen Prozess nicht herunterfahren kann, zeigt der Windows
Installer die Meldung Setup konnte nicht alle angeforderten Anwendungen automatisch schlieen.
Stellen Sie sicher, dass die Anwendungen, in denen verwendete Dateien geffnet sind, vor dem
Fortsetzen der Installation geschlossen werden mit der Nummer 1611 an, falls das Installationspaket
den Dialog MsiRMFilesInUse enthlt. Falls kein Dialog enthalten ist, wird die Installation fortgesetzt,
wobei ein Neustart jedoch erforderlich wird.
Was jetzt noch fehlt ist der Neustart der Anwendungen. Nach Abschluss der Installation, fordert der
Server-Prozess den Neustart-Manager auf alle Betriebssystemdienste neu zu starten, die
heruntergefahren wurden. Der Client-Prozess fordert hingegen den clientseitigen Neustart-Manager auf
alle Anwendungen zu starten, die durch die Funktion RegisterApplicationRestart() fr den Neustart
registriert wurden. Anschlieend werden die Neustart-Manager-Sitzungen geschlossen.
MSI
MSI
MSI
MSI
(s) (30:20) [12:50:49:265]: RESTART MANAGER: Previously shut down applications have been restarted.
(s) (30:20) [12:50:49:265]: RESTART MANAGER: Session closed.
(c) (3C:8C) [12:50:50:753]: RESTART MANAGER: Previously shut down applications have been restarted.
(c) (3C:8C) [12:50:50:753]: RESTART MANAGER: Session closed.
Zu Beginn dieses Kapitels wurde auf die Problematik des Unterdrckens eines Computerneustarts
hingewiesen. Diese Problematik bleibt natrlich trotz Neustart-Manager bestehen; die Notwendigkeit
eines Neustarts wird hingegen hierdurch reduziert. Die Zielsetzung sollte immer in der Stabilitt der
Installation und der spteren Anwendung liegen, so dass Neustarts entsprechend zu bercksichtigen
sind. Die Eigenschaft MsiSystemRebootPending kann hier eine Hilfestellung geben, denn sie
signalisiert einen ausstehenden Neustart.
Hinweis Beginn
Die Aktionen des Neustart-Managers werden auch dem Windows-Ereignisprotokoll angefgt, so dass
dieses auch eine wertvolle Informationsquelle darstellt.
Hinweis Ende
Benutzerdefinierte Aktionen
Wie im vorherigen Abschnitt verdeutlicht, findet whrend der Costing-Phase nicht nur die finale
Bestimmung der Zielverzeichnisse statt, sondern die primre Zielsetzung dieser Phase ist die
Bestimmung des Installationsumfangs, wozu die Installationsverzeichnisse zwangslufig bentigt
werden. Zunchst wird hierbei ermittelt, welche Windows Installer-Features fr die Installation
vorgesehen wurden. Durch die Verknpfung der Windows Installer-Komponenten zu den Features
kann nun ermittelt werden, welche Komponenten letztlich von der Installation betroffen sind. Da es
sich bei den Komponenten um eine logische Gruppierung unterschiedlicher Ressourcen handelt,
knnen die einzelnen Ressourcen auch individuell betrachtet werden. An dieser Stelle sind nur DateiRessourcen von Bedeutung, die sich in Komponenten befinden, die fr die Installation vorgesehen
wurden. Die so ermittelten Datei-Ressourcen werden whrend der Costing-Phase nun zur
berwachung an den Neustart-Manager bergeben.
Aus diesem kurz gefassten Ablauf wird deutlich, dass sich die Aktivitten des Neustart-Managers
ausschlielich auf Dateien beziehen, die im Installationspaket oder detaillierter betrachtet in der
Tabelle File definiert wurden. Mitunter existieren jedoch Szenarien, in denen diese Vorgehensweise
nicht ausreichend ist. So knnen Szenarien vorhanden sein, in denen Dateien von entsprechenden
Anwendungen dynamisch erzeugt werden, wie es beispielsweise bei Konfigurationsdateien der Fall
282
sein kann. Dennoch kann es erforderlich werden, dass eine solche Datei whrend der Installation eines
Updates modifiziert werden muss, wozu eine benutzerdefinierte Aktion zu verwenden ist. Eine solche
Vorgehensweise ist zwangslufig problematisch, falls die Datei verwendet wird, so dass die
Modifikation nicht erfolgen kann. Um solche Szenarien effektiv zu lsen, kann ebenfalls der NeustartManager verwendet werden. Es ist lediglich erforderlich, die entsprechende Datei vom NeustartManager berwachen zu lassen. In diesem Fall wrde der Neustart-Manager whrend der Installation
feststellen, dass die Datei verwendet wird. Er wrde den betroffenen Prozess beenden, so dass die
Modifikationen im Rahmen der Installation erfolgen knnen. Nach dem Abschluss der Installation
wrde er den Prozess erneut starten.
Der Windows Installer enthlt in der aktuellen Version leider keine entsprechende Implementierung,
um solche Szenarien direkt umsetzen zu knnen. Es besteht allerdings die Mglichkeit, ein solches
Szenario im Rahmen einer benutzerdefinierten Aktion umzusetzen. Das entscheidende Element hierzu
ist die Eigenschaft MsiRestartManangerSessionKey. Diese Eigenschaft wird whrend der
Initialisierungsphase des Installationsprozesses erzeugt, falls die Nutzung des Neustart-Managers nicht
deaktiviert wurde. Mit Hilfe der Funktion RMJoinSession() ist es mglich, die Verbindung mit einer
existierenden Neustart-Manager-Sitzung herzustellen. In einigen Dokumentationen zum NeustartManager finden sich hierfr auch Bezeichnungen wie Primrer- und Sekundrer-Installer. Als
sekundrer Installer wird die Implementierung bezeichnet, die sich unter Verwendung der Funktion
RMJoinSession() mit einem primren Installer verbindet. Der Windows Installer ist in diesem
Zusammenhang natrlich der primre Installer, wogegen die benutzerdefinierte Aktion letztlich der
sekundre Installer ist.
Der Funktion RMJoinSession() wird einfach ausgedrckt, der Sitzungs-Schlssel des primren
Installers bergeben, der im Zusammenhang mit dem Windows Installer der Eigenschaft
MsiRestartManangerSessionKey entspricht. Wurde die Funktion erfolgreich ausgefhrt ist das
Ergebnis ein Handle fr eine Neustart-Manager-Sitzung, dass fr alle weiteren diesbezglichen
Funktionen zu verwenden ist. So kann nun die Funktion RmRegisterResources() verwendet werden,
um zustzliche Ressourcen zu registrieren. Es ist unbedingt zu beachten, dass im Rahmen der
benutzerdefinierten Aktion lediglich Einfluss auf die Registrierung der Ressourcen genommen werden
kann. So knnen ausschlielich neue Dateien registriert werden, es ist hingegen nicht mglich,
prozessbezogene Aktionen direkt zu veranlassen. Die Funktionen RmShutdownApplications(),
RmRestartApplications() und RmGetAffectedApplications() und auch RmAddFilter() und
RmRemoveFilter() drfen somit nur durch einen primren Installer verwendet werden. Nachdem alle
Aktivitten im Rahmen der benutzerdefinierten Aktion vorgenommen wurden, muss die Verbindung
zur Neustart-Manager-Sitzung auch wieder beendet werden, indem die Funktion RMEndSession()
aufgerufen wird.
Hinweis Beginn
Wird innerhalb einer benutzerdefinierten Aktion die Funktion RmJoinSession() aufgerufen, so muss
auch RmEndSession() aufgerufen werden, nachdem die Registrierung der Ressourcen abgeschlossen
wurde.
Hinweis Ende
Eine besondere Relevanz erfhrt noch die Eigenschaft MsiRestartManangerSessionKey. Wie bereits
dargestellt wird diese Eigenschaft whrend der Initialisierungsphase erzeugt. Falls der NeustartManager nicht verwendet wird und somit der Fallback-Mechanismus zum Tragen kommt, wird diese
Eigenschaft wieder gelscht. Dieses Verhalten ist unbedingt innerhalb der benutzerdefinierten Aktion
zu bercksichtigen.
283
Kapitel 6
Computerneustarts im Installationsprozess
Dieses Verhalten ist uerst sinnvoll, denn whrend der Aktion InstallValidate wird der NeustartManager vom Windows Installer bereits aufgefordert, die betroffenen Prozesse zu ermitteln. Aus
diesem Grund wrde es keinen Sinn machen, nach der Aktion InstallValidate noch zustzliche
Ressourcen zu registrieren, wozu dieser Schlssel bentigt wird. Um eine potentielle Fehlerquelle zu
vermeiden, steht die Eigenschaft nach InstallValidate nicht mehr zur Verfgung, so dass auch keine
entsprechenden Funktionen mehr ausgefhrt werden knnen. Fr eine benutzerdefinierte Aktion, die
den Neustart-Manager verwenden mchte, ergibt sich somit die Einschrnkung, dass sie vor der
Aktion InstallValidate ausgefhrt werden muss.
Nun aber genug mit der Theorie, lassen sie uns ein kurzes Beispiel konstruieren und beginnen wir
zunchst mit dem Installationspaket. Eine benutzerdefinierte Aktion sollte immer datengesteuert
ausgefhrt werden, so dass die tatschliche Implementierungslogik von den zu verwendenden
Informationen getrennt wird. Eine solche Vorgabe kann durch Tabellen realisiert werden, auf die durch
benutzerdefinierte Aktionen zugegriffen wird. Diese Vorgehensweise ermglicht eine effektive
Wiederverwendung der Programmlogik und lsst die gesamte Implementierung transparenter
erscheinen. Zur Realisierung einer solchen Vorgehensweise und somit der Trennung zwischen
Implementierung und Daten wurde dem Installationspaket die Tabelle RestartManagerFiles
hinzugefgt. Diese Tabelle enthlt die Spalten File und Path, wobei es sich bei File lediglich um die
Schlsselspalte handelt. Die Spalte Path ist hier wesentlich interessanter, denn hier werden die
vollstndigen Pfade zu den zustzlich zu registrierenden Ressourcen angegeben, wie dieses auch
Listing 6.64 zeigt:
<!--Benutzerdefinierte Tabelle zum Registrieren von Dateien-->
<CustomTable Id="RestartManagerFiles">
<Column Id ="File" Nullable="no" Category="Identifier" PrimaryKey="yes" Type="string" Width="72"/>
<Column Id ="Path" Nullable="yes" Category="Formatted" Type ="string" Width ="0" />
<!--Daten-->
<Row>
<Data Column="File">F__Data</Data>
<Data Column="Path">[INSTALLLOCATION]RMData.xml</Data>
</Row>
</CustomTable>
Nachdem die Datenbasis definiert wurde, kommen wir zur Implementierung. Diese wurde in der
Programmiersprache C# unter Verwendung der Deployment Tools Foundation erzeugt. Der Name und
somit die exportierte Funktion der benutzerdefinierten Aktion ist RegisterRestartFiles(). Nach dem
Festlegen
einiger
Konstanten
wird
zunchst
geprft,
ob
die
Eigenschaft
MsiRestartManagerSessionKey festgelegt wurde. Falls das nicht der Fall ist, werden keine weiteren
Aktivitten ausgefhrt, da der Neustart-Manager deaktiviert wurde oder nicht verfgbar ist. Wurde
hingegen diese Eigenschaft gesetzt, wird im nchsten Schritt geprft, ob die Tabelle
RestartManagerFiles im Installationspaket existiert und ob diese ber die Spalte Path verfgt. Ist das
284
der Fall wird auf die Tabelle zugegriffen und alle Eintrge werden innerhalb einer Schleife verarbeitet.
Dieses ist erforderlich, um eventuell verwendete Platzhalter oder Variablen innerhalb der Pfadangabe
durch absolute Werte zu ersetzen. Dieses erfolgt innerhalb des Programmcodes durch den Befehl
Format() des Session-Objektes. Letztlich werden alle so transformierten Dateipfade in ein Array
umgewandelt und an die Funktion RegisterFiles() ebenso bergeben wie der Inhalt der Eigenschaft
MsiRestartManagerSessionKey.
Diese Funktion ist letztlich das Herzstck der benutzerdefinierten Aktion, denn hier findet die
eigentliche Kommunikation mit dem Neustart-Manager statt. Zu Beginn wird die Funktion
RmJoinSession() aufgerufen, der der Schlssel der Neustart-Manager-Session bergeben wurde. Die
Funktion gibt ein Handle zurck, dass beim Aufruf der Funktion RmRegisterResources() verwendet
wird. Dieser Funktion wird nun das Array der Datei-Ressourcen bergeben; auf die Registrierung von
zustzlichen Prozessen und Diensten wurde hier verzichtet, so dass die betroffenen Parameter auf Null
gesetzt wurden. Als letztes wird schlielich noch RmEndSession() aufgerufen, um hiermit die
Registrierung zustzlicher Ressourcen abzuschlieen, wie dieses auch Listing 6.65 dargestellt wird.
public class CustomActions
{
// Deklarationen
[DllImport("rstrtmgr.dll", CharSet = CharSet.Unicode)]
static extern int RmJoinSession(out uint pSessionHandle, string strSessionKey);
[DllImport("rstrtmgr.dll")]
static extern int RmEndSession(uint pSessionHandle);
[DllImport("rstrtmgr.dll", CharSet = CharSet.Unicode)]
static extern int RmRegisterResources(uint pSessionHandle, UInt32 nFiles, string[] rgsFilenames,
UInt32 nApplications, object[] rgApplications, UInt32 nServices, string[] rgsServiceNames);
/// <summary>
/// Registrieren der zustzlichen Dateien fr den Neustart-Manager
/// </summary>
/// <param name="session">Referenz auf die Installations-Sitzung</param>
[CustomAction]
public static ActionResult RegisterRestartFiles(Session session)
{
// Konstante
const string tableName = "RestartManagerFiles";
const string columnName = "Path";
const string query = "SELECT Path FROM RestartManagerFiles";
try
{
// SessionKey des Neustart-Managers abrufen
string sessionKey = session["MsiRestartManagerSessionKey"];
if (!string.IsNullOrEmpty(sessionKey))
{
// Prfen ob die Tabelle vorhanden ist und ob die Spalte existiert
if (session.Database.IsColumnPersistent(tableName, columnName))
{
List<string> filePaths = new List<string>();
285
Kapitel 6
Computerneustarts im Installationsprozess
// Iteration durch alle Elemente. Hinzufgen der Dateipfade zu der Liste.
// Hierbei jedoch den Inhalt formatieren, falls Variablen in der Zeichenfolge
// verwendet wurden
foreach (string item in session.Database.ExecuteStringQuery(query))
{
string formattedPath = session.Format(item);
filePaths.Add(session.Format(item));
// Zum Protokoll hinzufgen
session.Log("File '{0}' registred for using with Restart Manager", formattedPath);
}
// Die Liste in ein Array umwandeln
string[] pathStrings = new string[filePaths.Count];
filePaths.CopyTo(pathStrings, 0);
// Dateien registrieren
CustomActions.RegisterFiles(sessionKey, pathStrings);
}
else
{
// Tabelle oder Spalte ist nicht vorhanden
session.Log("Table '{0}' or Column '{1}' is missing", tableName, columnName);
return ActionResult.NotExecuted;
}
}
else
{
// Neustart-Manager ist nicht vorhanden
session.Log("Restart Manager is not available or disabled");
return ActionResult.NotExecuted;
}
}
catch (Win32Exception ex)
{
session.Log("Win32Exception No: {0}, Description '{1}'", ex.ErrorCode, ex.Message);
}
catch (Exception ex)
{
session.Log("Exception '{1}'", ex.Message);
}
return ActionResult.Success;
}
/// <summary>
/// Registrieren der Dateien
/// </summary>
/// <param name="sessionKey">Schlssel der Neustart-Manager Sitzung</param>
/// <param name="pathStrings">Array mit den Pfaden</param>
private static void RegisterFiles(string sessionKey, string[] pathStrings)
{
uint sessionHandle;
// Mit Session verbinden
286
Was noch fehlt ist die Integration der benutzerdefinierten Aktion in das Installationspaket. Hierzu wird
zunchst die erzeugte physische Datei dem binren Datenspeicher des Paketes hinzugefgt.
Anschlieend wird die benutzerdefinierte Aktion in der Tabelle CustomAction definiert. Die
Ausfhrung erfolgt innerhalb der Tabelle InstallExecuteSeuquence, jedoch bevor die Aktion
InstallValidate ausgefhrt wird, wie auch Listing 6.66 zeigt.
<!--Definition der benutzerdefinierten Aktion-->
<Binary Id="MyCustomAction.dll" SourceFile="$(var.RestartCA.TargetDir)$(var.RestartCA.TargetName).CA.dll" />
<CustomAction Id="RegisterRestartFiles" DllEntry="RegisterRestartFiles"
BinaryKey="MyCustomAction.dll" Execute="immediate" />
<!--Einordnen der benutzerdefinierten Aktion-->
<InstallExecuteSequence>
<Custom Action="RegisterRestartFiles" Before ="InstallValidate"></Custom>
</InstallExecuteSequence>
Listing 6.66: Verwendenden der benutzerdefinierten Aktion zum Registrieren zustzlicher Ressourcen
In dem vorherigen Listing ist erkennbar, dass beim Hinzufgen der Datei zu dem binren
Datenspeicher keine absoluten Werte verwendet werden, sondern dass hier mit Variablen gearbeitet
wurde. Dieses ist mglich, da sowohl das Visual Studio-Projekt fr die benutzerdefinierte Aktion als
auch das Projekt zur Erzeugung des Installationspaketes einer Projektmappe (Solution) angehren und
die entsprechenden Referenzen definiert wurden. Den genauen Aufbau und die Verknpfungen zeigt
Abbildung 6.57.
287
Kapitel 6
Computerneustarts im Installationsprozess
Die so erzeugte benutzerdefinierte Aktion stellt einen generischen Lsungsansatz dar, zustzliche
Datei-Ressourcen vom Neustart-Manager verwalten zulassen. Dieses ist wie gesagt nur ein sehr
einfacher Lsungsansatz, aber der Fantasie sind hierbei keine Grenzen gesetzt. Diese Mglichkeit ist
nicht nur auf Datei-Ressourcen beschrnkt, auch Anforderungen zum Beenden von Prozessen und
Diensten im Installationsprozess sind hiermit einfach umsetzbar.
Problemfall Benutzerkontensteuerung
Die Benutzerkontensteuerung wurde bereits in Kapitel 5 dieses Buches detailliert erlutert. Dennoch
darf bei einer Betrachtung des Neustart-Managers diese Funktionalitt nicht auer Acht gelassen
werden, denn mitunter kann das skizzierte Neustartverhalten hierdurch beeintrchtigt werden. Der
wesentliche Problemfaktor bei dieser Betrachtung betrifft die Trennung zwischen der Benutzer- und
der Service-Sitzung.
Bei einer normalen Installation wird der Benutzer beim Wechsel zum Server-Prozess aufgefordert,
die Verwendung erhhter Privilegien zu besttigen. Ist dieses erfolgt, wird die eigentliche Installation,
also die physische Vernderung des Systems, mit den Privilegien des lokalen Systemkontos
ausgefhrt. Nun kommt an dieser Stelle der Neustart-Manager ins Spiel. Er identifiziert zunchst die
Prozesse, die derzeitig Dateien verwenden, die im Rahmen der Installation modifiziert oder entfernt
werden mssen. An spterer Stelle versucht er zustzlich, die betroffenen Prozesse zu beenden und
nach der Installation neu zu starten. Werden hierbei privilegierte Prozesse identifiziert, die in der
gleichen Windows-Sitzung ausgefhrt werden, wie der Windows Installer-Service selbst, so knnen
288
diese problemlos beendet werden. Wird hingegen ein privilegierter Prozess in der Windows-Sitzung
des Benutzers ausgefhrt, so kann dieser Prozess nicht beendet werden. Die Begrndung wurde bereits
in diesem Kapitel geliefert. Zur Identifizierung von Prozessen die in der Benutzer-Sitzung ausgefhrt
werden, wird vom Client-Prozess eine eigene Neustart-Manger-Sitzung erzeugt. Da der Client-Prozess
lediglich mit Standardbenutzer-Privilegien ausgefhrt wird, kann der Neustart-Manager ebenfalls nur
diese Privilegien fr die weiteren Aktivitten verwenden. Ist nun ein Prozess der Benutzer-Sitzung
betroffen, der privilegiert ausgefhrt wird, so kann dieser durch den nicht privilegierten NeustartManager auch nicht beendet werden. Whrend der Installation wird dem Benutzer die Meldung 1611
angezeigt, womit er auf einen erforderlichen Neustart des Computers hingewiesen wird. Diese
Informationen befinden sich natrlich auch im Installationsprotokoll.
MSI (s) (EC:14) [17:00:15:878]: RESTART MANAGER: Detected that application with id 2932,
friendly name 'NonAdmin', of type RmUnknownApp and status 1 holds file[s] in use.
MSI (s) (EC:14) [17:00:22:602]: Note: 1: 1611 2: The setup was unable to automatically close all
requested applications. Please ensure that the applications holding files in use are closed before
continuing with the installation.
MSI (s) (EC:14) [17:00:30:244]: RESTART MANAGER: The user chose to go on with the installation,
although a reboot will be required.
Die Ursache fr dieses Verhalten liegt im Sicherheitskonzept von Windows Vista und Windows Server
2008, da es nicht gestattet ist, Anmeldeinformationen (Credentials) eines privilegierten Prozesses an
einen nicht vertrauenswrdigen Client zu bermitteln. An diesem Thema wird weiterhin gearbeitet. So
ist die Bestrebung in einer zuknftigen Windows-Version, das beenden oder herunterfahren von
Prozessen ber Sitzungen hinweg zu ermglichen.
Ein etwas abweichenderes Thema in Verbindung mit der Benutzerkontensteuerung bezieht sich auf die
Anwendung von Windows Installer-Patches, die digital signiert wurden, also um die sogenannten
LUA-Patches. Der Vorteil dieser Patches liegt darin begrndet, dass bei der Anwendung auf ein
installiertes Produkt, die Verwendung erhhter Privilegien nicht explizit besttigt werden muss. Ein
problematischer Nebeneffekt, ergibt sich nun in Kombination mit den Betriebssystemdiensten und dem
Neustart-Manager. Der Server-Prozess kann in einem solchen Fall nur Betriebssystemdienste beenden
und neu starten die unter Verwendung der Tabellen ServiceInstall und ServiceControl konfiguriert
wurden. Ist es erforderlich einen Betriebssystemdienst zu beenden, der nicht Bestandteil des
Installationspaketes ist, so fehlen die erforderlichen Rechte und der Vorgang wrde fehlschlagen. In
einem solchen Fall wird dies vom Neustart-Manager festgestellt und der Benutzer ber diesen
Sachverhalt informiert. Weiterhin wird dem Benutzer mitgeteilt, dass ein Neustart des Computers
erforderlich ist, wie auch das Protokoll zeigt.
MSI (s) (70:4C) [18:26:21:148]: RESTART MANAGER: Detected that application with id 1304,
friendly name 'Restart Service', service short name 'Service1', of type RmCritical and
status 1 holds file[s] in use.
MSI (s) (70:4C) [18:26:21:148]: RESTART MANAGER: Did detect that a critical application holds
file[s] in use, so a reboot will be necessary.
Es ist erkennbar, dass die Kombination mit der Benutzerkontensteuerung durchaus zu Problemen
289
Kapitel 6
Computerneustarts im Installationsprozess
fhren kann, so dass hier auf Computerneustarts nicht verzichtet werden kann. Es sei jedoch
anzumerken, dass sowohl der Neustart-Manager als auch die Benutzerkontensteuerung sehr neue
Technologien sind, und das jede Technologie auch ber Kinderkrankheiten verfgt. Es bleibt zu
hoffen, dass diese Probleme in zuknftigen Versionen adressiert werden.
Bootstrapper
Wie bereits angedeutet, enthlt erst der Windows Installer 4.5 eine Implementierung durch die es
mglich wird, mehrere Installationspakete zusammenhngend zu installieren. Die frheren Versionen
des Installers verfgten ber einen solchen Mechanismus nicht. Zur Umsetzung solcher oder hnlich
gelagerter Szenarien wurde ein sogenannter Bootstrapper verwendet. Hierunter ist eine externe
Anwendung zu verstehen, die die Steuerung des Installationsprozesses vornimmt. Ein wesentlicher
Punkt, den diese Anwendung abdecken muss, ist die Prfung auf noch ausstehende Computerneustarts.
Zu Beginn dieses Kapitels wurde die Gefahrenquelle der nicht durchgefhrten Neustarts erlutert, so
dass die Notwendigkeit durchaus bewusst sein sollte. Im Rahmen der Neustart-Prfung und der
effektiven Vermeidung ist es mitunter auch gefordert, eine frhzeitige oder dynamische Prfung auf
verwendete Dateien zu integrieren. Bei einer solchen Umsetzung helfen der Neustart-Manager und
natrlich auch der Windows Installer weiter. Der Bootstrapper fungiert hierbei als primrer Installer.
Zur Vermeidung doppelter Aktivitten, sollte in einem solchen Szenario der Neustart-Manger fr den
Windows Installer deaktiviert werden, indem die Eigenschaft MSIRESTARTMANAGERCONTROL
entsprechend zu verwenden ist. Die Implementierung innerhalb des Bootstrappers zur Verwendung des
Neustart-Managers gestaltet sich durch die folgenden Aktivitten und Vorgehensweisen:
Der Bootstrapper erzeugt eine Neustart-Manager-Sitzung, indem RMStartSession() aufgerufen
wird. Er erhlt daraufhin das Sitzungs-Handle und einen Sitzungs-Schlssel.
Im nchsten Schritt werde die zu berwachenden Ressourcen mit RmRegisterResources()
registriert. Der Neustart-Manager kann nur fr die registrierten Ressourcen ermitteln, welche
Prozesse diese derzeitig verwenden und heruntergefahren werden mssen.
Durch den Aufruf von RMGetList() werden letztlich die Prozesse ermittelt, die Dateien in
Verwendung halten. Zustzlich wird durch den Parameter pbRebootNeeded ber einen mglichen
Neustart informiert. Wird hier True zurckgegeben, so knnen nicht alle Prozesse beendet werden,
so dass ein Computerneustart erforderlich ist. Falls hier jedoch False zurckgegeben wird, kann
nun durch den Bootstrapper das Herunterfahren und Neustarten der Prozesse veranlasst werden,
indem RmShutDown() und RmRestart() aufgerufen werden.
Der Bootstrapper kann weiterhin die Liste der Prozesse, die heruntergefahren und neu gestartet
werden sollen modifizieren. Durch die Funktion RmAddFilter() knnen Prozesse von diesen
Aktivitten ausgeschlossen werden. Die Funktion RmGetFilterList() gibt die Liste der Filter zurck
und durch die Funktion RmRemoveFilter() knnen letztlich definierte Filter wieder von der Liste
entfernt werden.
Der Bootstrapper ruft schlielich RmEndSession() auf um somit die Neustart-Manager-Sitzung zu
beenden.
Der wahrscheinlich komplizierteste Punkt in diesem Szenario liegt in der Ermittlung der zu
installierenden Dateien durch den Bootstrapper. Werden durch den Bootstrapper nur Windows
Installer-Pakete installiert, ist dieses nicht ganz so schwierig. Durch den Einsatz eines Bootstrappers
wird ja die Auswahl der Installationsoptionen vorgegeben, so dass der Benutzer wenig oder gar keinen
Einfluss auf den Umfang der Installation hat. Somit knnte an dieser Stelle eine statische Liste
290
verwendet werden, in der die von der Installation betroffenen Dateien aufgefhrt werde. Es ist
natrlich auch mglich, ber die Windows Installer-Programmierschnittstelle auf die Datenbank der
Installationspakete zuzugreifen und die zu installierenden Dateien anhand der Tabellen File,
Component und Directory zu ermitteln. Wie gesagt, diese Vorgehensweisen sind nicht sonderlich
kompliziert.
Bei der Installation eines oder mehrerer Patches gestaltet sich dieses ungleich schwieriger. Denn zum
Einen ist hier die Anwendungsreihenfolge der Patches zu beachten und zum anderen muss auch der
Status und die Gltigkeit der Patches mit einbezogen werden. Der Windows Installer enthlt seit der
Version 4.0 eine neue Funktion, mit der die betroffenen Dateien beim Einspielen von Patches ermittelt
werden knnen. Der Funktion MsiGetPatchFileList() werden hierzu eine Liste von Patches und die
Referenz auf das Zielprodukt bergeben. Das Ergebnis ist die Liste der betroffenen Dateien. Unter
Verwendung der Deployment Tools Foundation existiert die Funktion GetPatchFileList() in der Klasse
Installer des Namensraums Microsoft.Deployment.WindowsInstaller. Dieser Funktion ist der
ProductCode des Produktes zu bergeben, auf das der oder die Patches angewendet werden sollen. Im
Weiteren sind der Funktion die zu berprfenden Patches zu bergeben. Das Ergebnis ist eine Liste
vom Typ IList<string>, der die absoluten Pfade zu den Dateien angefgt wurden, die von den Patches
betroffen sind. Durch Verwendung dieser Funktion wird es relativ einfach einen generischen
Bootstrapper zu entwickeln, der nicht nur Installationspakete, sondern auch Patches bercksichtigt. Die
Notwendigkeit eines solchen Bootstrappers gilt es natrlich zu prfen, da der Windows Installer 4.5
diesbezgliche Funktionalitt bereitstellt, wie spter noch zu sehen ist.
Fazit
Die Ausfhrungen dieses Kapitels sollten zu einer Sensibilisierung fr das Thema der
Computerneustarts fhren. Ein Computerneustart ist immer strend und eine Vermeidung ist immer
anzustreben. Dennoch sollte die Stabilitt des Systems und der Anwendung im Mittelpunkt stehen, so
dass eine Vermeidung von Neustarts nicht auf deren Unterdrckung abzielen sollte. Effektiver ist es
die potentiellen Ursachen fr einen Neustart frhzeitig zu erkennen und diese Klippen zu umschiffen.
Ein wirkungsvolles Hilfsmittel hierfr ist der Neustart-Manager, der mit Windows Vista und Windows
Server 2008 bereitgestellt wird. Wird der Windows Installer in der Version 4.0 und hher unter diesen
Betriebssystemen ausgefhrt, wird der Neustart-Manager zur Identifizierung bereits verwendeter
Dateien und zustzlicher Aktivitten verwendet. Hierbei werden auch unterschiedliche
Anwendungsszenarien und Benutzerprofile bercksichtigt. Ein Endbenutzer fhrt die Installation
berwiegend unter Verwendung der vollstndigen Benutzeroberflche durch. In einem solchen Fall
steht dem Benutzer nur die vollstndige Funktionalitt des Neustart-Managers zur Verfgung, wenn
der Dialog MsiRMFilesInUse im Installationspaket vorhanden ist. Dieses gilt natrlich auch, wenn der
Dialog in einer Windows Installer-Transformation bereitgestellt wird, die auf die Datenbank des
entsprechenden Paketes angewendet wird. Ist dieser Dialog nicht vorhanden, wird der Standarddialog
FilesInUse zur Prsentation der Prozesse verwenden. Der Neustart-Manager wird hierbei zur
Identifizierung der jeweiligen Prozesse, jedoch nicht zum beenden dieser Prozesse verwendet. Im
Unternehmensumfeld sieht dieses jedoch etwas anders aus, denn hier werden unterschiedliche
Darstellungsformen angewendet. Wird eine Installation unter Verwendung der Basis-Oberflche
durchgefhrt, so erhlt der Benutzer auch die Option zur Vermeidung eines Computerneustarts wenn
der Dialog MsiRMFilesInUse nicht im Paket vorhanden ist. In diesem Szenario wird der als Ressource
integrierte Dialog IDD_RMFILESINUSE verwendet. Wird die Installation im unbeaufsichtigten Modus
291
Kapitel 6
Computerneustarts im Installationsprozess
292
Windows-Ressourcenschutz
Installationsprotokoll
Mehrsprachige Benutzeroberflchen
Fazit
293
298
307
318
Die Benutzerkontensteuerung und der Neustart-Manager sind nur einige der vielen Neuerungen in
Windows Vista und Windows Server 2008. Der Neustart-Manager ermglicht ein effektiveres
Arbeiten, da hierdurch die Ausfallzeiten reduziert werden knnen, die durch Computerneustarts
verursacht werden. Im Weiteren trgt der Neustart-Manager auch zur Anwendungsstabilitt bei, da
problematischen Verhaltensweisen im Rahmen der Computerneustarts verringert oder sogar vermieden
werden knnen. Die Benutzerkontensteuerung ist im sicherheitsrelevanten Bereich anzusiedeln und
trgt somit auch zur Effizienzsteigerung bei. Hierdurch werden die Schdigungen durch bsartige
Software reduziert, wodurch zwangslufig die Systemausfallzeiten reduziert werden. Wie bereits in
den vorherigen Kapiteln erlutert, wirken sich diese Technologien direkt auf den Installationsprozess
aus, so dass beim Design des Installationspakets entsprechende Faktoren zu bercksichtigen sind.
Windows Vista und Windows Server 2008 enthalten eine weitere sicherheitsrelevante
Implementierung, die im Rahmen der Installation zu beachten ist und als Windows-Ressourcenschutz
bezeichnet wird.
Windows-Ressourcenschutz
In den Betriebssystemen Windows 2000, Windows XP und Windows Server 2003 ist ein
Mechanismus enthalten, der als Windows-Dateischutz (Windows File Protection) bezeichnet wird.
Hierdurch wird sichergestellt, dass fr das Betriebssystem relevante Dateien nicht ersetzt oder entfernt
werden knnen. Zur Realisierung wird ein Betriebssystemdienst verwendet, der entsprechende Lschoder Kopiervorgnge berwacht und bei Bedarf die Datei wieder herstellt. Problempunkte ergeben sich
bei einer Mengenoperation, also dem Lschen einer Vielzahl von Dateien. Hierbei stt der Dienst an
seine Grenzen und die Dateien knnen nicht wieder hergestellt werden. Weiterhin ist das entfernen
oder austauschen von geschtzten Dateien problemlos mglich, wenn der berwachungsmechanismus
nicht aktiv ist. Dieses ist beispielsweise der Fall, wenn das System im abgesicherten Modus gestartet
wurde.
293
Kapitel 7
Funktionsweise
Windows Vista und Windows Server 2008 enthalten einen neuen Schutzmechanismus, der als
Windows-Ressourcenschutz (Windows Ressource Protection) bezeichnet wird. Hierbei handelt es sich
um die konsequente Weiterentwicklung des Windows-Dateischutzes. Wie die Bezeichnung bereits
vermuten lsst, erstreckt sich dieser Schutzmechanismus nicht mehr nur auf Dateien, sondern schliet
auch andere Ressourcentypen mit ein. Darber hinaus wurde die Implementierung in der Form
gendert, dass auf den berwachungs-Dienst gnzlich verzichtet wurde. Die neue Implementierung
lsst ein austauschen oder entfernen der geschtzten Ressource erst gar nicht zu, was natrlich den
wesentlich sichereren und effektiveren Ansatz darstellt. Der Versuch eine Datei oder einen Schlssel
der Registrierung zu lschen wird mit den in Abbildung 7.58 dargestellten Fehlermeldungen
abgebrochen.
Die Realsierung dieser Absicherung erfolgt unter Verwendung spezieller Zugriffskontrolllisten, wie
dieses auch Abbildung 7.59 gezeigt wird. Es wird deutlich, dass nur die als TrustedInstaller
bezeichnete Benutzergruppe ber den Vollzugriff verfgt und die Datei somit ersetzen oder entfernen
knnte. Alle anderen Konten verfgen nur ber eingeschrnkte Rechte, so dass es auch dem
Systemadministrator nicht gestattet ist, die Datei zu modifizieren. Eine identische Form der
Absicherung gilt ebenfalls fr bestimmte Teile der Systemregistrierung. Dieser Schutzmechanismus
hat natrlich nicht nur die Aufgabe, das versehentliche Entfernen oder Modifizieren einer Ressource zu
verhindern. Hierdurch werden natrlich auch Viren oder andere bsartige Implementierungen daran
gehindert, sich durch das berschreiben von Systemdateien im System einzunisten.
294
Programmtechnischer Zugriff
Trotz der massiven nderungen in dem Schutzmechanismus sind existierende Anwendungen und
Persnliche Ausfertigung fr Martin Martinsson
295
Kapitel 7
Installationsprogramme weitestgehend kompatibel mit der neuen Implementierung. Das ist darauf
zurck zu fhren, dass die Programmierschnittstelle weiterhin die erforderlichen Funktionen zum
Prfen auf eine geschtzte Ressource zur Verfgung stellt und diese lediglich ergnzt. Allerdings
verhalten sich die Funktionen SfcGetFiles() und SfcGetNextProtectedFile() unter Windows Vista und
Windows Server 2008 abweichend. Das ist darauf zurckzufhren, dass der bisherige WindowsDateischutz einen Katalog verwendete, in dem alle geschtzten Dateien enthalten waren. Durch diese
Funktionen wurde auf den Katalog zugegriffen und die entsprechenden Informationen wurden ermittelt
und zurck geliefert. Beim Windows-Ressourcenschutz wird hingegen kein diesbezglicher Katalog
mehr verwendet, so dass eine entsprechende Prfung nicht mglich ist. Die erforderlichen
Informationen sind Bestandteil der Ressourcen, so dass eine berprfung immer auf Ebene der
Ressource erfolgen muss. Die dazu erforderlichen Funktionen sind in Tabelle 7.60 aufgefhrt.
Funktion
Beschreibung
Betriebssystem
SfcGetNextProtectedFile() und
SfcGetFiles()
Ermittelt
alle
geschtzten
Dateien auf dem System.
SfcIsFileProtected()
SfcIsKeyProtected()
Mit Hilfe der Funktion SfcIsFileProtected() kann geprft werden, ob eine Datei unter dem WindowsRessourcenschutz steht. Dem Funktionsaufruf ist der vollstndige Pfad zu der Datei zu bergeben, wie
dieses auch Listing 7.67 zeigt. Durch die Funktion kann relativ einfach ermittelt werden, welche
Dateien dem Windows-Ressourcenschutz unterliegen, indem rekursiv alle Dateien des Systems geprft
werden.
[DllImport("sfc.dll", CharSet=CharSet.Auto )]
private static extern bool SfcIsFileProtected(
int RpcHandle,
[MarshalAs(UnmanagedType.LPWStr)]string ProtFileName);
// Prfen, ob die Datei dem Windows-Ressourcenschutz unterliegt
internal static bool IsFileProtected(string fileName)
{
return (SfcIsFileProtected(0, fileName));
}
296
Eine nahezu identische Implementierung ist fr die Ermittlung der geschtzten Registrierungsschlssel
erforderlich. Hierfr steht die Funktion SfcIsKeyProtected() zur Verfgung, der letztlich der zu
prfende Schlssel zu bergeben ist. Wie in Listing 7.68 zu erkennen ist, kann der Bit-SpezifischeBereich der Registrierung explizit festgelegt werden. Standardmig wird von 32-Bit-Anwendungen
auf den 32-Bit-Bereich der Systemregistrierung zugegriffen und von 64-Bit-Anwendungen natrlich
auf den 64-Bit-Bereich. Allerdings kann der Funktionsaufruf so gestaltet werden, dass eine 64-BitAnwendung auch den 32-Bit-Bereich der Registrierung verwendet und umgekehrt.
[DllImport("sfc.dll", CharSet = CharSet.Auto)]
private static extern bool SfcIsKeyProtected(
int hKey, [MarshalAs(UnmanagedType.LPWStr)]
string lpSubKey,
int samDesired);
// Zugriffsoptionen
internal enum RegistryPart
{
Default = 0x0,
// Verwendet den 32-Bit-Bereich bei 32-Bit-Anwendungen
und den 64-Bit-Bereich bei 64-Bit-Anwendungen
Key64Bit = 0x100, // Verwendet den 64-Bit-Schlssel von einer 32- oder 64-Bit-Anwendung
Key32Bit = 0x200 // Verwendet den 32-Bit-Schlssel von einer 32- oder 64-Bit-Anwendung
}
// Prfen, ob der Registrierungsschlssel dem Windows-Ressourcenschutz unterliegt
internal static bool IsKeyProtected(RegistryHive rootKey, string subKey, RegistryPart part)
{
return (SfcIsKeyProtected((int)rootKey, subKey, (int)part));
}
Die Ermittlung der geschtzten Ressourcen kann im Rahmen einer eventuell beabsichtigten LogoZertifizierung uerst relevant werden. Eine diesbezgliche Richtlinie besagt, dass ein
Installationspaket nicht versuchen darf eine Ressource zu ersetzen, die durch den WindowsRessourcenschutz abgesichert ist.
Installation
Fr die Anwendungsinstallation mit dem Windows Installer bedeutet dies, dass keine Ressourcen
installiert werden knnen, die dem Windows-Ressourcenschutz unterliegen. Sollte whrend des
Installationsprozesses trotzdem versucht werden, eine so geschtzte Ressource zu berschreiben, wird
diese Aktion bersprungen und der Installationsprozess fortgesetzt. Dem Installationsprotokoll wird
eine Warnung angefgt.
MSI (s) (34:60) [17:21:21:077]: Product: Notepad. The application tried to install a more recent version of
the protected Windows file C:\Windows\system32\Notepad.exe. You may need to update your operating system
for this application to work correctly. (Package Version: 7.0.7001.18000,
Operating System Protected Version: 6.0.6001.18000).
Dieses Verhalten weicht sehr stark von dem bisherigen Verhaltensmuster beim Windows-Dateischutz
ab. Wurde hierbei versucht, eine geschtzte Datei zu berschreiben, wurde die Installation mit dem
Fehler 1931 beendet, wie auch der nachfolgende Auszug des Installationsprotokolls zeigt.
MSI (s) (30:34) [10:39:43:207]: Product: Notepad -- Error 1931. The Windows Installer service cannot update
the system file C:\WINDOWS\system32\Notepad.exe because the file is protected by Windows. You may need to
297
Kapitel 7
update your operating system for this program to work correctly. Package version: 7.0.7001.18000,
OS Protected version: 5.1.2600.2180
Auch wenn der Windows Installer nicht in der Lage ist, geschtzte Systemdateien zu ersetzen, sollten
die Installationspakete diesbezglich analysiert und korrigiert werden. Wie bereits zuvor angedeutet,
wird ein Installationspaket die Zertifizierungsrichtlinien nicht bestehen, falls es versucht, geschtzte
Systemressourcen zu ersetzen.
Installationsprotokoll
An vielen Stellen dieses Buches wurde bereits das Installationsprotokoll erwhnt und auf spezifische
Eintragungen hingewiesen. Allerdings erfolgte noch keine ausfhrliche Betrachtung des
Protokollierungsmechanismus im Rahmen der Installation. Der Windows Installer 4.0 stellt hierfr
einige neue Funktionalitten bereit, so dass die Gesamtbetrachtung an dieser Stelle folgt. Das
Windows Installer-Protokoll dient der Aufzeichnung der Ablufe im Installationsprozess und hilft
somit bei der Erstellung einer exakten Fehleranalyse. Der Inhalt des Installationsprotokolls kann durch
den Protokollierungsmodus individuell festgelegt werden. Nachdem die Protokolldatei erstellt wurde,
kann sie mit relativ einfachen Mitteln ausgewertet werden. Die Protokollierung und den Umfang der
Informationen kann auf mehrere Arten bestimmt werden:
Durch Verwenden der Befehlszeilenoptionen /log oder /l von msiexec.exe.
Durch Systemrichtlinie Logging.
Durch die Funktion MsiEnableLog() oder die Methode Installer.EnableLog().
Durch die neue Eigenschaft MsiLogging des Windows Installer 4.x.
Zur Erstellung eines Protokolls ist der Umfang der zu protokollierenden Aktivitten anzugeben, indem
entsprechende Protokollargumente zu verwenden sind. Bei diesen Protokollargumenten handelt es sich
um eine Verkettung von einzelnen Zeichen, die letztlich den Umfang des Installationsprotokolls
definieren. Tabelle 7.61 stellt die einzelnen Elemente dar, die zur Definition der Protokollargumente
verwendet werden knnen. Um smtliche Aktivitten im Installationsprozess zu protokollieren, sollte
als Wert icewarmupvxo verwendet werden.
Argument
Beschreibung
298
Eigenschaften (Properties)
Bei der Erstellung des Protokolls unter Verwendung der Befehlszeilenoptionen oder durch die
programmtechnischen Implementierungen muss der Zielort der Protokolldatei angegeben werden. Bei
den anderen Mglichkeiten wird eine Protokolldatei mit der Bezeichnung msi?????.log im Ordner
fr temporre Daten erzeugt, wobei die Fragezeichen durch einen Zufallszahl ersetzt werden.
299
Kapitel 7
Die skizzierte Mglichkeit lsst sich auch mit den vorgefertigten Dialogen von Windows InstallerXML sehr einfach umsetzen. Es ist zunchst erforderlich, das auf dem letzten Dialog bereits
vorhandene
Kontrollkstchen
zu
aktivieren.
Hierzu
ist
der
Eigenschaft
WIXUI_EXITDIALOGOPTIONALCHECKBOXTEXT die Beschreibung zuzuweisen, die auf dem
Dialog erscheinen soll. Weiterhin muss natrlich noch eine benutzerdefinierte Aktion erzeugt werden,
die letztlich fr die Anzeige des Protokolls sorgt. Die benutzerdefinierte Aktion wird durch Aktivieren
einer Schaltflche ausgefhrt, falls das Kontrollkstchen aktiviert wurde und die Eigenschaft
MsiLogFileLocation ber einen Wert verfgt. Die relevanten Codezeilen sind in Listing 7.69
aufgefhrt.
<!--Protokollierung aktivieren-->
<Property Id="MsiLogging" Value="icewarmupvxo" />
<!-- UI Definition -->
<Property Id="WIXUI_INSTALLDIR" Value="APPLICATIONFOLDER" />
<Property Id="WIXUI_EXITDIALOGOPTIONALCHECKBOXTEXT" Value="Installationsprotokoll anzeigen" />
<!--Modifikation der Benutzeroberflche-->
<UI>
<UIRef Id="WixUI_InstallDir" />
<Publish Dialog="ExitDialog" Control="Finish" Event="DoAction"
Value="ShowTheLog">WIXUI_EXITDIALOGOPTIONALCHECKBOX = 1 AND MsiLogFileLocation</Publish>
</UI>
<!--Benutzerdefinierte Aktion zum Anzeigen des Protokolls-->
<Property Id="Notepad" Value="notepad.exe"/>
<CustomAction Id="ShowTheLog" Return="asyncNoWait" Property="Notepad" ExeCommand="[MsiLogFileLocation]" />
Wie gerade dargestellt wird der Eigenschaft MsiLogFileLocation der vollstndige Pfad zu dem
erzeugten Installationsprotokoll vom Windows Installer automatisch angefgt. Hierbei ist es
unerheblich auf welche Weise die Erstellung des Protokolls veranlasst wurde. Hieraus folgt, dass
300
immer wenn ein Protokoll erzeugt wird, die Eigenschaft MsiLogFileLocation eine Referenz darauf
enthlt.
Es besteht natrlich die Mglichkeit, mehrere Optionen zur Erzeugung eines Installationsprotokolls
gleichzeitig zu verwenden. Hierbei ist zu beachten, dass immer nur ein Protokoll erzeugt wird. Die
Optionen zur Protokollerstellung werden in der nachfolgend aufgefhrten Reihenfolge geprft. Die
erste zutreffende Option gewinnt und die nachfolgenden Optionen werden ignoriert. Ist keine Option
zutreffenden, wird auch kein Protokoll erzeugt.
6. Verwenden der Befehlszeilenoptionen /log oder /l zur Definition des Protokollumfangs, oder
verwenden der programmtechnischen Mglichkeiten.
7. Definition des Protokollumfangs durch die Eigenschaft MsiLogging.
8. Definition des Protokollumfangs durch die Systemrichtlinie.
Die Erstellung eines Protokolls durch die Verwendung der Eigenschaft MsiLogging kann systemweit
deaktiviert werden. Hierzu ist die Systemrichtlinie DisableLoggingFromPackage auf 1 zu setzen,
Informationen im Protokoll
Der Umfang des Installationsprotokolls ist natrlich vom gewhlten Protokollierungsmodus abhngig.
Zur detaillierten Fehleranalyse ist in den meisten Fllen ein vollstndiges Protokoll erforderlich. Unter
Verwendung der Systemrichtlinie oder der Eigenschaft MsiLogging kann ein solches Protokoll durch
Zuordnung der Zeichenfolge icewarmupvo erstellt werden. Erfolgt die Aktivierung ber die
Befehlszeile, so kann diese Zeichenfolge dem Argument /l angefgt werden. Alternativ kann auch
der Platzhalter verwendet werden, so dass das Argument /l*v synonym zu verwenden ist. Bei dem
gerade dargestellten Protokollmodus wurde auf die Ausgabe zustzlicher Debugging-Informationen
verzichtet, da die Vielzahl dieser Informationen nicht gerade zur bersichtlichkeit beitrgt. Allerdings
existieren durchaus Anwendungsflle in denen diese Informationen sehr hilfreich sind, wie
beispielsweise bei der Verwendung von Windows Installer-Patches. Unabhngig ob die zustzlichen
Debugging-Informationen ausgegeben werden oder nicht, die nachfolgenden Angaben sind in einem
vollstndigen Protokoll enthalten.
Fehler die whrend der Installation auftreten, einschlielich aller Windows Installer-Meldungen die
einen Benutzerdialog erzeugen.
Standardaktionen und benutzerdefinierte Aktionen.
Ist ein Neustart des Systems erforderlich oder wurde er bereits durchgefhrt.
Abschlieende Werte der Windows Installer-Eigenschaften.
Die Position der Installationsquellen.
Wurde die Installation durch den Benutzer abgebrochen.
An welcher Stelle eine Installation fehlgeschlagen ist.
Ob eine fehlerhafte Installation zurckgesetzt (Rollback) wurde.
Wie bereits in Kapitel 1 verdeutlicht, wird die Installation durch zwei Prozesse realisiert. Das
Installationsprotokoll stellt die Informationen beider Prozesse dar. Eine Aktion, die innerhalb des
Client-Prozesses ausgefhrt wird, ist im Installationsprotokoll durch (c) gekennzeichnet.
MSI (c) (E0:2C) [17:26:22:777]: Machine policy value 'DisableUserInstalls' is 0
301
Kapitel 7
Der generelle Aufbau einer Eintragung im Installationsprotokoll beginnt immer mit dem Prfix MSI,
der gefolgt wird von der Kennzeichnung des Prozesses (c) oder (s). Im Anschluss werden die
Identifikationsmerkmale des Prozesses und des Threads angefgt, von dem diese Eintragung erzeugt
wurde. Bei der Eintragung des Client-Prozesses aus dem Beispiel, reprsentiert E0 den Prozess und
2C den Thread. Hierbei ist allerdings zu beachten, dass nur die letzten beiden Stellen der IDs (Hex)
dargestellt werden. Im Folgenden wird fr jede Aktion ein Zeitstempel (TimeStamp) angefgt, der aus
den Elementen [Stunde:Minute:Sekunde:Ticks] zusammengesetzt ist. Der Doppelpunkt (:) trennt die
Metadaten von der eigentlichen Beschreibung der Aktion. Alle Werte die dem Doppelpunkt folgen,
beschreiben die durchgefhrte Aktion. Der Aufbau ist immer von der jeweiligen Aktion abhngig.
Die Protokollierung beginnt zunchst mit allgemeinen Informationen ber das Datum der Installation,
der Version des Windows Installers, eine Referenz auf das zu installierende Produkt und zustzliche
Argumente, die der Befehlszeile bergeben wurden.
=== Verbose logging started: 08.09.2008 17:26:22 Build type: SHIP UNICODE 4.05.6001.00
C:\WINDOWS\system32\msiexec.exe ===
MSI (c) (E0:2C) [17:26:22:771]: Resetting cached policy values
MSI (c) (E0:2C) [17:26:22:771]: Machine policy value 'Debug' is 0
MSI (c) (E0:2C) [17:26:22:771]: ******* RunEngine:
******* Product: D:\Setup\Football.msi
******* Action:
******* CommandLine: TRANSFORMS="Goal01.mst" MSINEWINSTANCE=1
Calling process:
Dem Installationsprotokoll werden anschlieend die Aktionen des Client-Prozesses angefgt. Hierbei
handelt es sich hauptschlich um Informationen, die die Interaktion des Benutzers mit dem Windows
Installer beschreiben.
MSI (c) (E0:2C) [17:26:22:859]: PROPERTY CHANGE: Adding MsiLogFileLocation property.
Its value is 'D:\Setup\Football.msi.install.log'.
Nachdem die Benutzerinformationen gesammelt wurden, wird die Ausfhrung an den Server-Prozess
bergeben. Dieses wird durch folgende Zeile dargestellt:
MSI (c) (E0:2C) [17:26:25:664]: Switching to server: INSTALLLOCATION="C:\Program Files (x86)\Football 2008\"
TARGETDIR="F:\" CURRENTDIRECTORY="D:\Setup" CLIENTUILEVEL="0" CLIENTPROCESSID="480" USERNAME="Andreas
Kerl"
COMPANYNAME="Microsoft Deutschland GmbH" SOURCEDIR="D:\Setup\" ACTION="INSTALL" EXECUTEACTION="INSTALL"
ROOTDRIVE="F:\" INSTALLLEVEL="1" SECONDSEQUENCE="1" ADDLOCAL=Application
Der Wechsel zum Server-Prozess wird durch die Zeichenfolge Switching to server markiert. Dieser
Zeichenfolge werden alle ffentlichen Eigenschaften angefgt, die durch die Aktionen des ClientProzesses verndert wurden. Wird eine Installation mit erhhten Rechten durchgefhrt, werden nur die
als sicher erachteten ffentlichen Eigenschaften (SecureCustomProperties) bergeben. In dem ServerProzess werden die eigentlichen Installationsprozeduren, wie das Kopieren von Dateien und das
Schreiben von Eintrgen in die Systemregistrierung durchgefhrt. Als nchstes werden die
serverseitigen Initialisierungen angezeigt, bevor die eigentlichen Installationsaktionen ausgefhrt
werden. Der Aktion InstallValidate folgt ein Dump, in dem die bentigten Statusinformationen der
Features und Komponenten zusammengefasst werden.
MSI (s) (70:74) [17:26:25:782]: Doing action: InstallValidate.
302
MSI (s)
MSI (s)
MSI (s)
MSI (s)
MSI (s)
Local
(70:74)
(70:74)
(70:74)
(70:74)
(70:74)
[17:26:25:783]:
[17:26:25:783]:
[17:26:25:783]:
[17:26:25:783]:
[17:26:25:783]:
Hinweis Beginn
Bei der Komponente __C__Football.exe65 handelt es sich um ein temporres Element, dass zur
Berechnung des Speicherplatzes dient, wie dieses bereits in Kapitel 1 erlutert wurde.
Hinweis Ende
Die eigentlichen Installationsaktionen, wie das Kopieren von Dateien, werden immer durch mehrere
Eintrge dargestellt. Der Beginn der Skripterstellung ist durch die folgende Zeile dargestellt:
Action 17:26:25: GenerateScript. Generating script operations for action:
Im Anschluss werden fr jede Aktion, die im Rahmen der Skriptausfhrung verwendet werden soll,
entsprechende Eintragungen angefgt.
MSI (s) (70:74) [17:26:25:834]: Doing action: InstallFiles
Action start 17:26:25: InstallFiles.
Action ended 17:26:25: InstallFiles. Return value 1.
Wenn Aktionen ordnungsgem beendet wurden, wird fr diese Aktion der Wert 1 zurckgegeben.
In der folgenden Tabelle 7.62 sind die mglichen Rckgabewerte von Aktionen aufgefhrt.
Wert
Error Code
Beschreibung
ERROR_FUNCTION_NOT_CALLED
ERROR_SUCCESS
ERROR_INSTALL_USEREXIT
ERROR_INSTALL_FAILURE
ERROR_INSTALL_SUSPEND
Nachdem die Erstellung des Installationsskriptes abgeschlossen ist, wird das Ausfhrungsmodul
erzeugt und die Skriptausfhrung gestartet.
MSI (s) (70:74) [17:26:25:865]: Running Script: C:\Windows\Installer\MSIDBB2.tmp
Es werden nun die Aktionen des Installationsskriptes ausgefhrt. Das Ausfhren dieser
Operationsanweisungen ist im Installationsprotokoll durch die Zeichenfolge Executing op: markiert.
MSI (s) (70:74) [17:26:25:869]: Executing op: Header(Signature=1397708873,Version=405,Timestamp=958958413,
LangId=1033,Platform=0,ScriptType=1,ScriptMajorVersion=21,ScriptMinorVersion=4,ScriptAttributes=1)
MSI (s) (70:74) [17:26:25:870]: Executing op: ProductInfo(
ProductKey={B97086E8-06AB-4A78-8069-5BB33E1564C3},ProductName=Football 2008,PackageName=Football.msi,
Language=1033,Version=16777216,Assignment=1,ObsoleteArg=0,ProductIcon=I__Football.exe,,
PackageCode={CF130E25-5FED-4143-9B70-AAA03811E73C},,,InstanceType=0,LUASetting=0,
303
Kapitel 7
RemoteURTInstalls=0,ProductDeploymentFlags=3)
End abgeschlossen,
die
im
Dem Installationsprotokoll wird ein Dump aller Eigenschaften des Installationsprozesses angefgt.
Hierbei sind zunchst die Eigenschaften des Server-Prozesses und im Anschluss die Eigenschaften des
Client-Prozesses aufgefhrt. Die beschriebenen Darstellungsformen im Installationsprotokoll werden
in dieser Vollstndigkeit nur angezeigt, wenn die detaillierte Ausgabeform (Verbose) gewhlt wurde.
In Abbildung 7.61 werden der Aufbau und die Gliederung eines solchen Protokolls grafisch
dargestellt.
304
305
Kapitel 7
Error 2803: Dialog View did not find a record for the dialog LicenseAgreementDlg
Action ended 17:26:23: WelcomeDlg. Return value 3.
Wurde ein entsprechender Fehler identifiziert, sollten die Vorgnge vor dem Fehler betrachtet und
analysiert werden, da sich hier hufig die Fehlerursache befindet. Wenn mglich sollte immer ein
detailliertes Installationsprotokoll erstellt werden, da dieses viele zustzliche Informationen enthlt, die
hufig als Erklrung fr das Verhalten ausreichend sind.
MSI (s) (70:74) [17:26:25:722]: File: C:\Windows\inf\football.inf; Overwrite;
existing file is unversioned and unmodified
Es ist zu beachten, dass der Windows Installer mitunter nicht alle Fehlermeldungen protokolliert, so
dass unter Umstnden eine andere Taktik verwendet werden sollte. Die Suche nach ungewhnlichen
Unterbrechungen in der zeitlichen Abfolge der Aktionen kann hierbei weiter helfen. Mit Verwendung
des Windows Installers 3.0 und hher wird zu diesem Zweck ein Zeitstempel jeder Eintragung
vorangestellt.
In einigen Anwendungsfllen ist es erforderlich, dass der Windows Installer auf die
Originalinstallationsquellen zugreifen muss, um bestimmte Ressourcen zu extrahieren. Wird die
Installation ohne Anzeige einer Benutzeroberflche durchgefhrt und kann auf die Installationsquelle
nicht zugegriffen werden, wird die Installation beendet. Das Installationsprotokoll enthlt jedoch
Hinweise fr den Zugriff auf die Installationsquellen nach dem folgenden Schema.
MSI
MSI
MSI
MSI
MSI
MSI
(s)
(s)
(s)
(s)
(s)
(s)
(70:74)
(70:74)
(70:74)
(70:74)
(70:74)
(70:74)
[17:26:25:171]:
[17:26:25:171]:
[17:26:25:187]:
[17:26:25:187]:
[17:26:25:187]:
[17:26:25:203]:
SOURCEMGMT:
SOURCEMGMT:
SOURCEMGMT:
SOURCEMGMT:
SOURCEMGMT:
SOURCEMGMT:
Alle Informationen, die auf die Installationsquellen abzielen, sind durch die Zeichenfolge
SOURCEMGMT im Installationsprotokoll gekennzeichnet.
Vielfach stellt sich die Frage warum eine bestimmte Ressource nicht installiert wurde. Auch hierfr ist
die Analyse nicht sonderlich schwierig, da das Installationsprotokoll die erforderlichen Informationen
bereitstellt. Der erste Schritt besteht darin, den Installationserfolg der Komponente zu prfen, die die
jeweilige Ressource beinhaltet.
MSI (s) (70:74) [17:26:25:546]: Disallowing installation of component: {10048711-2C96-11D2-9A97-006097C4E452}
since the same component with higher versioned keyfile exists
Ist ein solcher Eintrag im Installationsprotokoll vorhanden, kann die Begrndung fr das Verhalten
sehr einfach abgelesen werden. Findet sich im Installationsprotokoll kein Hinweis auf die jeweilige
Komponente, muss zunchst geprft werden, ob die Komponente im Installationspaket mit einer
Bedingung versehen ist, die gegen False ausgewertet wurde. Ist dieses nicht der Fall, sollte eine
Analyse auf Ebene der Datei erfolgen, da entsprechende Dateiaktionen dem Protokoll ebenfalls
angefgt werden.
MSI (s) (70:74) [17:26:25:897]: Executing op: FileCopy(SourceName=e_5ltnaj.dll|Football.resources.dll,
SourceCabKey=F__en_Football.resources.dll,DestName=Football.resources.dll,Attributes=512,FileSize=7168,
PerTick=32768,,VerifyMedia=1,,,,,CheckCRC=0,Version=1.0.0.0,Language=0,InstallMode=58982400,,,,,,,)
MSI (s) (70:74) [17:26:25:897]: File: C:\Program Files (x86)\Football 2008\en-US\Football.resources.dll;
Won't Overwrite; Won't patch; Existing file is of an equal version
306
Wird die Installation nicht fehlerfrei beendet, so stellt sich immer die Frage nach dem Grund fr dieses
Verhalten. In den meisten Fllen findet sich der Fehler im transaktionalen Teil der Installation, also in
dem Teil, in dem das Zielsystem physisch modifiziert wird. Da die hierfr erforderlichen Aktionen im
Rahmen der Skriptverarbeitung ausgefhrt werden, ist dieses ein guter Aufhnger fr eine Analyse.
Das Installationsprotokoll sollte demzufolge nach den folgenden Informationen durchsucht werden:
InstallFinalize: Return: Kennzeichnet das Ende des Installation. Der letzte Fehler ist der Grund fr
den Abbruch (Return Code 3 bedeutet einen Fehler).
Executing op: Header (Letzte Instanz): Dieser Eintrag wird zu Beginn der Skriptausfhrung
erstellt. Die letzte Instanz dieser Eintragung kennzeichnet das Rollback-Skript. Die Aktion die zum
Rollback fhrte, befindet sich kurz vor diesem Eintrag.
Es sollte ersichtlich sein, dass die Analyse eines Fehlerprotokolls sehr aufwendig ist und ein hohes
Ma an Sachverstndnis erfordert. Bei komplexen Installationsszenarien kommt ein betrchtlicher
Umfang des Installationsprotokolls hinzu. Eine Analyse mit Notepad oder einem anderen Texteditor
erscheint ausgesprochen schwierig und resultiert in vielen Fllen in zustzlichen Fehlerquellen. Das
Windows Installer-SDK enthlt fr solche Flle ein hervorragendes Tool mit der Bezeichnung
Windows Installer Verbose Log Analyzer (wilogutl.exe). Diese Anwendung ist unentbehrlich bei der
Analyse von Protokolldateien einer Windows Installer-Installation. Es werden ausschlielich kritische
Fehler angezeigt und vielfach eine Lsung zur Abhilfe des Problems angeboten. Zustzlich existieren
weitere Tools dieser Kategorie, von denen einige in Anhang B aufgefhrt sind.
Mehrsprachige Benutzeroberflchen
Mehrsprachige Benutzeroberflchen (Multi-Lingual User Interface, MUI) sind in unterschiedlichen
Ausprgungen zu finden. So existieren Installationsprogramme, Anwendungen und schlielich auch
Betriebssysteme in sprachspezifischen Varianten. Bei Windows XP musste zunchst das
Betriebssystem auf die Verwendung unterschiedlicher Sprachen vorbereitet werden, indem das
Multilingual User Interface Pack installiert wurde. Anschlieend konnten die erforderlichen
Sprachpakete verwendet werden, um eine lokalisierte Benutzeroberflche zu gestalten. Die Ergebnisse
waren hierbei von der Wahl der Sprache abhngig. Bei einigen Sprachen war die Untersttzung
vollstndiger als bei anderen Sprachen. Ein sehr groer Nachteil ergab sich jedoch aus dem Umstand,
dass als Grundlage immer eine englische Version von Windows XP verwendet werden musste. Das
bedeutet auch, dass keine Mglichkeit bestand, ein deutsches Windows nachtrglich um die englische
Darstellung zu erweitern.
Die mehrsprachige Benutzeroberflche in den Betriebssystemen Windows Vista und Windows Server
2008 stellt einen neuen Ansatz fr Mehrsprachigkeit dar. Hierbei werden die Sprachressourcen fr die
Benutzeroberflche vom Binrcode des Betriebssystems getrennt. Diese Trennung ermglicht eine
vollstndige nderung der Sprache, ohne die Kernbinrdateien des Betriebssystems ndern oder
mehrere Sprachen auf dem gleichen Computer installieren zu mssen. Sprachen werden als
Sprachpakete angewendet, die die Ressourcen enthalten, die fr die Lokalisierung eines Teils oder der
gesamten Benutzeroberflche des Betriebssystems erforderlich sind. Alle Installationen von Windows
Vista und Windows Server 2008 enthalten mindestens ein Sprachpaket sowie die sprachneutralen
Binrdateien, aus denen das Betriebssystem besteht. Die Sprachpakete werden ber Windows-Update
angeboten und lassen sich nach der Installation ber die Regions- und Spracheinstellungen aktivieren,
Persnliche Ausfertigung fr Martin Martinsson
307
Kapitel 7
Mehrsprachige Anwendung
Im Rahmen der Anwendungsentwicklung kann sich dieser Mechanismus ebenfalls zu Nutze gemacht
werden. Bei der Verwendung von Visual Studio ist die Realsierung einer mehrsprachigen Anwendung
auf sehr einfache Weise mglich. Starten Sie hierzu Visual Studio und whlen Sie als neuen Projekttyp
die Windows Forms-Anwendung. Vergeben Sie einen Namen fr das Projekt wie beispielsweise
Football. ffnen sie die automatische generierte Datei Form1.cs im Entwurfsmodus und wechseln
Sie zum Eigenschaftenfenster. Markieren Sie die Eigenschaft Language und whlen in der Liste die
Sprache English (United States) aus. Verndern Sie nun den Titel des Dialogs Form1in Football
2008. Wechseln Sie wieder zum Eigenschaftenfenster, whlen die Sprache German (Germany) aus
und verndern sie den Titel nun in Fuball 2008. Wenn Sie nun das Projekt im ProjektmappenExplorer betrachten, erkennen Sie zustzlich generierte Ressourcen-Dateien, die letztlich die
sprachspezifischen Informationen enthalten, wie dieses auch in Abbildung 7.63 dargestellt wird.
308
11:05
<DIR>
11:05
<DIR>
11:04
<DIR>
11:04
<DIR>
11:02
1 Datei(en),
.
..
de-DE
en-US
43.520 Football.exe
43.520 Bytes
11:04
<DIR>
11:04
<DIR>
11:02
1 Datei(en),
.
..
7.680 Football.resources.dll
7.680 Bytes
11:04
<DIR>
11:04
<DIR>
11:02
1 Datei(en),
.
..
7.168 Football.resources.dll
7.168 Bytes
309
Kapitel 7
Die erzeugte Verzeichnisstruktur ist kompatibel mit den Vorgaben der mehrsprachigen
Benutzeroberflche von Windows Vista und Windows Server 2008, worauf ich an spterer Stelle noch
zurckkommen werde. Zu diesem Zeitpunkt ist bereits ein sehr schnes Ergebnis zu beobachten, denn
in Abhngigkeit zur verwendeten Anzeigesprache des Betriebssystems wird auch die Sprache der
Anwendung automatisch verndert.
Ressource-Bibliotheken
Die Erstellung eines geeigneten Installationspaketes fr die zuvor erstellte Anwendung stellt keine
besondere Herausforderung dar, da nur das Design der Ordnerstruktur beachtet werden muss. Alle
weiteren Informationen sind zunchst identisch mit einem Installationspaket einsprachiger
Anwendungen. Ich habe im letzten Satz bewusst das Wort zunchst gewhlt, denn das erzeugte
Installationspaket ist in mehrsprachigen Systemen nicht ganz perfekt. Den Problempunkt stellt die
Dateiverknpfung dar, da diese nicht sprachspezifisch erzeugt werden kann. Das bedeutet, dass
unabhngig von der verwendeten Anzeigesprache, die Bezeichnung der Dateiverknpfung identisch
bleibt. Bei einigen Anwendungen mag das kein groes Problem darstellen, da die Bezeichnung
sowieso sprachneutral gewhlt wurde. Allerdings existieren Anwendungen, bei denen das nicht
mglich ist. Darber hinaus kann eine Dateiverknpfung mit einer Beschreibung versehen werden, die
ebenfalls nicht lokalisierbar ist und somit nicht zur gewnschten Darstellung innerhalb einer
mehrsprachigen Umgebung fhrt.
Windows Vista, Windows Server 2008 und der Windows Installer 4.0 und hher enthalten neue
Implementierungen, mit denen die Verwendung lokalisierter Dateiverknpfungen ermglicht wird.
Technisch gesehen, werden die Bezeichnungen und Beschreibungen in eine Ressourcen-Bibliothek
ausgelagert und der Dateiverknpfung wird eine Referenz hierauf zugewiesen. Die RessourceBibliothek unterteilt sich wiederum in einen sprachneutralen und einen sprachspezifischen Bereich, so
dass hiermit eine lokalisierte Darstellung realisiert werden kann. Die Zuordnung zu der
Dateiverknpfung erfolgt ber die spezielle Initialisierungsdatei desktop.ini, die sich im gleichen
Verzeichnis wie die Verknpfung befindet. Im Programm-Ordner findet sich beispielsweise eine
solche Datei mit dem nachfolgenden Inhalt.
[LocalizedFileNames]
Windows Contacts.lnk=@%SystemRoot%\system32\shell32.dll,-22017
Windows Fax and Scan.lnk=@%SystemRoot%\system32\FXSRESM.dll,-114
Windows Mail.lnk=@%ProgramFiles%\Windows Mail\WinMail.exe,-225
Windows Movie Maker.lnk=@%ProgramFiles%\Movie Maker\MovieMk.dll,-61403
Windows Collaboration.lnk=@%programfiles%\Windows Collaboration\WinCollabRes.dll,-2530
Windows Live.lnk=@%SystemRoot%\explorer.exe,-6006
Windows DVD Maker.lnk=@%ProgramFiles%\Movie Maker\DVDMaker.exe,-61403
Windows Calendar.lnk=@%ProgramFiles%\Windows Calendar\wincal.exe,-200
Windows Media Player.lnk=@%systemroot%\syswow64\wmploc.dll,-102
Windows Defender.lnk=@%ProgramFiles%\Windows Defender\MsMpRes.dll,-104
Der Umfang der Datei ist natrlich von den installierten Betriebssystemkomponenten abhngig.
Erkennbar ist jedoch, dass den Dateiverknpfungen eine Binrdatei zugeordnet ist, die letztlich die
lokalisierte Bezeichnung enthlt, die durch die Ressource-ID angegeben wird. Mit dem Windows
Installer 4.0 und hher ist es fr die Betriebssysteme Windows Vista und Windows Server 2008 nun
ebenfalls mglich, lokalisierte Dateiverknpfungen zu erstellen. Zu diesem Zweck wurde die Tabelle
Shortcut um einige Spalten erweitert. Bevor ich jedoch auf das Design des Paketes eingehen werde,
gilt es zunchst die erforderliche Ressource-Bibliothek zu erstellen, in der die lokalisierten
310
Nachdem diese Vorlage im Designer in Visual Studio geffnet wurde, fgen sie eine Ressource vom
Typ Zeichenfolgentabelle (String Table) hinzu, indem sie den Menpunkt Ressource hinzufgen des
Mens Bearbeiten aktivieren. In der sich ffnenden Zeichenfolgentabelle fgen Sie einen Eintrag mit
dem Wert 101 und der Bezeichnung fr die Dateiverknpfung wie beispielsweise Fuball 2008
hinzu. Erstellen Sie einen weiteren Eintrag mit dem Wert 102 und einer Beschreibung fr die
Verknpfung. Die Darstellung der Zeichenfolgentabelle kann nun geschlossen werden. Anschlieend
ist noch eine Ressource vom Typ Version zu erstellen und diese ggf. anzupassen. Wichtig ist an dieser
Stelle, dass fr die Zeichenfolgentabelle noch die richtige Sprache gewhlt wird. Diese kann ber das
Eigenschaftsfenster erfolgen, nachdem die Ressource markiert wurde. Legen Sie als Sprache Deutsch
(Deutschland) fest und speichern Sie die Datei anschlieend. Whlen Sie hierbei den Dateityp 32Bit Ressourcendatei und verwenden sie 1031.res als Dateinamen. Wiederholen Sie die gerade
aufgefhrten Aktionen um eine weitere Ressourcendatei zu erstellen, in der die englischen Texte
enthalten sind. Die Vorgehensweise ist identisch. Es sind natrlich die entsprechend lokalisierten Texte
zu verwenden und die Sprache der Zeichenfolgentabelle ist auf Englisch (USA) festzulegen.
Speichern Sie die Datei letztlich unter der Bezeichnung 1033.res.
Im nchsten Schritt mssen aus den erzeugten Ressourcendateien, die erforderlichen
Objektbibliotheken erzeugt werden. Verwenden Sie hierzu den Microsoft Incremental Linker, der ber
die folgenden Befehlszeilen aufgerufen wird. Beachten Sie, dass sich der Linker nicht im Suchpfad
311
Kapitel 7
befindet und somit die Befehle am einfachsten innerhalb der Visual Studio 2008 Eingabeaufforderung
auszufhren sind.
link.exe 1031.res /noentry /machine:x86 /dll /out:1031.dll
link.exe 1033.res /noentry /machine:x86 /dll /out:1033.dll
Das Ergebnis sind nun zwei Ressource-Bibliotheken, die jeweils sprachspezifische Informationen
enthalten. Allerdings knnen sie fr das beabsichtigte Szenario noch nicht verwendet werden. Es ist
erforderlich sie in mehrere Dateien aufzuteilen, so dass eine sprachneutrale Datei und zwei
sprachspezifische Dateien erzeugt werden mssen. Zu diesem Zweck existiert das Tool muirct.exe,
dass Bestandteil des Windows SDKs 6.0 und hher ist.
312
In der Vorlage ist erkennbar, dass nur die Ressource #16 sprachneutral verwendet wird und das alle
anderen Ressourcen hingegen sprachspezifisch verwendet werden. Bei der Ressource #16 handelt es
sich um die Versionsinformationen, wie auch in der nachfolgenden Auflistung dargestellt wird.
CURSOR(1)
BITMAP(2)
ICON(3)
MENU(4)
DIALOG(5)
STRING(6)
FONTDIR(7)
FONT(8)
ACCELERATORS(9)
RCDATA(10)
MESSAGETABLE(11)
GROUP_CURSOR(12)
GROUP_ICON(14)
VERSION(16)
HTML(23)
Nun sind vorerst alle Informationen und Ressourcen vorhanden um eine sprachneutrale und eine
sprachspezifische Objektbibliothek zu erzeugen. Hierzu ist die folgende Befehlszeile zu verwenden, in
der die Datei mui.rcconfig die gerade erluterte Steuerdatei bezeichnet. Bei der Datei 1031.dll handelt
es sich um die bereits erzeugte Eingabedatei, die letztlich in die Dateien strings.dll und strings.dll.mui
aufgeteilt wird, wobei die letztere die sprachspezifischen Informationen enthlt.
muirct.exe -q mui.rcconfig -f 1031.dll strings.dll .\de-DE\strings.dll.mui
Es ist natrlich weiterhin erforderlich die Dateien fr die englische Sprachfassung zu erzeugen, indem
die Befehlszeile entsprechend aufgerufen wird. Die sich hieraus ergebende Problematik liegt nun im
fehlerhaften Zusammenspiel der sprachneutralen mit der sprachspezifischen Datei, da beide ber eine
Checksumme verfgen. Es ist erforderlich, dass beide Dateien ber die identische Checksumme
verfgen, was im oberen Konstrukt aus dem folgenden Grund nicht zwangslufig gegeben ist.
Im ersten Schritt werden die beiden Dateien fr die deutsche Sprachfassung generiert. Beide Dateien
verfgen ber eine identische Checksumme und knnen somit gemeinsam verwendet werden. Im
zweiten Schritt werden die Dateien fr die englische Sprachfassung generiert, wobei nur die
sprachspezifische Datei bentigt wird. Die hierbei erzeugte sprachneutrale Datei wird nicht weiter
bentigt, da die Inhalte der sprachneutralen Dateien identisch sind und nur eine Datei verwendet
werden kann. Allerdings enthalten die Dateien, die auf Basis der englischen Fassung generiert wurden
eine Checksumme, die von den anderen Checksummen abweicht und somit nicht zu dem gewnschten
Verhalten in der mehrsprachigen Oberflche fhrt.
Die Umsetzung einer funktionsfhigen Lsung ist allerdings nicht sonderlich kompliziert. Nachdem
313
Kapitel 7
die Dateien auf Basis der deutschen Sprachfassung generiert wurden, kann die generierte Checksumme
betrachtet werden, indem die folgende Befehlszeile aufgerufen wird.
muirct.exe -d strings.dll
Das Ergebnis dieses Befehlszeilenaufrufs ist eine Auflistung aller fr die Mehrsprachigkeit relevanten
Informationen der Datei strings.dll, die im nachfolgenden Listing 7.72 auch dargestellt werden.
D:\ResLibs>muirct.exe -d strings.dll
Signature
Length
RC Config Version
FileType
SystemAttributes
Service Checksum
Checksum
MainNameTypes
MainIDTypes
MuiNameTypes
MuiIDTypes
fecdfecd
c8
10000
21
0
2a078537f90dd2e4442a688fe8a56e9b
55613533024690a5e0f74b7dd5abfedb
MUI
16
MUI
6 16
Der fr die weiteren Schritte erforderliche Wert verbirgt sich hinter der Eigenschaft Checksum.
Fgen Sie diese Zeichenfolge dem Element <win32Resources/> der Steuerdatei mui.rcconfig an,
wobei als Attribut checksum zu verwenden ist. Somit muss der in Listing 7.71 dargestellte Eintrag
<win32Resources/> korrigiert werden, so dass sich die nachfolgende Darstellung ergibt.
<win32Resources fileType="Application" checksum="55613533024690a5e0f74b7dd5abfedb" >
Hiernach sind alle Vorbereitungen abgeschlossen und die Ressource-Bibliotheken knnen final durch
die folgenden Befehlszeilen erzeugt werden.
muirct.exe -q mui.rcconfig -f 1031.dll strings.dll .\de-DE\strings.dll.mui
muirct.exe -q mui.rcconfig -f 1033.dll strings.dll .\en-US\strings.dll.mui
Hierdurch wird die sprachneutrale Datei strings.dll erzeugt und in den entsprechenden
Unterverzeichnissen die sprachspezifischen Fassungen. Zu beachten ist hierbei, dass die
Unterverzeichnisse fr die Befehlszeilenaufrufe existieren mssen.
314
In der Tabelle Shortcut sind Informationen zu finden, die der Windows Installer bentigt, um
Verknpfungen auf dem Zielcomputer anzulegen. Die Struktur der Tabelle wurde mit dem Windows
Installer 4.0 um einige Spalten ergnzt, so dass sich nun der folgende Aufbau ergibt.
Spalte
Typ
Gre
Schlssel
Null
Beschreibung
Shortcut
Identifier
s72
Directory_
Identifier
s72
Name
Filename
s128
Component_
Identifier
s72
Target
Shortcut
s72
Arguments
Formatted
s255
Enthlt zustzliche
Befehlszeilenargumente.
Description
Text
s255
Hotkey
Integer
i2
Icon
Identifier
s72
IconIndex
Integer
i2
ShowCmd
Integer
i2
WkDir
Integer
s72
DisplayResourceDLL
Formatted
s100
DisplayResourceId
DoubleInteger
i4
DescriptionResourceDLL
Formatted
s100
DescriptionResourceId
DoubleInteger
i4
Verfgbar mit Windows Installer 4.0 und hher unter Windows Vista unter Windows Server 2008.
315
Kapitel 7
Zur Verwendung einer lokalisierten Bezeichnung muss der Spalte DisplayResourceDLL der
vollstndige Pfad zu der sprachneutralen Datei zugewiesen werden. Die Pfadangabe kann auch durch
das Konstrukt [#Dateischlssel] realisiert werden. Falls dieser Spalte ein gltiger Wert zugewiesen
wurde, wird der Inhalt der Spalte Name ignoriert. In diesem Fall muss der Spalte DisplayResourceId
die Kennzeichnung der zu verwendenden Ressource zugeordnet werden. Wurde der Spalte
DisplayResourceDLL hingegen kein Wert zugewiesen, wird die Spalte Name zur Bezeichnung der
Dateiverknpfung benutzt. Ein identisches Bild ergibt sich bei der Verwendung der Spalte
DescriptionResourceDLL. Die hierdurch involvierten Spalten sind DescriptionResourceId und
Description.
Hinweis Beginn
Es ist wichtig, dass die Referenz immer auf die sprachneutrale Datei gelegt wird. Diese ist virtuell mit
der sprachspezifischen Datei verknpft, so dass sie von auen betrachtet als Einheit angesehen werden.
Falls die Referenz auf eine der sprachspezifischen Dateien gesetzt wird, wird immer ein konstanter
Text verwendet, wodurch die Mehrsprachigkeit nicht umgesetzt werden kann.
Hinweis Ende
Das nachfolgende Listing 7.73 zeigt das vollstndige WXS-Dokument zur Erstellung eines
Installationspaketes, mit dem eine mehrsprachige Anwendung installiert werden kann. Weiterhin
werden in dem Listing die neuen Funktionalitten der Tabelle Shortcut dargestellt.
<?xml version="1.0" encoding="Windows-1252"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<!-- Definition des Produktes -->
<Product UpgradeCode="{6C4FA1DC-0AEF-47d7-974D-409DF1EB44F5}" Manufacturer="Microsoft Deutschland GmbH"
Language="1033" Version="1.00.0000" Name="Football 2008 (MUI)"
Id="{B97086E8-06AB-4a78-8069-5BB33E1564C3}" Codepage="1252">
<!-- Paketdefinition -->
<Package Description="Football 2008 (MUI)" Manufacturer="Andreas Kerl" InstallerVersion="400"
Platform="x86" Languages="1033" Compressed="yes" InstallPrivileges="elevated" />
<!-- Systemvoraussetzung -->
<Condition Message="This setup requires the .NET Framework. Please install the .NET Framework
and run this setup again..">MsiNetAssemblySupport</Condition>
<Condition Message="Concurrent installations are not supportet with this package.">
Not ParentProductCode</Condition>
<!--Eigenschaften-->
<Property Id="ARPPRODUCTICON" Value="I__Football.exe"/>
<Property Id="ALLUSERS" Value="1" />
<!-- Icons fr Shortcuts -->
<Icon Id="I__Football.exe" SourceFile="..\Bin\App.ico" />
<!-- Ordner, Komponenten und Ressourcen -->
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="ProgramFilesFolder">
<Directory Id="INSTALLLOCATION" Name="Football 2008 (MUI)">
<!--Anwendung-->
<Component Id="C__Football.exe" Guid="{B7D00D86-78E5-48e4-94AC-7D92D6502008}">
<File Id="F__Football.exe" Source="..\Bin\" Name="Football.exe" KeyPath="yes" DiskId="1"
316
Level="1">
317
Kapitel 7
Die fr diesen Abschnitt relevanten Elemente sind in der Komponente mit der Bezeichnung
C__Football.exe zu finden. Diese Komponente enthlt die Anwendung, die sprachneutrale Datei und
die Dateiverknpfung. Interessant sind hierbei die Definitionen der Tabelle ShortCut, die zur
Festlegung der Ressource-Dateien dienen. Hier ist erkennbar, dass die sprachneutrale Datei
F__Strings.dll sowohl fr den Namen als auch fr die Beschreibung verwendet wird. Der Name
wird letztlich durch die Ressource mit der Nummer 101 und die Beschreibung durch die 102
dargestellt. Die weiteren relevanten Elemente beziehen sich auf die sprachspezifischen Dateien, die in
den speziell bezeichneten Unterordnern abgelegt werden.
Fazit
In den vorangegangenen Kapiteln wurden die neuen Funktionalitten des Windows Installer 4.0
aufgezeigt, wobei Technologien wie die Benutzerkontensteuerung und der Neustart-Manager einen
sehr hohen Stellenwert eingenommen haben. In diesem Kapitel wurde nun die Betrachtung der neuen
Funktionalitten im Windows Installer 4.0 abgeschlossen. Die Inhalte bezogen sich hierbei nicht nur
auf ein spezifisches Thema, sondern adressierten drei vllig unterschiedliche Erweiterungen, die
weniger komplex sind, aber dennoch uerst interessante Mglichkeiten bieten.
Der Windows-Ressourcenschutz und die Verwendung der mehrsprachigen Benutzeroberflche sind
spezielle Funktionalitten, die nur unter den Betriebssystemen Windows Vista und Windows Server
2008 zur Verfgung stehen. Anders verhlt es sich mit den neuen Mglichkeiten zur Erstellung eines
Installationsprotokolls. Diese sind auch im Windows Installer 4.5 zu finden, so dass diese
Funktionalitt hierdurch auch unter Windows XP und Windows Server 2003 zur Verfgung steht.
Dieses ist absolut notwendig, denn die Erstellung von Installationsprotokollen ist eines der wichtigsten
Werkzeuge zur Analyse und Beseitigung von potentiellen Fehlerquellen und somit die Grundlage fr
optimal konzipierte Installationsprozesse. Trotz guter Analysemglichkeiten darf aber auch das Design
eines Installationspaketes nicht auer Acht gelassen werden. Gerade im Rahmen einer LogoZertifizierung mssen sehr viele Richtlinien und Vorgehensweisen beachtet werden, die letztlich das
Ziel verfolgen, ein stabiles Installationspaket zu erhalten. Auch wenn die Anforderung zur Erlangung
eines solchen Logos nicht besteht, sollte sich dennoch an den Richtlinien orientiert werden.
318
Teil C
Neue Funktionen
des Windows
Installers 4.5
319
Kapitel 8
Paketbergreifende Transaktionen
Paketbergreifende Transaktionen
320
323
334
338
345
357
366
367
Windows Installer 4.0 enthlt viele neue Erweiterungen die fast ausschlielich auf die neuen
Funktionen der Betriebssysteme Windows Vista und Windows Server 2008 abzielen. Aus diesem
Grund existiert der Windows Installer 4.0 nur fr diese Betriebssysteme; ein Redistributionspaket fr
die Betriebssysteme Windows XP und Windows Server 2003 wird es nicht geben. Das hieraus
entstandene Konstrukt ist problematisch, da eine vollstndige Migration auf dies Betriebssysteme
Windows Vista und Windows Server 2008 noch einige Jahre dauern wird. Bis zu diesem Zeitpunkt
wrden somit zwei Versionen des Windows Installers existieren, die einen abweichenden
Funktionsvorrat aufweisen. Hieraus ergeben sich zwangslufig zustzliche Aufwnde im Rahmen der
Softwareentwicklung und -Bereitstellung, da ja immer unterschiedliche Versionen zu bercksichtigen
sind. Gerade in groen IT-Umgebungen ist dieser Aufwand nicht zu unterschtzen.
Dieses ist nur ein Grund, der zur Entwicklung des Windows Installers 4.5 gefhrt hat. Der Windows
Installer 4.5 wird fr alle aktuell untersttzten Plattformen, also Windows XP, Windows Server 2003,
Windows Vista und Windows Server 2008 zur Verfgung gestellt, wodurch nur gegen eine spezifische
Version entwickelt und getestet werden muss. Die Unterschiede und fehlenden Funktionalitten in den
Betriebssystemgenerationen werden vom Windows Installer selbst behandelt. Zustzlich verfgt der
Windows Installer 4.5 noch ber neue Funktionalitten und natrlich ber fehlerbereinigte
Implementierungen.
320
Version
Anmerkungen
Paketbergreifende Transaktionen
Kapitel 8
4.5.6000.20817
4.5.6001.22159
4.5.6001.22162
Die
aktuelle
Versionsbezeichnung
des
Windows
Installers
liegt
im
Format
Major.Minor.Build.Update vor. Bei der Betrachtung der vorliegenden Versionsangaben wird
deutlich, dass es Unterschiede in den Build- und Update-Nummern gibt. Die Build-Nummer von
Windows Vista (RTM) ist 6000 und von Windows Server 2008 und Windows Vista SP1 ist es 6001.
Die Build-Nummer des Windows Installers 4.5 wurde dieser Vorgabe entsprechend bernommen. Das
Update-Feld basiert auf der Revision-Nummer des Betriebssystems. Das Redistributionspaket des
Windows Installers 4.5 kann auf unterschiedlichen Betriebssystemen installiert werden, so dass diese
Pakete auch von unterschiedlichen Softwarezweigen (Windows Servicing Branches) erzeugt werden,
die letztlich unterschiedliche Revisionsnummern aufweisen. Wichtig ist hierbei jedoch, dass die
unterschiedlichen Versionsbezeichnungen keinen Einfluss auf die Funktionalitt des Windows
Installers 4.5 haben.
Wie jede Version des Windows Installers wurde auch der Windows Installer 4.5 um neue
Funktionalitten ergnzt, bestehende Funktionalitten wurden verndert oder optimiert und
problematische Implementierungen wurden berarbeitet. Hier sei zu erwhnen, dass der Windows
Installer 4.5 auf der Version 4.0 (4.0.6001.18000) aufbaut, die mit Windows Server 2008 und
Windows Vista SP1 ausgeliefert wurde. Die in dieser Version beseitigten Probleme sind somit im
Windows Installer 4.5 ebenfalls nicht anzutreffen. Zustzlich wurden noch die folgenden Szenarien
adressiert:
Der Windows Installer-Service verfgte nicht ber das Privileg SeBackupPrivilege, so dass
Problem in benutzerdefinierten Aktionen auftraten, die dieses Privileg bentigten.
Die fehlerhafte Identifikation von Betriebssystemdiensten whrend der Aktion InstallValidate
fhrte zu unntigen Meldungen vom Typ Dateien in Verwendung in Windows Vista. Die
Ursache hierfr waren Zeichenfolgenvergleiche, bei denen die Gro- und Kleinschreibung nicht
oder nicht vollstndig bercksichtigt wurde.
Wurde ein Update deinstalliert, dass ursprnglich eine neue Komponente hinzugefgt hat, wird
diese Komponente ebenfalls deinstalliert. Dieses Verhalten tritt auch auf, wenn die Komponente
von mehreren Produkten gemeinsam verwendet wird.
Die Windows Installer-Version 4.5 wurde nicht nur zur Behebung von Bugs entwickelt, sondern
natrlich auch um neue Funktionalitten und Methoden bereit zustellen. Die folgende Auflistung zeigt
diese neu hinzugefgten oder optimierten Funktionalitten gegenber der Windows Installer Version
4.0.
Neue Funktionen
MsiBeginTransaction()
MsiEndTransaction()
MsiJoinTransaction()
321
Kapitel 8
Paketbergreifende Transaktionen
Neue Callback-Funktionen
EmbeddedUIHandler
InitializeEmbeddedUI
ShutdownEmbeddedUI
Neue Eigenschaften
MSIDISABLEEEUI
MSIUNINSTALLSUPERSEDEDCOMPONENTS
Neue Datenbanktabellen
MsiEmbeddedChainer
MsiEmbeddedUI
MsiPackageCertificate
Genderte Datenbanktabellen
In der Spalte Attributes der Tabelle Component knnen nun die Attribute
msidbComponentAttributesUninstallOnSupersedence
oder
msidbComponentAttributesShared
verwendet werden.
Die Tabelle CustomAction wurde um die Spalte ExtendedType erweitert.
Neue Benutzerdefinierte Aktionen
Die benutzerdefinierten Aktionen wurden um eine Aktion ergnzt, die bei der Deinstallation eines
Patches ausgefhrt wird (msidbCustomActionTypePatchUninstall).
Neue Systemrichtlinien
DisableSharedComponent
MsiDisableEmbeddedUI
Neue oder erweiterte berprfungsmethoden (ICE - Internal Consistency Evaluators)
ICE39 gibt eine Warnung aus, falls die Tabelle MsiPackageCertificate ber Eintrge verfgt und
das Paket als UAC-Konform eingestuft wurde.
ICE92
stellt
sicher,
dass
fr
eine
Komponente
nicht
die
Attribute
msidbComponentAttributesPermanent und msidbComponentAttributesUninstallOnSupersedence
gemeinsam verwendet werden.
ICE100 prft die ordnungsgeme Verwendung der Tabellen MsiEmbeddedUI und
MsiEmbeddedChainer.
Die dargestellten neuen Funktionalitten lassen sich thematisch gruppieren, so dass sie in den nchsten
drei Kapiteln dieses Buches betrachtet werden. Begonnen wird hierbei mit der Thematik der
paketbergreifenden Transaktionen. Im folgenden Kapitel geht es dann um externe
Benutzeroberflchen und die hierauf basierenden Neuerungen im Installer 4.5. Das abschlieende
Kapitel befasst sich allgemein ausgedrckt mit Windows Installer-Patches und hierbei mit den
Verbesserungen im Servicemodell.
322
Paketbergreifende Transaktionen
Kapitel 8
Konkurrierende Installationen
Als konkurrierende oder eingebettete Installation (Nested Installations) wird eine benutzerdefinierte
Aktion bezeichnet, die die Installation eines weiteren Windows Installer-Paketes innerhalb der
aktuellen Installationssession ausfhrt. Das Installationspaket kann hierzu als separate Datei vorliegen
oder in den Speicherbereich des primren Paket integriert werden. Es ist ebenfalls mglich, ein bereits
angekndigtes Produkt ber diesen Mechanismus zu installieren.
Eine konkurrierende Installation verwendet die identischen Einstellungen zur Darstellung der
Benutzeroberflche und fr die Protokollierung wie die Hauptinstallation. Die automatische Ermittlung
des Speicherbedarfs fr diese Installationsart ist jedoch nicht mglich. Um den Speicherbedarf
trotzdem zu bercksichtigen, ist der Bedarf der eingebetteten Installation in die Tabelle ReserveCost
der Hauptinstallation aufzunehmen. Um die eingebettete Installation auszufhren, ist eine
benutzerdefinierte
Aktion
vom
Typ
7
(msidbCustomActionTypeInstall
+
msidbCustomActionTypeBinaryData),
23
(msidbCustomActionTypeInstall
+
msidbCustomActionTypeSourceFile)
oder
39
(msidbCustomActionTypeInstall
+
msidbCustomActionTypeDirectory) zu verwenden. Diese Aktion muss zwischen den Standardaktionen
InstallInitialize und InstallFinalize der Ausfhrungssequenz aufgerufen werden. Im Rahmen der
Persnliche Ausfertigung fr Martin Martinsson
323
Kapitel 8
Paketbergreifende Transaktionen
ber die Rckgabewerte der benutzerdefinierten Aktion, kann der Installationserfolg ermittelt werden.
Wird eine benutzerdefinierte Aktion erfolgreich ausgefhrt, so wir sie im Protokoll mit dem
Rckgabewert 1 gekennzeichnet, wie dies auch im vorherigen Protokoll dargestellt wird. Weitere
interessante Eintragungen, die auf eine konkurrierende Installation hinweisen, finden sich in der
Eigenschaftsauflistung. Markant ist hierbei der verwendete Prfix Property(N), denn das N steht
fr Nested, so dass hiermit Eigenschaften der eingebetteten Installation gekennzeichnet werden. Im
Weiteren finden sich dort auch die Eigenschaften ParentProductCode und ParentOriginalDatabase,
die Informationen zu dem aufrufenden Installationspaket enthalten.
Die Verwendung von eingebetteten Installationen wird erst seit der Version 1.1 des Windows Installers
untersttzt. Der Grund hierfr liegt in der Untersttzung von Major-Upgrades seit dieser Version. Die
Deinstallation eines Produktes im Rahmen eines Major-Upgrades wird durch eine eingebettete
Installation realisiert. In einem solchen Anwendungsszenario knnen eingebettete Installationen
ausgesprochen zuverlssig verwendet werden. Von der Verwendung in anderen Szenarien muss
ausdrcklich abgeraten werden, da die folgenden Probleme einem effektiven Einsatz im produktiven
Umfeld entgegenstehen.
Die Aktualisierung von Produkten die durch konkurrierende Installationen dem System
hinzugefgt wurden, ist nicht mglich. Eine Aktualisierung ist nur durch ein Update des
Basisproduktes mglich. Windows Installer-Patches knnen ebenfalls nicht auf diese Installationen
angewendet werden.
Konkurrierende Installationen werden in den Konfigurationsdaten des Basisproduktes gespeichert.
Die Deinstallation eines Produktes, das im Rahmen einer solchen Installation dem System
hinzugefgt wurde, ist nur durch die Deinstallation des Basisproduktes mglich.
Die bedarfsgesteuerte Installation von Ressourcen des eingebetteten Paketes funktioniert nicht
zuverlssig.
Die Anzeige zur Kennzeichnung des Installationsfortschritts funktioniert nicht mit konkurrierenden
Installationen. Das bedeutet, dass die Fortschrittsanzeige whrend der eingebetteten Installation
sich nicht verndert. Erst wenn die Hauptinstallation weiter ausgefhrt wird, wird die
Fortschrittsanzeige wieder aktualisiert.
Eine konkurrierende Installation funktioniert innerhalb einer administrativen Installation nicht wie
erwartet und kann zu ernsthaften Problemen fhren. Normalerweise wird erwartet, dass in einem
solchen Szenario von der eingebetteten Installation ebenfalls ein administratives Image erzeugt
wird. Das ist nicht der Fall. Wird die benutzerdefinierte Aktion allerdings in der Tabelle
324
Paketbergreifende Transaktionen
Kapitel 8
Die Probleme und Einschrnkungen mit und durch konkurrierende Installationen berwiegen und
stehen somit im Widerspruch zu dem erwarteten Erfolg. Darber hinaus verstoen diese
Installationsarten auch gegen Best Practices und Richtlinien zur Zertifizierung der Software. Auch
wenn die Erlangung einer entsprechenden Zertifizierung nicht angestrebt wird, sollte die Qualitt des
Installationspaketes immer die hchste Prioritt aufweisen. Durch Verwendung von Szenarien und
Methoden von denen in entsprechenden Richtlinien abgeraten wird, lsst sich dieses Ziel nicht
erreichen.
Wichtig Beginn
Bei den konkurrierenden Installationen handelt es sich um eine veraltete Funktionalitt, deren
Verwendung nicht mehr empfohlen wird.
Wichtig Ende
Mergemodule
Mergemodule stellen dem Entwickler die bentigte Funktionalitt bereit, um gemeinsam verwendete
Ressourcen und Installationsprozesse zu kapseln und diese whrend des Entwicklungsprozesses in die
entsprechenden Windows Installer-Pakete zu integrieren. Zu diesem Zweck knnen individuelle
Mergemodule entwickelt oder auf bestehende Module anderer Hersteller zurckgegriffen werden. Bei
einem Mergemodul handelt es sich im Wesentlichen um eine Windows Installer-Datei, die jedoch
hinsichtlich der Implementierung eingeschrnkt ist. Mergemodule sind Hilfsmittel fr den Entwickler
und knnen somit nicht separat installiert werden, sondern stellen Informationen bereit, die zum
Zeitpunkt der Entwicklung in das Basispaket bernommen werden. Nachdem diese Informationen in
das Basispaket integriert wurden, wird das Mergemodul nicht weiter bentigt und braucht somit auch
nicht mit dem Installationspaket ausgeliefert werden. Einen schematischen Ablauf der Integration des
Mergemoduls zeigt Abbildung 8.65.
325
Kapitel 8
Paketbergreifende Transaktionen
Aus dieser grob gefassten Erluterung zu den Mergemodulen wird deutlich, dass die Umsetzung des
geforderten Szenarios auf einem vllig anderen Ansatz basiert. Bisher wurde von Mikro-Paketen
gesprochen, also um eigenstndige Installationspakete, die sequentiell dem System hinzugefgt
wurden. Auch wenn dieses im Rahmen einer konkurrierenden Installation erfolgte, handelte es sich
immer um unterschiedliche Produkte. Mit Mergemodulen ndert sich diese Vorgehensweise, denn es
handelt sich hierbei primr um Hilfsmittel fr den Entwickler von Installationspaketen, mit denen die
Implementierung von mehrfach verwendeten Komponenten vereinfacht wird. Ein Mergemodul kann
nicht direkt installiert werden, sondern muss bereits whrend des Erstellungsprozesses in die Windows
Installer-Datenbank integriert werden. Hieraus ergibt sich auch das finale Bild. Alle Komponenten
befinden sich physisch in einem Installationspaket. Es wird auch nur ein Produkt letztlich installiert
und Aktualisierungen betreffen immer dieses eine Produkt. Die Aktualisierung ist hierbei ein ganz
entscheidender Punkt, falls Mergemodule von anderen Softwareherstellern verwendet werden. Die
gravierende Problematik ergibt sich hierbei aus der Verfgbarkeit und der Aktualisierungsmglichkeit
der enthaltenen Ressourcen.
Microsoft hat frher eine Vielzahl von Technologien in Form von Mergemodulen zur Verfgung
gestellt, so auch die Microsoft SQL Server 2000 Desktop Engine (MSDE). Diese Mergemodule wurden
von vielen Softwareherstellern in das eigene Setup integriert, so dass bei der Installation der eigenen
Anwendung auch der Datenbankserver mit installiert wurde. Es ist bekannt, dass damals der SQLSlammer-Virus bestimmte Teile der MSDE angegriffen hat. Microsoft hat an dieser Stelle sehr schnell
reagiert und entsprechende Updates in Form von Windows Installer-Patches fr dieses Produkt
herausgegeben. Doch hier kam es zum gravierenden Problem. Die Patches knnen nur auf die von
Microsoft gelieferte Installation der MSDE angewendet werden die Patches konnten logischerweise
nicht auf die Produkte angewendet werden, die die MSDE mit installiert haben (integrierte
Mergemodule). Das heit der Softwarehersteller musste zunchst ein eigenes Aktualisierungspaket
326
Paketbergreifende Transaktionen
Kapitel 8
erstellen und dieses an seine Kunden verteilen. Hieraus ergaben sich die folgenden Problemfaktoren:
Es handelte sich um einen Security-Fix, der sehr schnell verteilt werden musste. Dadurch dass
der/die Softwarehersteller erst eigene Aktualisierungspakete erstellen mussten, wurde sehr viel Zeit
verloren.
Einige Softwarehersteller existierten nicht mehr, so dass keine Aktualisierungspakete erstellt und
verteilt wurden. Eine Aktualisierung der MSDE war somit nicht oder nur mit groen
Anstrengungen mglich.
Microsoft hat sich daher entschlossen keine komplexen Anwendungen mehr in Form von
Mergemodulen zur Verfgung zu stellen, sondern diese als vollstndige Installationspakete bereit zu
stellen, wie das derzeitig beispielsweise beim SQL Server 2005 Express Edition oder dem Microsoft
.NET Framework praktiziert wird.
Es sollte erkennbar sein, dass die Verwendung von Mergemodulen problematisch sein kann aber nicht
zwangslufig sein muss. Werden eigene Mergemodule entwickelt und verwendet, so ist diese
Vorgehensweise beizubehalten, da die aufgezeigten Problemflle nicht zutreffen.
Wichtig Beginn
Anwendungen sollten nicht auf Mergemodule zur Installation von Komponenten basieren, wenn der
Hersteller des verwendeten Mergemoduls und der Anwendung unterschiedlich sind.
Wichtig Ende
Bootstrapper
In den vorherigen Abschnitten wurden die konkurrierenden Installationen und die Mergemodule
hinsichtlich der Verwendung in Installationsszenarien mit Mikro-Paketen betrachtet. Die Ergebnisse
waren ernchternd, eine zufriedenstellende Lsung mit diesen Technologien ist nicht erreichbar. Die
Problematik beider Lsungsanstze lag darin, dass die installierten Produkte nicht getrennt betrachtet,
deinstalliert und aktualisiert werden knnen. Die Voraussetzung hierfr wre eine sequentielle und
unabhngige Installation der betroffenen Produkte, was allerdings mit den Bordmitteln des Windows
Installers nicht umsetzbar ist. Der Lsungsansatz muss somit auerhalb des Windows Installers
gesucht werden. An dieser Stelle gibt es eine Vielzahl von Mglichkeiten, die immer im
Zusammenhang mit der Komplexitt und dem Umfang der zu installierenden Produkte und dem
Anforderungsprofil stehen mssen. Im einfachsten Fall reicht hier eine Batch-Datei aus, die
nacheinander die einzelnen Installationen aufruft. Die Frage nach dem Erreichen des
Anforderungsprofil und letztlich der einzusetzenden Technik kann nur individuell beantwortet werden,
wobei die folgenden Fragestellungen weiterhelfen knnten:
Fr welche Technologien ist das entsprechende Know-How vorhanden oder kann sich angeeignet
werden?
Was soll mit den bereits installierten Produkten geschehen, wenn die Installation eines spteren
Produktes fehlschlgt?
Wie ist mit Computerneustarts zu verfahren?
Ist eine Logik erforderlich, die berprft, ob das jeweilige Produkt schon vorhanden ist und falls
das der Fall ist, wie damit umzugehen ist?
Unabhngig von der letztlich zu verwendenden Technologie und der tatschlichen Implementierung ist
das Ergebnis immer eine externe Anwendung, die als Bootstrapper bezeichnet wird. Die Erstellung
einer solchen Anwendung kann natrlich individuell durchgefhrt werden, was jedoch hufig sehr
Persnliche Ausfertigung fr Martin Martinsson
327
Kapitel 8
Paketbergreifende Transaktionen
aufwendig und unter Umstnden auch fehleranfllig ist. Einfacher und eleganter ist es auf bereits
bestehende Funktionalitten zurckzugreifen, wie sie von Visual Studio 2005 und 2008 zur Verfgung
gestellt werden. Hiermit ist es im Rahmen der Setup- und Bereitstellungsprojekte mglich, whrend
des Buildprozesses einen entsprechenden Bootstrapper erstellen zu lassen, wie dieses auch in
Abbildung 8.66 gezeigt wird.
Abbildung 8.66: Manuelles Erstellen eines Bootstrappers mit Visual Studio 2008
Bei der Erzeugung eines solchen Bootstrappers ber die Benutzeroberflche von Visual Studio muss
zunchst ein Setup- oder Bereitstellungsprojekt angelegt oder geffnet werden. Bei der Erstellung des
Bootstrappers wird letztlich die durch das Setup-Projekt erzeugte Windows Installer-Datei als
Anwendungsdatei verwendet. Das bedeutet, dass diese Datei gestartet wird, wenn die erforderlichen
Systemvoraussetzungen geschaffen wurden. Diese Vorgehensweise ist einfach aber mitunter nicht
zielfhrend, da vielfach bereits Installationspakete existieren, die als Anwendungsdatei zu
referenzieren sind.
Die dargestellte Implementierung lsst sich dennoch fr eigene Projekte nutzen, da die Erstellung der
Bootstrapper-Datei auch ber die Microsoft Build Engine (msbuild.exe) durchgefhrt werden kann. Ein
sehr schner Nebeneffekt wird hiermit auch noch erreicht, da die Erstellung des Bootstrappers nun im
Rahmen eines automatisierten Buildprozesses erfolgen kann. Grundlage hierfr ist eine Projektdatei, in
der die Installations- und Ausfhrungsoptionen definiert werden. Listing 8.74 zeigt eine Projektdatei,
durch die ein Bootstrapper erzeugt wird, der die Existenz des Microsoft .NET Frameworks 3.5
voraussetzt und das Windows Installer-Paket setup.msi aufruft.
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
<ItemGroup>
<BootstrapperFile Include="Microsoft.Net.Framework.3.5">
<ProductName>.NET Framework 3.5</ProductName>
</BootstrapperFile>
</ItemGroup>
328
Paketbergreifende Transaktionen
Kapitel 8
<Target Name="Bootstrapper">
<GenerateBootstrapper
ApplicationFile="Setup.msi"
ApplicationName="Colors 1.0"
BootstrapperItems="@(BootstrapperFile)"
OutputPath=".\"
ComponentsLocation="HomeSite"
Culture="de"
/>
</Target>
</Project>
In dem Listing ist sehr gut zu erkennen, dass als Installationsvoraussetzung das Microsoft .NET
Framework
3.5
festgelegt
wurde.
Interessant
ist
hierbei
die
Zeichenfolge
Microsoft.Net.Framework.3.5, die durch das Attribut Include definiert wurde. Hierbei handelt es
sich um den Produktschlssel des zu installierenden Produktes. Zum besseren Verstndnis betrachten
Sie das folgende Verzeichnis:
Visual Studio 2008: %ProgramFiles%\Microsoft SDKs\Windows\v6.0A\Bootstrapper
Visual Studio 2005: %ProgramFiles%\Microsoft Visual Studio 8\SDK\v2.0\Bootstrapper
Im Verzeichnis Packages finden Sie Unterverzeichnisse in denen sich die Installationspakete befinden,
die als Systemvoraussetzungen installiert werden knnen. In jedem dieser Unterverzeichnisse befindet
sich eine Datei mit der Bezeichnung product.xml. Diese Datei spezifiziert letztlich das zu installierende
Produkt. Enthalten sind allgemeine Informationen, Identifizierungsangaben, abhngige Produkte und
Prfroutinen zur Ermittlung ob das Produkt bereits vorhanden ist. Relevant ist zunchst das Attribut
ProductCode des Elementes Product. Hierbei handelt es sich um den Produktschlssel, der auch in der
Projektdatei zur Erzeugung des Bootstrappers zu verwenden ist. Weiterhin relevant ist das Attribut
ApplicationFile. Hiermit wird das Installationspaket oder die Anwendung definiert, die gestartet
werden soll, wenn alle erforderlichen Komponenten installiert wurden. Diese Angabe ist jedoch
optional. Es ist somit auch mglich einen Bootstrapper zu erstellen, der ausschlielich die
Systemvoraussetzungen installiert. Die Liste der mglichen Attribute der Projektdatei ist in Tabelle
8.65 zusammengefasst.
Parameter
Beschreibung
ApplicationFile
Gibt die Datei an, die der Bootstrapper aufruft, nachdem die Installation aller
Vorbedingungen abgeschlossen wurde. Ein Fehler im Buildprozess ergibt sich, wenn
weder der Parameter BootstrapperItems noch ApplicationFile angegeben wurde.
ApplicationName
Gibt den Namen der Anwendung an, die der Bootstrapper installiert. Dieser Name wird
in der Benutzeroberflche angezeigt, die der Bootstrapper whrend der Installation
verwendet.
ApplicationUrl
Gibt den Webspeicherort an, an dem sich der Installer der Anwendung befindet.
BootstrapperItems
Gibt die Produkte an, die in den Bootstrapper integriert werden sollen. Die an diesen
Parameter bergebenen Elemente sollten die folgende Syntax haben:
<BootstrapperItem
Include=ProductCode>
<ProductName>
329
Kapitel 8
Paketbergreifende Transaktionen
ProductName
</ProductName>
</BootstrapperItem>
Das Attribut Include wird verwendet, um den Namen einer Vorbedingung darzustellen,
die installiert werden sollte. Die Metadaten des Elements ProductName sind optional
und werden als benutzerfreundlicher Name fr den Fall verwendet, dass das Paket nicht
gefunden werden kann. Diese Elemente sind keine erforderlichen Eingabeparameter,
sofern ein ApplicationFile angegeben wird. Ein Fehler im Buildprozess ergibt sich,
wenn weder der Parameter BootstrapperItems noch ApplicationFile angegeben wurde.
ComponentsLocation
ComponentsUrl
Gibt die URL an, an der sich die Installationspakete der erforderlichen Komponenten
befinden.
Culture
FallbackCulture
Gibt die sekundre Kultur an, die fr die Bootstrapper-Benutzeroberflche und die
Installationsvorbedingungen verwendet werden soll.
OutputPath
Gibt den Speicherort an, an den die setup.exe und alle Paketdateien kopiert werden
sollen.
Path
SupportUrl
Gibt die URL an, die ausgegeben werden soll, wenn die Installation des Bootstrappers
fehlschlgt.
Validate
Bei True fhrt der Bootstrapper XSD-Validierung fr die angegebenen EingabeBootstrapperelemente aus. Der Standardwert dieses Parameters ist False.
In Visual Studio 2008 sind bereits einige Installationsoptionen enthalten, die mit Hilfe der
beschriebenen Vorgehensweisen als Systemvoraussetzungen verwendet werden knnen. Hierbei ist
natrlich zu beachten, dass der Umfang der Installationsoptionen von der verwendeten Edition von
Visual Studio und der Plattformarchitektur abhngig ist. Wurde Visual Studio Team System 2008 auf
einer x64 Plattform installiert sind die folgenden Installationsoptionen verfgbar.
Microsoft .NET Framework 2.0 (x86)
Microsoft .Net Framework 3.0 (x86)
Microsoft .Net Framework 3.5
330
Paketbergreifende Transaktionen
Kapitel 8
331
Kapitel 8
Paketbergreifende Transaktionen
</InstallChecks>
<Commands Reboot="Defer">
<Command PackageFile="custom.msi" EstimatedInstallSeconds="10" >
<InstallConditions>
<BypassIf Property="CustomRedistInstalled" Compare="ValueGreaterThanOrEqualTo" Value="3" />
<FailIf Property="AdminUser" Compare="ValueEqualTo" Value="False" String="AdminRequired" />
</InstallConditions>
<ExitCodes>
<ExitCode Value="0" Result="Success" />
<ExitCode Value="3010" Result="SuccessReboot" />
<DefaultExitCode Result="Fail" String="GeneralFailure" FormatMessageFromSystem="true" />
</ExitCodes>
</Command>
</Commands>
</Product>
Zunchst ist hierbei der Productcode Custom.Redist.2.0 relevant, denn dieser muss durch das
Attribut Include in der Bootstrapper-Projektdatei referenziert werden. Weiterhin ist erkennbar, dass
diese Komponente wiederum von den Komponenten Microsoft.Net.Framework.3.5 und
Microsoft.Windows.Installer.3.1 abhngig ist. Werden also in der Bootstrapper-Projektdatei diese
Abhngigkeiten nicht definiert, werden entsprechende Warnungen im Buildprozess angezeigt. uerst
interessant sind die Prfroutinen mit denen die Existenz der jeweiligen Systemvoraussetzung ermittelt
werden kann. Die berprfung kann hierzu auf Dateien, Eintrge der Systemregistrierung, installierte
Windows Installer-Produkte und Assemblies des Global Assembly Cache abzielen. Es ist ebenfalls
mglich, einen individuellen Prfalgorithmus zu verwenden, der sich dazu in einer externen Datei
befinden muss. In dem Beispiel handelt es sich um ein Windows Installer-Paket, wodurch eine
diesbezgliche berprfung am effektivsten ist. Hierzu sind der ProductCode des zu berprfenden
Produktes und eine individuelle Eigenschaft festzulegen. Durch den Bootstrapper wird letztlich die
Funktion MsiQueryProductState() fr dieses Produkt aufgerufen und das Ergebnis der definierten
Eigenschaft zugewiesen. Alle Wert <= 2 weisen hier auf einen Fehler bei der Ermittlung oder auf ein
nicht installiertes Produkt hin. In dem Manifest wurde deshalb eine berprfung auf einen Wert >= 3
durchgefhrt, so dass im positiven Fall, das Komponentenpaket vorhanden ist und nicht nochmals
installiert werden muss. Im negativen Fall ist dieses der Indikator fr den Bootstrapper, die
erforderliche Komponente zunchst zu installieren. Weiter Eintragungen im dem Produktmanifest
beziehen sich auf zustzliche Systemvoraussetzungen und auf Fehlermeldungen.
Bei der Verwendung von Visual Studio 2008 ist in das Verzeichnis %ProgramFiles%\Microsoft
SDKs\Windows\v6.0A\Bootstrapper\Packages zu wechseln und ein Unterordner beispielsweise mit der
Bezeichnung CustRedist_20 anzulegen. Bei Visual Studio 2005 ist der Ordner
%ProgramFiles%\Microsoft Visual Studio 8\SDK\v2.0\Bootstrapper\Packages\CustRedist_20
entsprechend zu verwenden. In diesen Ordner sind nun das Projektmanifest und das Installationspaket
abzulegen. Im Weiteren ist ein sprachspezifischer Unterordner anzulegen, in den das Paketmanifest
gespeichert wird. Diese Manifestdatei enthlt die lokalisierten Meldungstexte. Nun kann diese
Systemvoraussetzung in der Projektdatei des Bootstrappers referenziert und der Buildprozess gestartet
werden. Nach dem Aufruf der erzeugten setup.exe werden zunchst die Systemvoraussetzungen
geprft. Wird hier festgestellt, dass diese nicht erfllt sind, mssen sie zunchst installiert werden,
worauf der Dialog in Abbildung 8.67 hinweist.
332
Paketbergreifende Transaktionen
Kapitel 8
Der so erzeugte Bootstrapper kann in vielen, aber nicht in allen Szenarien eingesetzt werden. Zur
Installation von erforderlichen Komponenten im Rahmen des Installationsprozesses leistet er sehr gute
Dienste. Allerdings sind komplexe Installationsszenarien hiermit nicht realisierbar, da kein
transaktionales Modell mit dem Bootstrapper erreicht wird.
Tipp Beginn
Die manuelle Erzeugung einer Projektdatei fr den Bootstrapper oder die Erzeugung der Projekt- und
Paketmanifestdatei knnen mitunter sehr komplexe Formen annehmen, so dass hierzu auf verfgbare
Tools wie den Bootstrapper Manifest-Generator ausgewichen werden kann.
Tipp Ende
333
Kapitel 8
Paketbergreifende Transaktionen
Oder
=== Verbose logging started: 04.08.2008 17:01:14
Calling process: C:\Windows\Explorer.EXE ===
334
Paketbergreifende Transaktionen
Kapitel 8
Diese Austauschbarkeit des Clients ermglicht somit die Einbindung zweckgerichteter Anwendungen
und Technologien zur Durchfhrung von Installationen und Aktualisierungen auf Basis der Windows
Installer-Technologie. Prominente Beispiele fr diese Technologien sind die Software Verteilung ber
das Active Directory, Windows Update und der System Center Configuration Manager 2007.
Bei einem Chainer handelt es sich ebenfalls um eine zweckgerichtete Anwendung zur Steuerung einer
oder mehrerer Installationen. Im Vergleich zu den gerade aufgefhrten Technologien fehlt dem
Chainer der generische Ansatz, denn Chainer sind in der Regel hchst individuell aufgebaut. Das hat
damit zu tun, dass die primre Aufgabe des Chainer in der Verwaltung und Durchsetzung der
Beziehungen zwischen den einzelnen Elementen des Installationsproduktes liegt. Bildlich dargestellt
verwaltet der Chainer die Beziehungen zwischen Neutralen- und sprachspezifischen Paketen,
einzelnen Anwendungen innerhalb einer Produktsuite oder abhngigen Schichten im
Anwendungsmodell. Praktisch dargestellt wrde ein Chainer sicherstellen, dass sowohl der
sprachunabhngige Teil der Anwendung als auch der lokalisierte Teil auf dem System vorhanden sind.
Eine andere Aufgabe des Chainers knnte in der Verwaltung der Produktsuite liegen. Mgliche
Szenarien sind hierbei die Auswertung der Seriennummern und die darauf basierende
Zusammenstellung der Einzelanwendungen oder die Installation einer Trial-Version der Anwendung.
Die Zielsetzung muss jedoch nicht immer eine vollstndige Anwendung sein, sondern auch abhngige
Schichten wie beispielsweise Add-Ins knnen durch einen Chainer verwaltet werden. Durch die
Vielzahl der mglichen Installationsszenarien und der unterschiedlichen Zielsetzungen eines Chainers
knnen durchaus komplexe Implementierungsmodelle entstehen, wie auch Abbildung 8.68 zeigt.
Abbildung 8.68: Modell zur effizienten und zukunftsorientierten Aufteilung eines Produktes
Zur Darstellung der Komplexitt moderner und flexibler Anwendungsmodelle soll das in Abbildung
8.68 skizzierte Produkt dienen. Das Produkt besteht zunchst aus den beiden Anwendungen TextClient und Mail-Client. Jede dieser Anwendungen besteht aus einem sprachunabhngigen Paket
und einem lokalisierten Paket. Wie bei modernen Anwendungen blich, basieren die Anwendungen
auf einem oder mehreren Frameworks. Hierunter sind Komponenten zu verstehen, die
Basisfunktionalitten bereitstellen, die von mehreren Anwendungen verwendet werden. Auch hier gibt
es wieder sprachunabhngige und sprachspezifische Implementierungen, so dass sich die Anzahl der
erforderlichen Installationspakete vervielfacht.
Es wird aber deutlich, dass das bestehende Anwendungsmodell sehr einfach erweitert werden kann,
wobei die Ausdehnung dreidimensional erfolgt. Auf der vertikalen Ebene werden die einzelnen
Persnliche Ausfertigung fr Martin Martinsson
335
Kapitel 8
Paketbergreifende Transaktionen
336
Paketbergreifende Transaktionen
Kapitel 8
337
Kapitel 8
Paketbergreifende Transaktionen
Das skizzierte Schema stellt eine Implementierung unter Verwendung des Windows Installers 4.0 oder
einer lteren Version dar. Dieses ist daran erkennbar, dass keine paketbergreifende Transaktion
vorhanden ist und dass somit entsprechende Implementierungen manuell zu erstellen und zu
berwachen sind. Mit dem Windows Installer 4.5 ist eine solche manuelle Implementierung nicht mehr
erforderlich, da Funktionen fr paketbergreifende Transaktionen zur Verfgung gestellt werden.
Relevant ist hierbei jedoch, dass diese nicht Out-Of-The-Box funktionieren, sondern innerhalb eines
individuellen Chainers zu verwenden sind.
Transaktionen
Als Transaktion bezeichnet man in der Informatik eine feste Folge von Operationen, die als logische
Einheit betrachtet werden. Transaktionen kommen berwiegend bei Datenbanken zum Einsatz. Bei
einer Transaktion mssen entweder alle Schritte ausgefhrt werden oder keiner, da es sonst zu
Inkonsistenzen in der Datenbank kommt. Daher muss ein Datenbanksystem in der Lage sein, eventuell
Schritte rckgngig zu machen, wenn es whrend der Transaktion zu Strungen kam und nicht alle
Operationen ausgefhrt werden konnten. In Verbindung mit Transaktionen wird hufig das Akronym
ACID verwendet, wobei dieses die Eigenschaften von Transformationen beschreibt. Es steht fr
Atomaritt (atomicity), Konsistenz (consistency), Isoliertheit (isolation) und Dauerhaftigkeit
(durability). Man spricht daher im Deutschen auch von den AKID-Eigenschaften.
Atomaritt (Atomicity): Eine Transaktion wird entweder ganz oder gar nicht ausgefhrt.
Transaktionen sind also unteilbar. Wenn eine atomare Transaktion abgebrochen wird, ist das
System unverndert.
Konsistenz (Consistency): Nach Ausfhrung der Transaktion muss der Datenbestand in einer
konsistenten Form sein, wenn er es bereits zu Beginn der Transaktion war.
Isolation (Isolation): Bei gleichzeitiger Ausfhrung mehrerer Transaktionen drfen sich diese
nicht gegenseitig beeinflussen.
Dauerhaftigkeit (Durability): Das Ergebnis einer Transaktion ist dauerhaft: Die Wirkung einer
erfolgreich abgeschlossenen Transaktion bleibt dauerhaft in der Datenbank erhalten, insbesondere
338
Paketbergreifende Transaktionen
Kapitel 8
Beim Beenden der Transaktion muss letztlich festgelegt werden, ob die Transaktion erfolgreich war
oder nicht. Hierdurch ergeben sich zwei Mglichkeiten, eine Transaktion zu beenden. Im positiven Fall
wird die Transaktion erfolgreich und ohne Probleme beendet, so dass die Auswirkungen der
Transaktion auf den Datenbestand dauerhaft gespeichert werden. Das Beenden der Transaktion in
dieser Form wird auch als Commit bezeichnet. Im negativen Fall ist es beim Ausfhren einer Aktion
innerhalb der Transaktion zu Problemen gekommen, so dass die weitere Ausfhrung an dieser Stelle
beendet werden muss. Die Bedingung der Atomaritt fordert zustzlich, dass smtliche Auswirkungen
der Transaktion auf den Datenbestand rckgngig gemacht werden mssen. Das Rckgngigmachen
der Effekte einer Transaktion wird als Rollback (Zurcksetzen) bezeichnet.
339
Kapitel 8
Paketbergreifende Transaktionen
Der Windows Installer ist uerst flexibel was die Erweiterbarkeit betrifft. Diesen Erweiterungen
liegen zwangslufig bestimmte Regeln zu Grunde, die unbedingt zu beachten sind. Wird hiergegen
verstoen, kann sich dieses zwangslufig auf die Transaktionalitt auswirken.
Acquisition-Phase
Die Acquisition-Phase dient im Wesentlichen dazu, Informationen fr den Installationsprozess zu
beschaffen. Hierzu findet eine Interaktion mit der Installer-Datenbank, der Systemumgebung und dem
Benutzer statt. Diese Phase wird sowohl im Client-Prozess, als auch im Server-Prozess ausgefhrt. Das
Ergebnis der serverseitigen Acquisition-Phase ist das Installationsskript, das whrend der ExecutionPhase ausgefhrt wird. Das Ergebnis der clientseitigen Acquisition-Phase ist eine Befehlszeile, die an
den Server-Prozess bergeben wird. Wird an dieser Stelle eine MSI-Datei doppelt angeklickt, wird der
Client-Prozess gestartet und die Benutzeroberflche angezeigt. Der Benutzer kann nun innerhalb der
Benutzeroberflche die Installationsoptionen verndern. Nach Fertigstellung wird aus diesen
Einstellungen eine Befehlszeile konstruiert, die an den Server-Prozess bergeben wird. Wird hingegen
eine Installation im unbeaufsichtigten Modus gestartet, wird der Client-Prozess umgangen und es
erfolgt keine direkte Interaktion mit dem Benutzer. In diesem Fall mssen die Installationsoptionen
beim Aufruf des Installationsprozesses direkt der Befehlszeile angefgt werden.
Execution-Phase
Whrend dieser Phase wird das System physisch verndert, indem die im Installationsskript
enthaltenen Operationsanweisungen ausgefhrt werden. Bei der Ausfhrung jeder dieser
Operationsanweisungen, wird eine gegenstzliche Operation erzeugt und in das Rollbackskript
geschrieben. Alle Operationen, die nicht zurckgenommen werden knnen, werden bei der
Abarbeitung des Installationsskriptes bersprungen und dem Rollbackskript angefgt. Beispiele fr
solche
Operationen
sind
benutzerdefinierte
Aktionen
vom
Typ
Commit
(msidbCustomActionTypeInScript + msidbCustomActionTypeCommit) und auch die finalen
Operationen zur Installation von Assemblies in den Global Assembly Cache.
Die hierdurch realisierte Transaktion wird durch die Aktionen InstallInitialize und InstallFinalize
gekennzeichnet. Beim Erreichen der Aktion InstallInitialize wird zunchst mit der Erstellung eines
Installationsskriptes begonnen. Fr alle Standardaktionen, die sich zwischen InstallInitialize und
InstallFinalize befinden, werden Operationsanweisungen generiert, die in das Installationsskript
bertragen werden. Beim Erreichen der Aktion InstallFinalize wird das Installationsskript abgearbeitet.
Bei der Ausfhrung der einzelnen Operationsanweisungen werden gegenstzliche Anweisungen in das
Rollbackskript geschrieben, welches im Falle eines Installationsabbruchs, zur Rekonstruktion des
Ursprungszustandes des Systems verwendet wird. Das Verhalten einer benutzerdefinierten Aktion ist
an dieser Stelle abweichend von der Standardaktion. Befindet sich eine relevante Standardaktion
zwischen InstallInitalize und InstallFinalize wird diese nicht direkt ausgefhrt, sondern eine
340
Paketbergreifende Transaktionen
Kapitel 8
Commit-Phase
Wie bereits zu Beginn dieses Buches erlutert, erfolgt die Installation von Assemblies in den Global
Assembly Cache immer in Verbindung mit der Common Language Runtime. Das bedeutet, dass der
Windows Installer die Installation initiiert, aber die physische Installation ausschlielich durch die
Common Language Runtime erfolgt, die hierfr ein transaktionales Modell verwendet. Im ersten
Schritt wird ein Objekt vom Typ IAssemblyCacheItem erstellt und im zweiten Schritt wird die
Methode Commit dieses Objektes ausgefhrt. Die Erstellung des IAssemblyCacheItem-Objektes erfolgt
whrend der Execution-Phase, aber der zweite Schritt dieses Prozesses erfolgt erst whrend der
Commit-Phase des Windows Installers. Erst danach steht das Assembly zur Verfgung und kann
verwendet werden. Dieses ist eine der wesentlichen Aufgaben innerhalb der Commit-Phase. Die zweite
wesentliche Aufgabe betrifft die benutzerdefinierten Aktionen vom Typ Commit. Wie der Name
bereits vermuten lsst, werden diese Aktionen auch whrend der Commit-Phase ausgefhrt und zwar
nach der Finalisierung der Assemblies. Hierdurch ist es mglich, benutzerdefinierte Aktionen zu
verwenden, die auf Assemblies des Global Assembly Cache zugreifen. Die Abarbeitung der
benutzerdefinierten Aktionen erfolgt nach dem FIFO-Prinzip (first in - first out). Das bedeutet, dass
die Aktion die dem Rollbackskript zuerst angefgt wurde, auch zuerst ausgefhrt wird.
Diese Commit-Phase wird allerdings nur ausgefhrt, wenn das Installations-Skript erfolgreich
verarbeitet wurde. Kommt es whrend dieser Phase zu einem Fehler, wird versucht, die bisher
durchgefhrten Modifikationen zurckzunehmen. Fr die Modifikationen, die whrend der ExecutionPhase durchgefhrt wurden, kann die Rcknahme garantiert werden. Werden hingegen nderungen
am System whrend der Commit-Phase vorgenommen, kann die Rcknahme nicht in allen Fllen
garantiert werden. Diese Einschrnkung zielt auf benutzerdefinierten Aktionen vom Typ Commit ab,
da hierfr keine gegenstzliche Aktion zur Zurcknahme der Modifikationen existiert und auch nicht
definiert werden kann.
Rollback-Phase
Kommt es whrend de Skriptausfhrung zu einem Fehler oder zu einem Benutzerabbruch, muss das
System in den Zustand versetzt werden, der vor der Installation vorhanden war. Hierzu werden die
Operationsanweisungen des Rollbackskriptes in der LIFO-Reihenfolge (last in first out) ausgefhrt.
Wichtig Beginn
Benutzerdefinierte Aktionen vom Typ Commit und die Rollback-Phase werden nicht ausgefhrt, wenn
auf dem Zielsystem die Funktionalitt des Rollbacks durch die Systemrichtlinie DisableRollback oder
341
Kapitel 8
Paketbergreifende Transaktionen
die Eigenschaft DISABLEROLLBACK deaktiviert wurde. Da dieses einen nicht unerheblichen Einfluss
auf den gesamten Installationsprozess ausben kann, sollte eine Installation unter diesen
Voraussetzungen nicht durchgefhrt werden. Hierzu kann die Eigenschaft RollbackDisabled in der
Tabelle LaunchCondition geprft werden.
Wichtig Ende
Der Wesentliche Punkt in einem transaktionalen Szenario ist natrlich die Execution-Phase. Hier wird
fr jede Operation eine gegenstzliche Operation erzeugt, mit der die nderungen zurckgenommen
werden knnen. Hieraus ergibt sich, dass diese Phase sowohl vorwrts als auch rckwrts durchlaufen
werden kann, was bei den anderen Phasen nicht der Fall ist. Bei der Acquisition-Phase ist dieses auch
gar nicht erforderlich, da hierbei keine Modifikationen am System vorgenommen werden. Die
Commit-Phase wird rein vorwrts durchlaufen, wodurch eine transaktionale Verhaltensweise nicht
gegeben ist. Das bedeutet, dass bei Fehlern, die in den ersten beiden Phasen auftreten, das System in
den Ursprungszustand zurck versetzt wird. Tritt jedoch ein Fehler in der dritten also der CommitPhase auf, werden bestmgliche Anstrengungen unternommen, dass System in den Ursprungszustand
zu versetzen. Allerdings kann eine vollstndige Restauration nicht gewhrleistet werden, wie dieses
auch in Abbildung 8.71 dargestellt ist
Die Betrachtung muss an dieser Stelle noch erweitert werden, um letztlich zu einer
paketbergreifenden Transaktion zu gelangen. Die bisherigen Versionen des Windows Installers
enthalten keine Implementierung um eine Transaktion auf mehrere Pakete auszudehnen. Zur
Realisierung ist eine eigene Logik erforderlich, die letztlich eine Art Rollback manuell veranlasst. Der
Rollback ist in einem solchen Fall jedoch nichts anderes als eine Deinstallation, da ja das
Rollbackskript nur whrend der Installation des jeweiligen Produktes zur Verfgung steht und die
Commit-Phase bereits abgeschlossen ist. Die zuverlssige Zurcknahme der durchgefhrten CommitAktionen liegt in der Deinstallation des Produktes. Abbildung 8.72 zeigt den schematischen Ablauf
einer manuell konstruierten paketbergreifenden Transaktion, bei der sich die Logik im Chainer
befindet. Kommt es bei der Installation von Paket 3 whrend der Execution-Phase zu einem Fehler,
342
Paketbergreifende Transaktionen
Kapitel 8
findet automatisch ein Rollback fr dieses Paket statt. Die Zielsetzung des Chainers ist es jedoch, dass
System in den Status zu versetzen, der vor der Installation bestand, falls whrend der Installation ein
Fehler auftritt. Aus diesem Grund muss der Chainer die Zurcknahme der Modifikationen von Paket
1 und Paket 2 veranlassen, wozu er eine Deinstallation startet.
Abbildung 8.72: Schema einer paketbergreifenden Installation mit Windows Installer 4.0
Anders verhlt es sich bei der Verwendung des Windows Installers 4.5. Hier stehen zustzliche
Funktionalitten bereit, eine echte paketbergreifende Transaktion durchzufhren. In Abbildung
8.73 ist erkennbar, dass zunchst die Execution-Phasen aller involvierten Pakete ausgefhrt werden.
Danach wird entschieden ob die Commit-Phase eingeleitet, oder ob ein Rollback durchgefhrt werden
soll.
Abbildung 8.73: Schema einer paketbergreifenden Transaktion mit dem Windows Installer 4.5
343
Kapitel 8
Paketbergreifende Transaktionen
Wir bereits in einem vorherigen Abschnitt beschrieben, werden im Chainer die Abhngigkeiten der zu
installierenden Pakete verwaltet. Das Ergebnis dieser Phase ist einfach ausgedrckt eine Liste mit
Paketen und Patches, die im Rahmen einer Transaktion zu installieren sind. Wenn diese Liste vorliegt,
gibt der Chainer letztlich den Startschuss fr die Installation der einzelnen Pakete. Wesentlich ist
hierbei auch, dass der Chainer letztlich darber entscheidet, ob die gesamte Transaktion abgeschlossen
oder zurckgenommen werden soll. Zusammenfassend lassen sich die Aktivitten im Rahmen einer
Multi-Package-Transaktion wie folgt skizzieren:
9. Der Chainer startet die Transaktion durch den Aufruf der Funktion MsiBeginTransaction().
10. Der Chainer veranlasst den Windows Installer ein entsprechendes Produkt zu installieren oder
einen Patch anzuwenden.
11. Die Installation wird ausgefhrt, der Windows Installer beginnt mit der Acquisition-Phase. Die
Acquisition-Phase einer Multi-Package-Transaktion unterscheidet sich nicht von der einer
344
Paketbergreifende Transaktionen
Kapitel 8
einzelnen Installation.
12. Der Installer wechselt nun in die Execution-Phase. Die Execution-Phase einer Multi-PackageTransaktion unterscheidet sich nicht von der einer einzelnen Installation.
13. Der Installer gibt die Ausfhrungskontrolle zurck an den Chainer.
14. Die Schritte 2 bis 5 werden nun fr jedes Produkt ausgefhrt, das installiert werden soll.
15. Der
Chainer
schliet
die
Transaktion
durch
Aufruf
der
Funktion
MsiEndTransaction(msiCommitTransaction) ab.
16. Der Installer fhrt nun die Commit-Phase fr alle Produkte aus, die im Rahmen der Transaktion
installiert wurden und beendet danach die Transaktion.
In Abbildung 8.75 sind diese einzelnen Schritte in einer schematischen Ablaufdarstellung dargestellt.
In der vorliegenden Auflistung der Aktivitten, wurden bereits die neuen Funktionen verwendet, die es
nun zu erlutern gilt.
Programmtechnische Implementierungen
Wie bereits zuvor erwhnt, ist eine Transaktion immer durch einen Beginn und ein Ende
gekennzeichnet. Die hierfr erforderlichen Funktionen oder Schlsselwrter sind natrlich von der
verwendeten Technologie abhngig. Das Starten einer Transaktion erfolgt in ADO (ActiveX Data
Objects) beispielsweise ber die Funktion BeginTrans(), in T-SQL des Microsoft SQL-Servers durch
BEGIN TRANSACTION und beim Windows Installer 4.5 durch die Funktion MsiBeginTransaction().
Durch die Verwendung dieser Funktion wird ein Transaktions-Objekt erstellt, in dem ein
Identifizierungsmerkmal, das Handle des Client-Prozesses, der Name der Transaktion und weitere
Attribute enthalten sind. Diese Informationen werden von anderen Funktionen bentigt, um weitere
Installationsaktivitten innerhalb dieser Transaktion auszufhren. Die Zerstrung des TransaktionsObjektes und damit verbunden das Beenden der Transaktion erfolgt durch die Funktion
MsiEndTransaction().
Persnliche Ausfertigung fr Martin Martinsson
345
Kapitel 8
Paketbergreifende Transaktionen
Zur Vermeidung sicherheitsrelevanter Probleme drfen Aktionen innerhalb der Transaktion nur von
dem Prozess veranlasst werden, der auch der Eigentmer der Transaktion ist. Hierzu speichert der
Windows Installer einige identifizierende Merkmale des Prozesses, der MsiBeginTransaction() aufruft
und gleicht diese bei den Funktionsaufrufen ab. Die folgenden Parameter sind beim Aufrufen der
Funktion zu verwenden:
szTransactionName: Name der paketbergreifenden Transaktion.
dwTransactionAttributes: Ein numerischer Wert zur Definition von bestimmten Verhaltensweisen
der Transaktion hinsichtlich der Verwendung der Benutzeroberflche. Wird dieses Attribut nicht
oder auf den Wert 0x0 gesetzt, wird die Benutzeroberflche einer vorherigen Installation
geschlossen.
Wird
das
Attribut
hingegen
auf
den
Wert
0x1
(MSITRANSACTION_CHAIN_EMBEDDEDUI) festgelegt, wird der Windows Installer
angewiesen, eine eingebettete Benutzeroberflche (Embedded UI) whrend der Transaktion nicht
zu schlieen. Die Funktionalitt der eingebetteten Benutzeroberflchen wird in einem gesonderten
Kapitel erlutert.
hTransaction: Diesem Parameter wird vom Windows Installer ein Identifizierungsmerkmal
zugewiesen. Diese Transaktions-ID kann zum Wechsel des Eigentmers einer Transaktion
verwendet werden.
phChangeOfOwnerEvent: Diesem Parameter wir vom Installer ein Handle auf eine
Ereignisroutine zugewiesen. Das so referenzierte Ereignis wird ausgelst, wenn sich Eigentmer
(Client-Prozess) der Transformation gendert hat. Eine nderung des Eigentmers kann durch die
Funktion MsiJoinTransaction() veranlasst werden. Hierdurch kann der aktuelle Eigentmer der
Transformation feststellen, wenn sich das Eigentumsverhltnis ndert. Wird eine Transaktion in
einen Zustand versetzt, in dem kein Eigentmer existiert, wird ein Rollback durchgefhrt und die
Transaktion beendet. Wird beispielsweise der Chainer beendet, obwohl noch eine Transaktion aktiv
ist, verfgt die Transaktion zwangslufig ber keinen Eigentmer mehr, und die nderungen
346
Paketbergreifende Transaktionen
Kapitel 8
werden zurckgenommen.
War der Aufruf der Funktion MsiBeginTransaction() erfolgreich, wird ERROR_SUCCESS als
Rckgabewert geliefert. Abweichende Rckgabewerte deuten auf einen Fehler hin, wie dieses auch in
Tabelle 8.66 dargestellt ist.
Fehlercode
Wert
Beschreibung
ERROR_INVALID_PARAMETER
87
ERROR_INSTALL_SERVICE_FAILURE
1601
ERROR_INSTALL_ALREADY_RUNNING
1618
ERROR_ROLLBACK_DISABLED
1653
Beim Beenden der Transaktion muss festgelegt werden, ob die Ausfhrung erfolgreich war oder ob die
nderungen am Zielsystem zurckgenommen werden mssen. Dieses Verhalten kann durch den
Parameter dwTransactionState beeinflusst werden, indem die folgenden Werte verwendet werden.
MSITRANSACTIONSTATE_ROLLBACK (0x0): Es wird ein Rollback durchgefhrt um die
nderungen der Transaktion zurckzunehmen, die seit dem Aufruf von MsiBeginTransaction()
durchgefhrt wurden.
MSITRANSACTIONSTATE_COMMIT (0x1): Es werden alle noch ausstehenden und nicht mehr
zurckzunehmenden Modifikationen am System durchgefhrt. Hierbei wird die Installation der
Win32- und der .NET Assemblies abgeschlossen und die benutzerdefinierten Aktionen vom Typ
Commit werden ausgefhrt. Im Weiteren wird das Rollback-Skript gelscht, so dass danach keine
nderungen mehr zurckgenommen werden knnen.
Wird die Funktion erfolgreich ausgefhrt, wird ERROR_SUCCESS zurckgegeben. Die weiteren
Persnliche Ausfertigung fr Martin Martinsson
347
Kapitel 8
Paketbergreifende Transaktionen
mglichen Rckgabewerte und die Begrndung fr das entsprechende Verhalten sind in Tabelle 8.67
aufgefhrt.
Fehlercode
Wert
Beschreibung
ERROR_ACCESS_DENIED
ERROR_INSTALL_FAILURE
1603
ERROR_INSTALL_ALREADY_RUNNING
1618
ERROR_ROLLBACK_DISABLED
1653
Bei dem letzten Parameter handelt es sich wie bei der Funktion MsiBeginTransaction() um das Handle
auf eine Ereignisroutine, so dass hier auf eine weitere Erluterung verzichtet werden kann. Die
weiteren Parameter sind wie folgt definiert:
hTransactionID: Hierbei handelt es sich um das Identifizierungsmerkmal der Transaktion, das
durch die Funktion MsiBeginTransaction() zurckgegeben wurde.
dwTransactionAttributes: Ein numerischer Wert zur Definition von bestimmten Verhaltensweisen
der Transaktion hinsichtlich der Benutzeroberflche. Wird dieses Attribut nicht oder auf den Wert
0x0 gesetzt, wird die Benutzeroberflche einer vorherigen Installation geschlossen. Wird das
Attribut hingegen auf den Wert 0x1 (MSITRANSACTION_CHAIN_EMBEDDEDUI) festgelegt,
wird der Windows Installer angewiesen, eine integrierte Benutzeroberflche (Embedded UI)
348
Paketbergreifende Transaktionen
Kapitel 8
whrend der Transaktion nicht zu schlieen. Das Festlegen des Attributs auf 0x2
(MSITRANSACTION_JOIN_EXISTING_EMBEDDEDUI) veranlasst den Windows Installer die
integrierte Benutzeroberflche der Originalinstallation zu verwenden. Verfgt diese Installation
ber keine integrierte Benutzeroberflche, wird dieses Attribut ignoriert.
Der erfolgreiche Aufruf dieser Funktion resultiert wiederum im Rckgabewert ERROR_SUCCESS
zurckgegeben. Die weiteren mglichen Rckgabewerte sind in Tabelle 8.68 aufgefhrt.
Fehlercode
Wert
Beschreibung
ERROR_ACCESS_DENIED
ERROR_INVALID_HANDLE
ERROR_INVALID_PARAMETER
87
ERROR_INSTALL_ALREADY_RUNNING
1618
Wird diese Funktion durch den Chainer aufgerufen wird zunchst geprft, ob der Benutzertoken des
aufrufenden Prozesses mit dem Token des Eigentmers der Transaktion identisch ist. Ist das nicht der
Fall wird die Funktion mit einem Fehler beendet. Im Weiteren wird auch geprft, ob sich der neue
Eigentmer in der gleichen Prozessstruktur befindet, wie der aktuelle Eigentmer. Die Prozessstruktur
wird hierbei von dem Prozess gebildet, der die Transaktion erzeugt hat. Hieraus folgt, dass eine
bernahme der Transaktion nur durch einen Kind-Prozess des Erzeugers erfolgen kann. Die Funktion
kann auch nur ausgefhrt werden, wenn keine Installation aktiv ist.
349
Kapitel 8
Paketbergreifende Transaktionen
Beginnend mit dem Windows Installer 4.5 knnen die von den folgenden Funktionen durchgefhrten
nderungen am System, im Rahmen einer paketbergreifenden Transaktion zurckgenommen werden:
MsiAdvertiseProduct()
MsiAdvertiseProductEx()
MsiApplyMultiplePatches()
MsiApplyPatch()
MsiConfigureFeature()
MsiConfigureProduct()
MsiConfigureProductEx()
MsiInstallMissingComponent()
MsiInstallMissingFile()
MsiInstallProduct()
MsiProvideAssembly()
MsiProvideComponent()
MsiProvideQualifiedComponent()
MsiProvideQualifiedComponentEx()
MsiReinstallFeature()
MsiReinstallProduct()
MsiRemovePatches()
Es ist nicht verwunderlich, dass bestimmte Verhaltensmuster dieser Installations- und
Konfigurationsfunktionen einen abweichenden Algorithmus verwenden, wenn sie innerhalb einer
350
Paketbergreifende Transaktionen
Kapitel 8
Wert
Beschreibung
ERROR_ROLLBACK_DISABLED
1653
Transaktionsklasse
Die Erstellung eines Chainers unter Verwendung der neuen Funktionen des Windows Installers 4.5 ist
relativ einfach. Die Funktion MsiBeginTransaction() erzeugt eine Transaktion und gibt ein
Identifizierungsmerkmal fr die Transaktion zurck. Mit MsiJoinTransaction() ist es fr einen anderen
Prozess mglich, das Eigentumsverhltnis der Transaktion zu bernehmen, wozu die Transaktions-ID
bentigt wird. Durch MsiEndTransaction() wird die letztlich Transaktion abgeschlossen. Diese
Funktion erwartet einen booleschen Wert, der das Ergebnis der Transaktion bestimmt.
Im objektorientierte Programmierparadigma bietet sich jedoch die Verwendung eines
funktionsspezifischen Objektes an. Die Deployment Tools Foundation stellen hierfr die Klasse
Transaction des Namensraums Microsoft.Deployment.WindowsInstaller zur Verfgung. Die einzelnen
Elemente der Klasse sind in Tabelle 8.70 aufgefhrt.
Member
Typ
Beschreibung
Transaction(String,
TransactionAttributes)
Konstruktor
Commit()
Methode
FromHandle(IntPtr, Boolean)
Methode (Statisch)
Join(TransactionAttributes)
Methode
351
Kapitel 8
Paketbergreifende Transaktionen
Name
Eigenschaft
OwnerChanged
Ereignis
Rollback()
Methode
Listing 8.76: Verwenden der Klasse Transaction zur Durchfhrung einer paketbergreifenden Transaktion
352
Paketbergreifende Transaktionen
Kapitel 8
Das vorstehende Listing sollte die Verwendung der Transaktionsklasse verdeutlichen. Die
tatschlichen Installationsttigkeiten werden hier nur rudimentr betrachtet. In dem Beispiel werden
nur Produkte installiert; Konfigurationsttigkeiten, Deinstallationen oder die Installation von Patches
wurden hierbei nicht bercksichtigt, sind aber in diesem Zusammenhang nicht zu vernachlssigen.
Eingebetteter Chainer
Zur Realisierung einer paketbergreifenden Transaktion ist immer eine Chainer-Anwendung
erforderlich. Diese kann als externe Anwendung vorliegen, sie kann aber auch direkt in die Pakete
integriert werden. Die Integration wird durch die neue Tabelle MsiEmbeddedChainer ermglicht.
Durch die Verwendung dieser Tabelle ergibt sich die Mglichkeit ein Windows Installer-Paket
beispielsweise durch Doppelklick zu starten und dennoch einer Chainer-Anwendung zur
paketbergreifenden Steuerung zu verwenden. Interessent ist diese Verwendungsmglichkeit bei der
Verteilung ber das Active Directory, da hierbei nur MSI-Pakete verwendet werden knnen und keine
EXE-Dateien. Durch diese verschiedenen Integrationsformen des Chainers ergeben sich auch
zwangslufig abweichende Anwendungsszenarien des Installers.
Windows Installer 4.5 versucht Installationen immer innerhalb einer Transaktion auszufhren, auch
wenn es sich nur um ein Paket handelt und auch wenn eine Transaktion nicht explizit erstellt wurde.
Entsprechende Hinweise darauf finden sich im Ereignisprotokoll von Windows. Zum Beginn der
serverseitigen Installation wird geprft ob bereits eine Transaktion vorhanden ist. Ist dieses nicht der
Fall wird MsiBeginTransaction() vom Server-Prozess aufgerufen, wodurch der Server-Prozess
gleichzeitig als Eigentmer der Transaktion festgelegt wird. Wurde jedoch die Rollback-Funktionalitt
auf dem System oder fr das Installationspaket deaktiviert, wird keine Transaktion erzeugt und die
Installation erfolgt wie bei den vorherigen Versionen des Windows Installers. Wir befassen uns aber an
dieser Stelle mit Transaktionen und betrachten somit das Szenario in dem der Server-Prozess eine
Transaktion erzeugt hat und somit deren Eigentmer ist.
Beim Erreichen der Aktion InstallFinalize wird die Tabelle MsiEmbeddedChainer auf die Existenz
eines Chainers geprft. Falls kein Chainer vorhanden ist, wird MsiEndTransaction() aufgerufen
und die Installation wie seit jeher abgeschlossen. Falls jedoch ein Chainer vorhanden ist, der auch
ausgefhrt werden kann und darf, wird dieser gestartet. Der Chainer wird hierbei als
benutzerdefinierte Aktion vom Typ Ausfhrbare Datei im Kontext des Benutzers ausgefhrt.
Innerhalb des Chainers knnen wiederum MsiInstallProduct() oder artverwandte Funktionen
verwendet werden, um Pakete oder Patches innerhalb der Transaktion zu installieren, nachdem die
Transaktion mit MsiJoinTransaction() bernommen wurde. Im Weiteren muss der Chainer die
Transaktion durch MsiEndTransaction() abschlieen. Schlgt die Ausfhrung des Chainers fehl
oder wird MsiEndTransaction() nicht ausgefhrt, wird diese Funktion mit dem Parameter
MSITRANSACTIONSTATE_ROLLBACK vom Server-Prozess automatisch aufgerufen um die
durchgefhrten nderungen zurckzunehmen. Schlgt der Aufruf von MsiEndTransaction() fehl,
da noch eine Installation ausgefhrt wird, wird die Transaktion bis zum frhestmglichen Zeitpunkt
zurckgerollt.
Beim Ausfhren einer Produktankndigung (Advertised Installation) wrde der Chainer nach dem
gleichen Muster aufgerufen werden, da der Windows Installer keine Unterscheidung zwischen den
Installationsarten vornimmt. Allerdings untersagen die Regeln fr benutzerdefinierte Aktionen deren
Verwendung im Rahmen einer Produktankndigung, wie das auch durch ICE72 geprft wird. Da der
Chainer nichts anderes als eine benutzerdefinierte Aktion ist, sollte die Verwendung whrend der
Produktankndigung durch eine entsprechend definierte Bedingung unterbunden werden.
Persnliche Ausfertigung fr Martin Martinsson
353
Kapitel 8
Paketbergreifende Transaktionen
Bei der Programmierung eines eingebetteten Chainers ist eine Besonderheit zu beachten. Der Chainer
muss die Transaktion bernehmen, wozu er zwangslufig die ID der aktiven Transaktion bentigt. Die
ID wird der Befehlszeile zum Starten des Chainers vom Server-Prozess automatisch als Argument
angefgt. Es ist nicht sehr effektiv, unterschiedliche Chainer fr unterschiedliche Einsatzmglichkeiten
zu erstellen. Aus diesem Grund empfiehlt sich beim Bau des Chainers, die Befehlszeilenargumente zu
prfen und auszuwerten. Wird hierbei ein numerischer Wert bergeben, handelt es sich um
Transaktions-ID. Hieraus kann nun abgeleitet werden, dass bereits eine Transaktion existiert und diese
Transaktion bernommen werden muss, wie dieses auch in Listing 8.77 demonstriert wird. Mit dieser
einfachen Fallunterscheidung kann ein so definierter Chainer sowohl extern als auch eingebettet
verwendet werden. Auch Szenarien in denen mehrere Chainer verwendet werden, sind hiermit mglich
wie spter noch erlutert wird.
static void Main(string[] args)
{
// Transaktions-Id
uint transactionID = 0;
// berprfen ob Argument bergeben wurden
if (args.Length > 0)
{
// Argument 1 ist das Handle
if (!uint.TryParse(args[0], out transactionID))
throw new ArgumentOutOfRangeException("Invalid Handle");
}
// Neue Transaktion erzeugen und installieren
Program.Install(transactionID, Files);
}
private static void Install(uint transactionId, List<string> fileList)
{
// Transaktion bernehmen oder erstellen
if (transactionId == 0)
Installer.BeginTransaction();
else
Installer.JoinTransaction(transactionId);
try
{
foreach (string fileName in fileList)
{
// Installation der Pakete
Installer.InstallProduct(fileName, "ARPSYSTEMCOMPONENT =1");
}
// Transaktion abschlieen (Commit)
Installer.EndTransaction(true);
}
catch
{
// nderungen zurcknehmen
Installer.EndTransaction(false);
}
354
Paketbergreifende Transaktionen
Kapitel 8
Tabelle MsiEmbeddedChainer
Die Tabelle MsiEmbeddedChainer ermglicht die Speicherung und Referenzierung von einem oder
mehrere Chainern in einem Installationspaket. Hierdurch wird es mglich mehrere Pakete innerhalb
einer Transaktion zu installieren, ohne den Installationsprozess durch eine externe EXE-Datei
anzustoen. Die Tabelle MsiEmbeddedChainer ist wie folgt aufgebaut:
Spalte
Typ
Gre
Schlssel
Null
Beschreibung
MsiEmbeddedChainer
Identifier
s72
Condition
Condition
s255
CommandLine
Formatted
s255
Source
CustomSource
s72
Type
Integer
i2
Eindeutige Identifizierung fr
den Datensatz
Typ
Spalte Source
Flags
355
Kapitel 8
Paketbergreifende Transaktionen
Ausfhrbare Datei,
die in der Tabelle
Binary gespeichert
ist.
2 (0x2)
msidbCustomActionTypeExe +
msidbCustomActionTypeBinaryData
Ausfhrbare Datei,
die mit dem Produkt
installiert wird.
18 (0x12)
msidbCustomActionTypeExe +
msidbCustomActionTypeSourceFile
Ausfhrbare Datei,
die durch einen
Eigenschaftswert
festgelegt ist.
50 (0x32)
Enthlt den
vollstndigen Pfad zu
der ausfhrbaren
Datei, der durch eine
Eigenschaft oder
durch eine Referenz
auf die Tabelle
Property angegeben
wird.
msidbCustomActionTypeExe +
msidbCustomActionTypeProperty
Die Definition der Tabelle MsiEmbeddedChainer ist bei Windows Installer-XML durch das Element
<EmbeddedChainer/> mglich, wie dieses in Listing 8.78 gezeigt wird. Hierbei werden alle drei
Chainer-Arten definiert, wobei die Auswahl des zu verwendenden ber die Eigenschaft
RUNCHAINER gesteuert wird. Der Chainer, der ber eine Eigenschaft definiert wird (Typ: 50)
befindet sich im gleichen Verzeichnis wie das Installationspaket. Der vollstndige Pfad wird daher
durch die benutzerdefinierte Aktion SetChainer zugewiesen.
<!-- Ordner, Komponenten und Ressourcen -->
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="ProgramFilesFolder">
<Directory Id="INSTALLLOCATION" Name="$(var.ApplicationName)">
<Component Id="C__Chainer.exe" Guid="{07848269-6ECD-48d8-92DE-DDFB233215CE}">
<!--Datei-->
<File Id="FileChainer" Source=".\Files\ " Name="EmbeddedChainer.exe" KeyPath="yes" DiskId="1" />
</Component>
</Directory>
</Directory>
</Directory>
<!--Eigenschaften-->
<Property Id="RUNCHAINER" Value="1" />
<Property Id="PropertyChainer" Value ="EmbeddedChainer.exe"/>
<!--Binrdaten-->
<Binary Id="BinaryChainer" SourceFile=".\Files\EmbeddedChainer.exe" />
<!--Chainer-->
<EmbeddedChainer Id="Chainer1" CommandLine =""[CURRENTDIRECTORY]""
BinarySource="BinaryChainer">RUNCHAINER=1</EmbeddedChainer>
<EmbeddedChainer Id="Chainer2" CommandLine =""[CURRENTDIRECTORY]""
PropertySource="PropertyChainer">RUNCHAINER=2</EmbeddedChainer>
<EmbeddedChainer Id="Chainer3" CommandLine =""[CURRENTDIRECTORY]""
FileSource ="FileChainer">RUNCHAINER=3</EmbeddedChainer>
356
Paketbergreifende Transaktionen
Kapitel 8
<!--Custom Action-->
<CustomAction Id="SetChainer" Property="PropertyChainer" Value="[CURRENTDIRECTORY]EmbeddedChainer.exe" />
<InstallExecuteSequence >
<Custom Action="SetChainer" After="CostFinalize"/>
</InstallExecuteSequence>
357
Kapitel 8
Paketbergreifende Transaktionen
An dieser Stelle ist zu bercksichtigen, dass zum Wiederherstellen des Systemzustandes auch die
berschriebenen und gelschten Ressourcen bentigt werden. Aus diesem Grund werden diese in
einem speziellen Verzeichnis gesichert und erst nach Abschluss der Installation gelscht. Es wird
deutlich, dass diese Vorgehensweise sehr speicherintensiv sein kann und das gerade dieses Verhalten
mitunter problematisch zu sehen ist. Der Windows Installer wurde zu Zeiten entwickelt, in denen die
Kapazitten der Datentrger noch nicht die heutigen Dimensionen aufwiesen. Das sichern der
Ressourcen berstieg zum damaligen Zeitpunkt mitunter die Kapazitten der Datentrger, so dass eine
358
Paketbergreifende Transaktionen
Kapitel 8
Beschreibung
Richtlinie: DisableRollback
Aktion: DisableRollback
Eigenschaft: DISABLEROLLBACK
Eigenschaft:
PROMPTROLLBACKCOST
Eigenschaft: RollbackDisabled
Durch diese Eigenschaft kann geprft werden, ob die RollbackFunktionalitt deaktiviert wurde.
Tabelle 8.73: Methoden zur Deaktivierung der Rollback-Funktionalitt des Windows Installers
Bei der Verwendung von paketbergreifenden Transaktionen fhren diese Einstellungen nicht mehr
zum erwarteten Ergebnis. Wurde die Rollback-Funktionalitt des Windows Installers durch die
Systemrichtlinie DisableRollback deaktiviert, schlgt der Aufruf der Funktion MsiBeginTransaction()
fehl und es wird ERROR_ROLLBACK_DISABLED zurckgeliefert. Dieses Verhalten liegt darin
begrndet, dass die Rollback-Fhigkeit des Windows Installers absolut notwendig ist, um
paketbergreifende Transaktionen durchzufhren. Dieses wird besonders deutlich, da die RollbackFunktionalitt nicht nur zu Beginn der Transaktion, sondern auch whrend der Transaktion geprft
wird.
Wird innerhalb einer aktiven Transaktion die Rollback-Funktionalitt durch die Richtlinie
DisableRollback oder die gleichnamige Standardaktion deaktiviert, schlgt die Installation des aktiven
Produktes mit ERROR_ROLLBACK_DISABLED fehl. Wird die Installation eines Produktes innerhalb
einer Transaktion ausgefhrt, wird vor dem Aufruf der Standardaktionen InstallExecute,
InstallExecuteAgain und InstallFinalize die Eigenschaft RollbackDisabled geprft. Wird an diesen
Prfpunkten festgestellt, dass der Rollback deaktiviert wurde, werden die bisherigen nderungen
zurckgenommen. Diese Rcknahme der nderungen ist natrlich nur mglich, falls nderungen
vorgenommen wurden und falls ein Rollback-Skript vorhanden ist. Wird beispielsweise bei der Aktion
InstallExecute festgestellt, dass der Rollback deaktiviert wurde, sind keine Aktionen erforderlich, da zu
359
Kapitel 8
Paketbergreifende Transaktionen
Fehler im Installationsprozess
Die gerade skizzierten Einstellungen knnen nicht in Verbindung mit paketbergreifenden
Transaktionen verwendet werden, so dass der Windows Installer automatisch in die Rollback-Phase
wechselt und die nderungen zurcknimmt, falls welche stattgefunden haben. Ein anderes Bild ergibt
sich bei den normalen Fehlern, die whrend der Acquisition- oder der Execution-Phase auftreten
knnen. Die Acquisition-Phase wird hier nur der Vollstndigkeit halber erwhnt. Sie kann
vernachlssigt werden, da hierbei keine nderungen am System vorgenommen werden und somit eine
Rcknahme der nderungen nicht erforderlich machen. Anders ist es whrend der Execution-Phase, da
hierbei das System modifiziert wird. Kommt es zum Fehler werden die durchgefhrten nderungen
vom Windows Installer automatisch zurckgenommen und der Fehlercode wird an den aufrufenden
Prozess zurckgegeben. Wurde die Installation im Rahmen einer Transaktion veranlasst, wird der
Fehlercode somit zum Chainer zurckgegeben. Der Chainer kann nun entscheiden, in welcher Form
ein Rollback durchgefhrt werden soll, wie das folgende Beispiel darstellt.
Der Chainer startet eine Transaktion indem MsiBeginTransaction() aufgerufen wird.
Der Chainer installiert nun Produkt A innerhalb der Transaktion, indem er MsiInstallProduct()
aufruft. Der Windows Installer prft zunchst, ob der Installationsaufruf gltig ist. Hierzu wird
geprft ob der Eigentmer der Transaktion und der aufrufende Prozess identisch sind.
Anschlieend ruft der Chainer MsiInstallProduct() fr Produkt B auf. Diese Installation ist
fehlerhaft und der Windows Installer fhrt einen Rollback fr Produkt B aus. Weiterhin gibt er
ERROR_INSTALL_FAILURE an den Chainer zurck.
Der Chainer stellt fest, dass es sich bei Produkt B um ein optionales Paket handelt. Er fhrt daher
mit der Installation von Produkt C fort.
Nach der erfolgreichen Installation von Produkt C fhrt der Chainer den Commit fr die
Produkte A und C durch indem er MsiEndTransaction() aufruft und
MSITRANSACTIONSTATE_COMMIT bergibt.
In dem Szenario wurde deutlich, dass durchaus unterschiedliche Prioritten fr die Installationspakete
vergeben werden knnen. Dieses wurde anhand einer optionalen Komponente verdeutlicht. Handelt es
sich bei Produkt B jedoch um eine erforderliche Komponente, mssen die nderungen der
Transaktion zurckgenommen werden. Hierzu beendet der Chainer die Transaktion mit
MSITRANSACTIONSTATE_ROLLBACK nachdem die Installation von Produkt B fehlgeschlagen ist.
Eine etwas andere Situation fr einen Rollback ergibt sich nach der Veranlassung durch den Benutzer.
Bei vielen Installationsformen findet sich eine Benutzeroberflche, in der unter anderem der Fortschritt
der Installation dargestellt wird. Vielfach befindet sich auf dieser Oberflche eine Option, die aktuelle
Installation abzubrechen. Einfach ausgedrckt sendet der Windows Installer eine Vielzahl von
Nachrichten an die Benutzeroberflche. Abhngig von der Art der Nachricht reagiert die Oberflche
hierauf in unterschiedlicher Weise. Die Benutzeroberflche muss jedoch die Nachricht beantworten
und kann somit die weitere Installation beeinflussen. Wird an dieser Stelle die Meldung mit
IDCANCEL beantwortet, wird die Installation mit der Fehlernummer 1602 (A user canceled
installation) beendet. Das bedeutet natrlich auch, dass automatisch ein Rollback auf Ebene des
Paketes durchgefhrt wird, um den Ursprungszustand des Systems wieder herzustellen. Auch hier kann
die Flexibilitt des Chainers ausgenutzt werden um individuelle Verhaltensmuster zu erreichen.
360
Paketbergreifende Transaktionen
Kapitel 8
dem
Argument
Whrend der Commit-Phase von Produkt B schlgt eine benutzerdefinierte Aktion fehl.
In diesem Szenario wird auch ein Rollback ausgefhrt und die nderungen werden zurckgenommen.
Problematisch sind hierbei jedoch benutzerdefinierte Aktionen die whrend der Commit-Phase
ausgefhrt wurden. Wurde hierdurch das System verndert, knnen diese Modifikationen nicht
zurckgenommen werden. Dieses ist nicht nur auf Produkt B bezogen, sondern auf alle Produkte,
bei denen die Commit-Phase bereits abgeschlossen wurde.
Mehrere Chainer
Die bisherigen Szenarien bezogen sich immer auf die Verwendung eines Chainers. Mitunter besteht
jedoch die Notwendigkeit mehrere Chainer zu verwenden. Diese Vorgehensweise birgt einige
Gefahrenpunkte, so dass das Design exakt durchdacht werden sollte. Zum besseren Verstndnis soll
zunchst ein kurzes Beispiel dienen.
Der Chainer fr Visual Studio startet eine Transaktion indem MsiBeginTransaction() aufgerufen
wird und installiert mehrere Produkte innerhalb dieser Transaktion durch den mehrfachen Aufruf
von MsiInstallProduct().
Visual Studio mchte einige Installationen durch den Chainer vom SQL Server ausfhren lassen.
Der Chainer des SQL Servers wird hierzu gestartet, indem CreateProcess() aufgerufen wird.
Wichtig ist hierbei die Transaktions-ID, die dem SQL-Chainer bergeben werden muss. Hierzu
wird diese in eine Zeichenfolge konvertiert, und der Befehlszeile zum Starten des SQL-Chainers
angefgt.
Der Chainer des SQL Servers veranlasst nun die Eigentumsbernahme der Transaktion, indem er
MsiJoinTransaction() aufruft. Der Windows Installer prft die Rechtmigkeit des
Eigentmerwechsels indem er den Token des aktuellen und des neuen Eigentmers vergleicht. Im
Weiteren stellt der Installer sicher, dass derzeitig keine Installation ausgefhrt wird.
Nachdem diese berprfungen erfolgreich abgeschlossen wurden, fhrt der Installer den Wechsel
des Eigentmers durch. Der Chainer des SQL Servers ist nun der Eigentmer der Transaktion.
Der SQL-Chainer installiert nun einige Produkte indem er MsiInstallProduct() ausfhrt. Nach der
Fertigstellung informiert er den Chainer von Visual Studio.
Der Chainer von Visual Studio bernimmt nun wieder die Transaktion durch den Aufruf von
MsiJoinTransaction().
Nach der Installation weiterer Pakete wird die Transaktion durch den Chainer von Visual Studio
abgeschlossen,
indem
MsiEndTransaction()
mit
dem
Argument
MSITRANSACTIONSTATE_COMMIT aufgerufen wird.
Bei der Umsetzung des Szenarios muss besonderes Augenmerk auf den Chainer des SQL Servers
361
Kapitel 8
Paketbergreifende Transaktionen
gelegt werden. Kommt es bei der Installation eines Paketes zum Fehler, gilt es natrlich wieder, die
Prioritt des Paketes auszuwerten. Handelt es sich um ein optionales Paket, kann die Installation der
weiteren Pakete fortgesetzt werden. Im anderen Fall muss der Chainer die nderungen durch die
Transaktion auf alt bekannte Weise zurcknehmen. Hierbei ist zu bercksichtigen, dass es nur einen
Eigentmer fr die Transaktion gibt. Dieses ist derzeitig der SQL-Chainer, so dass sich ein Rollback
natrlich auch auf die Modifikationen des Chainers von Visual Studio beziehen. Dieses ist wichtig,
denn nachdem der SQL-Chainer seine Aufgaben durchgefhrt hat, findet ja wieder der Wechsel zum
Chainer von Visual Studio statt. Diesem Chainer muss nun das Ergebnis des bisherigen
Installationsverlaufs mitgeteilt werden, wozu der Exitcode verwendet werden kann. Im positiven Fall
bernimmt der Chainer die Transaktion, installiert weitere Pakete und schliet die Transaktion ab. Im
negativen Fall wurde die Transaktion bereits durch den SQL-Chainer beendet, so dass die bernahme
der bereits geschlossenen Transaktion zum Fehler fhrt.
Bei einer paketbergreifenden Transaktion wird die In-Progress-Datenbank nicht bentigt, da der
Windows Installer keinen Computerneustart innerhalb der Transaktion veranlasst.
Dateien in Verwendung
Die Aktion InstallValidate ist fr die Identifizierung von Dateien zustndig, die im Rahmen der
Installation ersetzt oder modifiziert werden mssen. Wird whrend dieser Aktion festgestellt, dass eine
zu aktualisierende Datei von einer anderen Anwendung verwendet wird, fhrt der Windows Installer
362
Paketbergreifende Transaktionen
Kapitel 8
Der schematische Ablauf zur Anforderung eines Neustarts innerhalb einer Transaktion wird in
Abbildung 8.79 dargestellt.
363
Kapitel 8
Abbildung 8.79:
Dateioperationen
Paketbergreifende Transaktionen
Schematischer
Ablauf
der
Neustartanforderung
hervorgerufen
durch
ausstehende
DEBUG: Error 2622: Calling ForceReboot from a multi-package transaction is not supported.
oder
MSI (s) (00:18) [17:15:49:322]: Doing action: ScheduleReboot
DEBUG: Error 2623: Calling ScheduleReboot from a multi-package transaction is not supported.
364
Paketbergreifende Transaktionen
Kapitel 8
Es wird deutlich, dass die Verwendung der Aktionen ScheduleReboot und ForceReboot nicht mehr
zukunftsorientiert ist, da moderne Technologien diese nicht mehr untersttzen. Unter diesem
Gesichtspunkt sollte die Verwendung dieser Aktionen in eigenen Installationspaketen kritisch
hinterfragt werden.
Ausstehende Dateioperationen
Befindet sich eine Datei zum Zeitpunkt der Aktion InstallFiles bereits im Zugriff, kann sie nicht ersetzt
werden. In diesem Fall lsst der Windows Installer die Datei whrend des nchsten Computerneustarts
ersetzen. Hierzu wird sie dem Registrierungsschlssel PendingFileRenameOperations angefgt, wie es
bereits im Kapitel 6 erlutert wurde. Hier wurde auch verdeutlicht, dass es zu Problemen fhren kann,
wenn die Datei durch mehrere Installationspakete aktualisiert wird. Der Algorithmus des
Betriebssystems zur Verarbeitung der ausstehenden Dateioperationen verwendet die FIFOReihenfolge, so dass die Datei des zuletzt installierten Paketes gewinnt und das Ergebnis markiert.
Falls alle Installationspakete ber die identische Dateiversion verfgen, kann dieses Problem
vernachlssigt werden. Werden hingegen unterschiedliche Dateiversionen durch die einzelnen Pakete
installiert, kann dieses zu einem Funktionsverlust bei dem installierten Produkt fhren.
Mit dem Windows Installer 4.5 wurde der Problempunkt adressiert. Im Rahmen der
paketbergreifenden Transaktion wird nun eine Tabelle verwendet, der alle Dateien angefgt werden,
bei denen noch Dateioperationen ausstehen. Die Tabelle enthlt zustzlich zu dem Dateinamen auch
die Versionsnummer, die Sprache und das Zielverzeichnis der Datei. Die Verwendung der Tabelle
wird nachfolgend skizziert. Der Algorithmus bercksichtigt den Modus der Installation, wobei die
Modi A, E und O relevant sind. Hiermit sind die Optionen gemeint, mit denen im Rahmen
einer Reparatur die Kriterien fr das berschreiben einer Datei festgelegt werden knnen. Im O-Modus
werden Dateien nur berschrieben, wenn eine ltere Version vorhanden ist. Ergnzend dazu werden im
E-Modus auch Dateien berschrieben, bei denen die Versionsnummer identisch ist. Im A-Modus
werden die Dateien letztlich immer berschrieben, so dass die Version unerheblich ist.
17. Whrend der Kopieraktion wird geprft ob die Tabelle bereits Eintragungen enthlt. Enthlt die
Tabelle keine Eintragungen, wird mit der Kopieraktion fortgefahren.
18. Sind hingegen Eintragungen vorhanden, wird zunchst geprft, ob die zu kopierende Datei bereits
in der Tabelle vorhanden ist. Falls die Datei in der Tabelle noch nicht vorhanden ist, wird sie in das
Zielverzeichnis kopiert. Allerdings wird hierbei die Standardversionierungsregel des Windows
Installers verwendet. Das bedeutet, dass die existierende Datei nur berschrieben wird, wenn die
neue Datei eine hhere Dateiversion aufweist oder wenn die Installation im A-Modus ausgefhrt
wird.
19. Ist die Datei in der Tabelle hingegen vorhanden, wird die Dateiversion mit dem Eintrag in der
Tabelle verglichen. Ist die Dateiversion kleiner oder gleich dem Eintrag in der Tabelle und wird die
Installation im O-Modus ausgefhrt, wird die Kopieraktion bersprungen.
20. Ist die Dateiversion hingegen grer als der Eintrag in der Tabelle oder wird die Installation im Aoder E-Modus ausgefhrt, wird zunchst die Versionsnummer der Tabelle aktualisiert. Weiterhin
wird das Ersetzen der Datei nach dem Computerneustart veranlasst indem MoveFileEx() ausgefhrt
wird.
Es sei noch anzumerken, dass nach den Kopieraktionen der Schritte 1 und 2, die Datei mit den
zugehrenden Metainformationen natrlich der Tabelle angefgt wird.
365
Kapitel 8
Paketbergreifende Transaktionen
Letztlich ist es unerheblich ob zur Installation ein externer oder eingebetteter Chainer verwendet wird.
Entscheidend ist das erste Paket innerhalb der Transaktion. Verfgt dieses ber die Tabelle
MsiDigitalCertificate und enthlt diese ein gltiges Zertifikat, wird die Anzeige des UAC-Dialogs bei
den Paketen unterdrckt, die mit diesem Zertifikat digital signiert wurden. Das Installationsprotokoll
hebt dieses auch hervor.
MSI (s) (1C:34) [16:11:06:152]: Validating digital signature of file 'C:\Windows\Installer\20d60.msi'
MSI (s) (1C:34) [16:11:06:152]: File 'C:\Windows\Installer\20d60.msi' is a validly signed file and
validates according to authoring of MSI package
MSI (s) (1C:34) [16:11:06:152]: Package meets the LUA multi-package criteria
MSI (s) (1C:34) [16:11:06:152]: MSI_LUA: Credential prompt is not required at this point,
credentials for transaction already provided
366
Paketbergreifende Transaktionen
Kapitel 8
Fr alle Pakete, die keine Signatur aufweisen, erscheint zwangslufig der UAC-Dialog. Wird dieser
nicht besttigt, wird die Installation beendet und die nderungen der Transaktion werden
zurckgenommen. Ein identischer Ablauf gilt bei Patches. Soll ein Patch innerhalb dieser Transaktion
angewendet werden, ohne dass ein UAC-Dialog erscheint, muss dieser Patch ebenfalls signiert werden.
Allerdings muss dieses mit einem Zertifikat geschehen, dass sich in der Tabelle MsiPatchCertificate
befindet.
Hinweis Beginn
Allgemeine Informationen zu den Zertifikaten, wie die Gltigkeitsdauer und die Mglichkeit der
digitalen Signatur wurden bereits im Kapitel 5 fr Windows Installer-Patches erlutert. Diese
Erluterungen sind sinngem auch auf Windows Installer-Pakete bertragbar.
Hinweis Ende
Fazit
Die Installationslandschaft im Rahmen der Anwendungsinstallation hat sich in den letzten Jahren
wesentlich verndert. Frher waren monolithische Anwendungen und auch Installationspakete
vorherrschend, die natrlich sehr einfach zu verteilen waren. Der Trend geht schon seit einiger Zeit in
eine komponentenorientierte Verteilungsform. Das bedeutet, dass mehrere kleinere Installationspakete
zusammengefasst das finale Produkt ergeben. Zur Realsierung solcher Installationsszenarien gab es in
der Vergangenheit mehrere Lsungsanstze, die aber alle irgendwelche Schachstellen aufwiesen. Erst
mit dem Windows Installer 4.5 wurde eine Technologie geschaffen, die es ermglicht, mehrere Pakete
innerhalb einer Transaktion zu installieren.
367
Kapitel 9
Externe Benutzeroberflchen
Externe Benutzeroberflchen
369
371
377
392
415
Aktuell sind in der Softwareentwicklung neue Trends und Technologien zu verzeichnen, die dabei
helfen eine ansprechende Benutzeroberflche zu gestalten. Hierbei steht zum einen die technische
Realisierung im Fokus aber auch die Integration in das Gesamtbild moderner Betriebssysteme und die
Nutzung moderner Hardwarefunktionalitten. Windows Presentation Foundation (WPF) ist eine solche
Technologie. Hierbei handelt es sich um ein Grafik-Framework, das Bestandteil des Microsoft .NET
Frameworks 3.0 ist und erstmalig mit Windows Vista ausgeliefert wurde. Durch WPF wird ein sehr
modernes Programmiermodell zur Verfgung gestellt, in dem die Prsentations- von der
Geschftslogik getrennt wird. Die Benutzeroberflche wird hierbei in einer eigens entwickelten
Sprache definiert, die als XAML (eXtensible Application Markup Language) bezeichnet wird und auf
XML aufbaut. Mit WPF knnen sowohl Windows-Anwendungen als auch Web-Anwendungen erzeugt
werden, die wenn mglich, auch die Hardwarebeschleunigung der Grafikkarte verwenden. Eine
weitere Zielsetzung dieser Technologie liegt in der Vereinigung aller Bereiche, die fr eine
Prsentation relevant sind.
Benutzerschnittstelle
Zeichnen und Grafiken
Audio und Video
Dokumente
Typographie
Eine weitere neue Technologie zur Darstellung der Prsentationsebene ist Microsoft Silverlight.
Hierbei handelt es sich um eine reduzierte Version der Windows Presentation Foundation. Die
Zielsetzung dient der Darstellung und Animation von Oberflchen aus grafischen Elementen und
Media-Daten in Browsern. Microsoft Silverlight spricht ebenfalls XAML, verwendet aber nicht das
Microsoft .NET Framework 3.0, sondern benutzt eine reduzierte Variante davon.
Es wird deutlich, dass neue Mglichkeiten zur Verfgung stehen, ergonomische und ansprechende
Benutzeroberflchen zu gestalten, die sich mit bisherigen Darstellungsmglichkeiten nicht mehr
vergleichen lassen, wie Abbildung 9.80 zeigt.
368
Externe Benutzeroberflchen
Kapitel 9
Es wird deutlich, dass die hierdurch bereitgestellten Mglichkeiten nahezu grenzenlos sind. Weiterhin
findet sich natrliche auch eine Anwendungs-Palette, die bei der Gestaltung solcher Oberflchen
erstklassige Arbeit leistet. Hier stellt sich natrlich die Frage nach der Nutzbarkeit in
Installationsprogrammen, die ich in diesem Kapitel beantworten mchte.
369
Kapitel 9
Externe Benutzeroberflchen
Bei der Ausfhrung der Installationsroutine erhlt der Benutzer erstmals Einblick in die
Anwendung. Jede noch so gute Anwendung wird zwangslufig durch die Verwendung eines
schlecht konzipierten Installationsprogrammes in einem negativen Licht dargestellt.
Das Erscheinungsbild des Installationsprogrammes ist einer der bedeutendsten Aspekte, sich von
einem Mitbewerber abgrenzen zu knnen.
Der Power-User sollte nicht als Mastab gesehen werden. In vielen Fllen wird die Installation von
Benutzern ausgefhrt, die eher als Laien bezeichnet werden knnen.
Die Interaktion mit dem Benutzer sollte sich ausschlielich auf die notwendigen Informationen
beziehen.
Es sollte nicht fr alles und jedes eine Besttigung vom Benutzer gefordert werden. Es ist
effektiver eine Programmlogik zu implementieren, die dem Benutzer einige Entscheidungen
abnimmt.
Der Windows Installer stellt Funktionen bereit, um funktionale und intuitive Benutzeroberflchen zu
gestalten, die den gerade dargestellten Richtlinien entsprechen. Whrend des Installationsprozesses
wird der Benutzer vor schwer verstndlichen Fragen geschtzt, wodurch sich die Installation auch fr
Laien einfacher gestaltet. Die hierzu bereitgestellte interne Benutzeroberflche wird vom Windows
Installer selbst dargestellt und verwaltet und ist sehr hufig anzutreffen. Sie basiert auf den
Eintragungen in den entsprechenden Tabellen der Windows Installer-Datenbank. Die Definition der
Benutzeroberflche erfolgt somit analog zum Design eines Installationspaketes. Die Vorgehensweise
zum Gestalten der Oberflche ist einfach, die sptere Darstellung ist zweckorientiert und allgemein
betrachtet entspricht eine solche Oberflche den meisten Anforderungen.
Hinweis Beginn
Bei der Erluterung der Toolsammlung Windows Installer-XML in Kapitel 2 wurden Mglichkeiten
vorgestellt, die Entwicklung von internen Benutzeroberflchen zu optimieren und zu vereinfachen.
Hinweis Ende
Gerade in der heutigen Zeit gibt es aber immer hufiger Szenarien, in denen die hiermit zu
realisierenden Mglichkeiten nicht mehr ausreichen. Die Problematik begrndet sich in der fehlenden
Flexibilitt und Erweiterbarkeit der Oberflche. Die hufigsten Kritikpunkte und Anforderungen sind
nachfolgend aufgefhrt:
Es wird kein HyperLink-Steuerelement zur Verfgung gestellt, so dass der gewohnte Zugriff auf
externe Ressourcen nicht erfolgen kann.
Die Anwenderfunktionen des RichEdit-Steuerelementes, in dem beispielsweise die
Lizenzbestimmung dargestellt wird, sind nicht ausreichend. Vielfach soll eine Mglichkeit
existieren, die Lizenzbestimmungen zu drucken oder zu speichern.
Die Verwendung von individuellen Steuerelementen wre wnschenswert, da hierdurch
Anwendungen und Installationsprogramm ber einen identischen Aufbau verfgen knnten.
Die Optionen zur Verwendung der Eingabehilfen (Accessibility options) sind vielfach nicht
ausreichend.
Das Steuerelement zur Auswahl der Features ist zu unflexibel und kann nicht erweitert werden. Es
besteht auch keine Mglichkeit die Features aller Pakete darzustellen, die im Rahmen einer
paketbergreifenden Transaktion installiert werden.
Es
370
besteht
keine
Mglichkeit
eine
gemeinsame
Oberflche
fr
alle
Pakete
einer
Externe Benutzeroberflchen
Kapitel 9
371
Kapitel 9
Externe Benutzeroberflchen
Anders verhlt es sich bei der Funktion MsiSetExternalUIRecord(), die durchaus als effizienter
bezeichnet werden kann. Bei dieser Funktion wird der Nachrichteninhalt einem Objekt vom Typ
Windows Installer-Record zugewiesen, wodurch die einzelnen Bestandteile direkt vorliegen und somit
direkt angesprochen werden knnen. Die Verwendung eines Parsers zum Aufteilen der einzelnen
Meldungsparameter ist nicht erforderlich. Auch hier ist ersichtlich, dass wiederum ein Delegate fr die
Rckruffunktion erforderlich, der hierbei allerdings durch den Typ ExternalUIRecordHandler()
dargestellt wird.
DllImport("msi.dll", CharSet=CharSet.Unicode)]
internal static extern uint MsiSetExternalUIRecord(
[MarshalAs(UnmanagedType.FunctionPtr)] ExternalUIRecordHandler puiHandler,
uint dwMessageFilter,
IntPtr pvContext,
out ExternalUIRecordHandler ppuiPrevHandler);
internal delegate int ExternalUIRecordHandler(
IntPtr context,
int messageType,
int recordHandle);
Es wir deutlich, dass die Signaturen der beiden Funktionen ber gewisse hnlichkeiten verfgen, so
dass eine diesbezgliche Erluterung gemeinsam erfolgen kann. Die folgenden Parameter sind beim
Aufrufen der Funktionen zu verwenden:
puiHandler: Hiermit wird die Rckruffunktion festgelegt, die je nach Funktion eine bestimmte
Spezifikationen aufweisen muss. Wie bereits dargestellt ist bei der Funktion MsiSetExternalUI()
ein Delegate vom Typ ExternalUIHandler() zu verwenden. Bei MsiSetExternalUIRecord()
hingegen wird ein Delegate vom Typ ExternalUIRecordHandler() verwendet. Soll die
Registrierung eines existierenden Meldungs-Handlers aufgehoben werden, ist dieser Parameter auf
Null zu setzen. Ist es hingegen erforderlich, den aktuellen Nachrichten-Handler mit dem vorherigen
Handler zu berschreiben, ist die Funktion erneut aufzurufen, und der ursprngliche Handler ist
diesem Parameter anzufgen. Weiterhin ist dem Parameter dwMessageFilter der Wert 0
zuzuweisen.
372
Externe Benutzeroberflchen
Kapitel 9
Eine externe Benutzeroberflche wird immer vor einer internen Benutzeroberflche aufgerufen.
Hinweis Ende
Bei der Verwendung einer externen Benutzeroberflche, wir der Darstellungsmodus fr die interne
Benutzeroberflche automatisch auf INSTALLUILEVEL_BASIC gesetzt. Das bedeutet, dass der externe
Nachrichten-Handler keine vollstndige Kontrolle ber die Benutzeroberflche erhlt, solange die
interne Benutzeroberflche aktiv ist, was hierdurch erreicht wird. Wie bereits angedeutet, werden alle
Nachrichten durch die interne Benutzeroberflche dargestellt, solange diese nicht vom externen
Handler als behandelt gekennzeichnet wurden. Hierbei wird die Basisoberflche angezeigt, die einen
Persnliche Ausfertigung fr Martin Martinsson
373
Kapitel 9
Externe Benutzeroberflchen
statischen Text enthlt, wie dieses auch Abbildung 9.81 zeigt. Die Fortschrittsanzeige oder Hinweise
zum Installationsverlauf werden nicht ausgegeben.
Das geschilderte Verhalten kann durchaus erwnscht sein, aber mitunter auch als strend empfunden
werden. Um solche Darstellungsformen der internen Benutzeroberflche zu vermeiden, ist sie zu
deaktivieren. Hierzu ist die Funktion MsiSetInternalUI() aufzurufen, wobei der Parameter dwUILevel
auf INSTALLUILEVEL_NONE gesetzt wird.
Wert
Protokoll
Bedeutung
INSTALLLOGMODE_
FILESINUSE
Ja
INSTALLLOGMODE_
FATALEXIT
Ja
INSTALLLOGMODE_
ERROR
Ja
INSTALLLOGMODE_
WARNING
Ja
INSTALLLOGMODE_
USER
Ja
INSTALLLOGMODE_
INFO
Ja
INSTALLLOGMODE_
RESOLVESOURCE
Ja
INSTALLLOGMODE_
RMFILESINUSE
Ja
INSTALLLOGMODE_
OUTOFDISKSPACE
Ja
INSTALLLOGMODE_
ACTIONSTART
Ja
INSTALLLOGMODE_
ACTIONDATA
Ja
INSTALLLOGMODE_
COMMONDATA
Ja
INSTALLLOGMODE_
PROGRESS
Nein
374
Externe Benutzeroberflchen
Kapitel 9
INSTALLLOGMODE_
INITIALIZE
Nein
INSTALLLOGMODE_
TERMINATE
Nein
INSTALLLOGMODE_
SHOWDIALOG
Nein
INSTALLLOGMODE_
INSTALLSTART
Ja
INSTALLLOGMODE_
INSTALLEND
Ja
Tabelle 9.74: Mgliche Nachrichten zur Verwaltung durch einen externen Nachrichten-Handler
Wichtig Beginn
Es ist zu beachten, dass die Funktionen MsiSetExternalUI() und MsiSetExternalUIRecord() nur von
einer externen Anwendung aufgerufen werden knnen. Ein Aufruf aus einer benutzerdefinierten
Aktion ist nicht mglich. Weiterhin ist anzumerken, dass die Funktion MsiSetExternalUIRecord() erst
mit dem Windows Installer 3.1 zur Verfgung gestellt wurde.
Wichtig Ende
375
Kapitel 9
Externe Benutzeroberflchen
Beim Verwenden der Funktionen sind die Argumente wie folgt zu verwenden:
dwUILevel: Durch diesen Parameter kann die Darstellungsform der Benutzeroberflche festgelegt
werden. Die mglichen Werte sind in Tabelle 9.75 zusammengefasst.
phWnd: Hierbei handelt es sich um einen Ein- und Ausgabeparameter. Dem Parameter kann ein
Fensterhandle zugewiesen werden. Das hiermit referenzierte Fenster wird als Eigentmer der
erzeugten Benutzeroberflche registriert. Nach erfolgreichem Aufruf der Funktion, wird diesem
Parameter der vorherige Besitzer der Benutzeroberflche zugewiesen. Wurde der Eigentmer nicht
verndert, wird Null zurckgegeben.
Wird die Funktion erfolgreich ausgefhrt, wird der Wert der vorherigen Darstellungsform
zurckgeliefert. Wird jedoch eine ungltige Darstellungsform als Parameter bergeben, wird
INSTALLUILEVEL_NOCHANGE zurckgegeben. Die Standarddarstellungsform die beim laden der
msi.dll festgelegt wird ist INSTALLUILEVEL_DEFAULT. Als Fenster-Handle wird die 0 bergeben,
so dass der Windows-Desktop als Eigentmer fungiert.
Wert
Beschreibung
INSTALLUILEVEL_
FULL
Verwendet die im Paket definierte Benutzeroberflche. Hierzu werden die WizardSequenz, die Fortschrittsanzeige und die Fehlerdialoge benutzt.
INSTALLUILEVEL_
REDUCED
Verwendet die im Paket definierte Benutzeroberflche. Hierbei wird die WizardSequenz nicht bercksichtigt.
INSTALLUILEVEL_
BASIC
INSTALLUILEVEL_
DEFAULT
INSTALLUILEVEL_
NONE
INSTALLUILEVEL_
ENDDIALOG
Am Ende der erfolgreichen und auch fehlerhaften Installation wird ein modaler
Dialog angezeigt. Er wird jedoch nicht angezeigt, wenn die Installation vom
Benutzer abgebrochen wurde. Diese Option kann in Verbindung mit
INSTALLUILEVEL_BASIC, INSTALLUILEVEL_NONE und
INSTALLUILEVEL_DEFAULT verwendet werden.
INSTALLUILEVEL_
PROGRESSONLY
Der Installer zeigt eine einfache Fortschrittsanzeige. Er zeigt aber keine modalen
Dialogfelder und Fehlermeldungen an. Diese Option kann nur in Verbindung mit
INSTALLUILEVEL_BASIC verwendet werden.
INSTALLUILEVEL_
NOCHANGE
INSTALLUILEVEL_
HIDECANCEL
Der Installer zeigt eine einfache Fortschrittsanzeige, aber keine Schaltflche zum
Abbrechen der Installation. Hierdurch ist es dem Benutzer nicht mglich, die
Installation vorzeitig zu beenden. Diese Option kann nur in Verbindung mit
INSTALLUILEVEL_BASIC verwendet werden.
INSTALLUILEVEL_
SOURCERESONLY
376
Externe Benutzeroberflchen
Kapitel 9
Programmtechnische Umsetzung
Unter Verwendung der Deployment Tools Foundation ist die Realisierung einer externen
Benutzeroberflche wesentlich einfacher mglich, als sich nach der Betrachtung der zuvor genannten
Funktionen
vermuten
lsst.
Die
Klasse
Installer
des
Namensraums
Microsoft.Deployment.WindowsInstaller enthlt die fr diese Zwecke relevanten Funktionen
SetExternalUI() und SetInternalUI(). Zur Registrierung einer externen Benutzeroberflche ist
SetExternalUI() zu verwenden. Die erforderlichen Rckruffunktionen werden durch die Delegaten
ExternalUIHandler() und ExternalUIRecordHandler() modelliert. Die Referenz auf die Instanz der
Rckruffunktionen ist dem Funktionsaufruf SetExternalUI() anzufgen. Diese Funktion arbeitet mit
einer Parameterberlagerung, so dass beide Formen der Delegaten verwendet werden knnen, wie
Listing 9.79 zeigt.
/// <summary>
/// Installation starten
/// </summary>
private void Install(string fileName)
{
// Interne Benutzeroberflche konfigurieren
Installer.SetInternalUI(InstallUIOptions.Silent | InstallUIOptions.SourceResolutionOnly);
// Festlegen der Meldungen, die abonniert werden sollen
InstallLogModes logMode = InstallLogModes.ActionData |
InstallLogModes.ActionStart |
InstallLogModes.Progress;
// Festlegen des Textbasierten Nachrichten-Handlers
ExternalUIHandler textbasedHandler = new ExternalUIHandler(this.UIHandler);
Installer.SetExternalUI(textbasedHandler, logMode);
// Festlegen des Datensatzbsierten Nachrichten-Handlers
ExternalUIRecordHandler recordbasedHandler = new ExternalUIRecordHandler(this.UIRecordHandler);
Installer.SetExternalUI(recordbasedHandler, logMode);
// Produkt installieren
Installer.InstallProduct(fileName, string.Empty);
}
/// <summary>
377
Kapitel 9
Externe Benutzeroberflchen
Dieses Beispiel soll nur die Basisimplementierung zeigen. Es ist erkennbar, dass zunchst die
Darstellungsform der internen Benutzeroberflche verndert wird, wobei diese nur verwendet wird,
falls eine Installationsquelle ausgewhlt werden muss. Diese Voreinstellung sollte immer
vorgenommen werden, da eine externe Benutzeroberflche diesbezgliche Meldungen zwar
empfangen aber keine Aktionen daraus ableiten kann. Im Weiteren werden die Instanzen der
jeweiligen Rckruffunktionen erstellt, die dann dem Funktionsaufruf SetExternalUI() angefgt
werden. Dieser Funktion werden ebenfalls die Nachrichtenarten bergeben, die vom externen Handler
behandelt werden sollen. Weiterhin sind die beiden Nachrichten-Handler erkennbar, die durch die
Funktionen UIRecordHandler() und UIHandler() reprsentiert werden. Es ist erkennbar, dass diese
den Wert None zurckliefern. Hierbei handelt es sich um einen Aufzhlungstypen der dem Wert 0
entspricht. Das bedeutet in diesem Szenario, dass zunchst die Rckruffunktion UIRecordHandler()
aufgerufen wird. Da diese den Wert 0 zurckliefert, wird auch die Funktion UIHandler() aufgeufen.
Da auch diese 0 liefert, wird die Nachricht auch an die interne Oberflche weiter geleitet. Die
Darstellung der internen Benutzeroberflche ist deaktiviert, so dass hier zunchst keine visuellen
Ausgaben erfolgen. Betrachten wir nochmal den Filter fr die Nachrichten. Es werden nur die
Nachrichten ActionData, ActionStart und Progress an den externen Handler bermittelt. Alle anderen
Nachrichtentypen werden in diesem Fall nicht weiter behandelt, da die interne Benutzeroberflche
deaktiviert wurde. Die Ausnahme davon betrifft das Szenario, in dem eine neue Installationsquelle
angegeben werden muss. Dieser wird durch die interne Oberflche behandelt, da die Darstellungsform
entsprechend gewhlt wurde.
378
Externe Benutzeroberflchen
Error
None
OK
Cancel
Abort
Retry
Ignore
Yes
No
Kapitel 9
= -1,
= 0,
= 1,
= 2,
= 2,
= 3,
= 4,
= 5,
= 6,
Hierbei ist zu bercksichtigen, dass die mglichen Werte von der Art der empfangenen Meldung
abhngig sind. Wird beispielsweise die Meldung InstallLogModes.ActionData empfangen, macht es
keinen Sinn diese mit MessageResult.Retry zu beantworten. Betrachten wir an dieser Stelle nochmal
die Signatur des Delegaten zur Definition eines datensatzbasierten Nachrichten-Handlers.
internal delegate int ExternalUIRecordHandler(
IntPtr context,
int messageType,
int recordHandle);
Betrachten Sie den fr die Erluterung relevanten Parameter messageType. Hierbei handelt es sich um
eine Ganzzahl, die zunchst Auskunft ber die empfangene Nachrichtenart gibt. Dieses ist aber nicht
alles, denn der Informationsgehalt kann weitaus hher sein. So kann dieser Parameter auch
Gestaltungsmerkmale eines Meldungsfelds (MessageBox) enthalten. Betrachten Sie zum besseren
Verstndnis das folgende Beispiel.
Es wird eine Installation unter Verwendung der Basisoberflche durchgefhrt. Das Kopieren einer
Datei kann nicht erfolgreich durchgefhrt werden, da diese Datei nicht vorhanden ist oder auf die Datei
nicht zugegriffen werden kann. In einem solchen Fall wird das in Abbildung 9.82 dargestellte
Meldungsfeld angezeigt.
Es ist erkennbar, dass dieses Meldungsfeld ber einen Hinweistext, ein Symbol und die Schaltflchen
Wiederholen und Abbrechen verfgt. Bei der Verwendung eines externen Nachrichten-Handlers ist die
Anzeige eines entsprechenden Hinweises ebenfalls erforderlich. Hierbei muss der Dialog natrlich
individuell kreiert werden, wozu die Gestaltungsinformationen bereitgestellt werden mssen. Es ist
nicht ausreichend, den Dialog alleine von der Nachrichtenart abhngig zu machen. So kann es sein,
dass fr eine Aktivitt unterschiedliche Reprsentationen eingesetzt werden. Wie in Abbildung 9.82
ersichtlich, wird bei einem Zugriffsfehler das dargestellte Meldungsfeld angezeigt. Allerdings ist das
nur die halbe Wahrheit. Die Datei, die nicht vorhanden ist, wurde in der Tabelle File mit dem Attribut
msidbFileAttributesVital gekennzeichnet. Das bedeutet, die Datei ist fr die zu installierende
Anwendung zwingend erforderlich. Aus diesem Grund stehen im Meldungsfeld auch nur die
Schaltflchen Abbrechen und Wiederholen zur Verfgung. Wrde es sich jedoch um keine durch
Persnliche Ausfertigung fr Martin Martinsson
379
Kapitel 9
Externe Benutzeroberflchen
int MB_ICONMASK
int MB_DEFMASK
int MB_TYPEMASK
= messageType &
= messageType &
= messageType &
= messageType &
= 0xF0;
= 0xF00;
= 0xF;
0x7F000000;
MB_TYPEMASK;
MB_ICONMASK;
MB_DEFMASK;
Die Verwendung der Deployment Tools Foundation vereinfacht diese Schritte erheblich. In der
Signatur der Nachrichten-Handler ist erkennbar, dass die Informationen zur Gestaltung des
Meldungsfeldes direkt bergeben werden, wie auch in Listing 9.80 gezeigt wird. Hierbei ist natrlich
zu bercksichtigen, dass die behandelten Meldungstypen auch beim Registrieren des Handlers
abonniert wurden.
private MessageResult UIRecordHandler(InstallMessage messageType, Record messageRecord,
MessageBoxButtons buttons, MessageBoxIcon icon, MessageBoxDefaultButton defaultButton)
{
switch (messageType)
{
case InstallMessage.Error:
// Ein Fehler ist aufgetreten. Die Hinweistexte und die Darstellungsoptionen
// fr das Hinweisfeld werden bernommen
return (MessageResult)MessageBox.Show(messageRecord.ToString(), "Error",
buttons, icon, defaultButton);
case InstallMessage.FatalExit:
return (MessageResult)MessageBox.Show(messageRecord.ToString(), "FatalExit",
buttons, icon, defaultButton);
default:
// Keine Behandlung der Nachricht. Diese soll durch den Windows Installer behandelt werden
return MessageResult.None;
}
}
Aus diesem Beispiel wir deutlich, dass der Rckgabewert in erster Linie von der Nachrichtenart und
darauf aufbauend vom Ergebnis des Meldungsfeld-Aufrufes abhngig ist. Allerdings gibt es
Rckgabewerte die jederzeit verwendet werden knnen und von keinem Meldungsfeld abhngig sind.
So kann jederzeit der Rckgabewert MessageResult.Error gesendet werden. Hiermit wird ausgedrckt,
dass im externen Nachrichten-Handler ein Fehler aufgetreten ist. Wird hingegen MessageResult.None
zurckgegeben, so besagt dieses, dass die Nachricht durch den externen Handler nicht behandelt wurde
und dass dieses durch den Installer erfolgen soll. Weiterhin existieren Meldungsarten wie
INSTALLMESSAGE_ACTIONDATA
und
INSTALLMESSAGE_PROGRESS,
die
keine
Darstellungsoptionen fr ein Meldungsfeld enthalten. Werden diese Meldungen mit
MessageResult.OK beantwortet, bedeutet dies, dass die Nachricht durch den externen Handler
380
Externe Benutzeroberflchen
Kapitel 9
Es ist offensichtlich, dass die Zeichenfolge zunchst in ihre einzelnen Bestandteile zu zerlegen ist,
damit sie weiter verarbeitet werden kann. Bei der bergabe der Informationen als Record, kann dieser
Schritt bersprungen werden, da die Bestandteile der Nachricht bereits eigenen Feldern zugeordnet
wurden. Allerdings gibt es auch Informationen die nicht weiter zerlegt werden knnen und somit direkt
weiterzuverarbeiten sind. In der nachfolgenden Tabelle 9.76 sind die Nachrichtentypen aufgefhrt, die
eine einzelne Zeichenfolge enthalten und zustzlich ber Informationen zur Gestaltung eines
Meldungsfelds verfgen.
Meldung
Beispiel
Beschreibung
INSTALLMESSAGE_
FATALEXIT
INSTALLMESSAGE_
ERROR
INSTALLMESSAGE_
WARNING
INSTALLMESSAGE_
INFO
Formatierter Installationsprotokolleintrag.
Die Zeichenfolge kann direkt verwendet
381
Kapitel 9
Externe Benutzeroberflchen
werden.
INSTALLMESSAGE_
USER
INSTALLMESSAGE_
OUTOFDISKSPACE
Der Installationsprozess oder besser gesagt, die durchzufhrenden Aktionen werden durch die
jeweiligen Sequenztabellen festgelegt. Bei einer Standardinstallation sind dieses die Tabellen
InstallUISequence und InstallExecuteSequence. Es ist bekannt, dass beide Tabellen zum Teil
identische Aktionen enthalten, so dass auf Grundlage des Aktionsnamens nicht ermittelt werden kann,
in welcher Sequenz und letztlich in welchem Prozess sie ausgefhrt werden. Ein solches Szenario lsst
sich aber ber die folgenden Nachrichten abprfen.
INSTALLMESSAGE_INITIALIZE und INSTALLMESSAGE_TERMINATE: Diese Nachrichten
kennzeichnen den Beginn und das Ende der Abarbeitung der UI-Sequenz. Sie enthalten keine weiteren
Daten. Obwohl bei einer unbeaufsichtigten und einer Basisinstallation die UI-Sequenztabelle nicht
verwendet wird, werden diese Nachrichten dennoch gesendet. Hieraus lsst sich verlsslich ableiten,
dass alle Aktionen, die nach INSTALLMESSAGE_TERMINATE ausgefhrt werden, aus der
Ausfhrungssequenz stammen und somit durch den Server-Prozess verarbeitet werden.
INSTALLMESSAGE_SHOWDIALOG: Diese Nachricht wird gesendet wenn ein Dialog angezeigt
wird. Entgegen den vorherigen Meldungen wird diese nur gesendet, wenn die UI-Sequenz tatschlich
verarbeitet wird, wie dass bei vollstndiger und reduzierter Benutzeroberflche der Fall ist. Diese
Nachricht verfgt ebenfalls ber den Namen des anzuzeigenden Dialogs, wie auch die nachfolgende
Aufrufsequenz darstellt:
Initialize:
ShowDialog:
ShowDialog:
ShowDialog:
ShowDialog:
Terminate:
PrepareDlg
WelcomeDlg
ProgressDlg
ExitDialog
Wie bereits angesprochen, sollte die Darstellungsform der internen Benutzeroberflche auf
INSTALLUILEVEL_NONE in Kombination mit INSTALLUILEVEL_SOURCERESONLY festgelegt
382
Externe Benutzeroberflchen
Kapitel 9
werden.
Hinweis Ende
Mit [1] wird die Uhrzeit angegeben, an der die Aktion gestartet wurde. Der Name der Aktion wird
durch [2] angegeben. Schlielich wird durch [3] eine Beschreibung der Aktion ausgedrckt. Der
Name der Aktion wird aus der jeweiligen Sequenztabelle bernommen. Die zugehrende
Beschreibung kommt hingegen aus der Spalte Description der Tabelle ActionText, oder wird durch den
Aufruf der Funktion MsiProcessMessage() im Klartext bergeben. Ein Beispiel fr diesen
Meldungstyp ist:
ActionStart: Action 10:02:05: InstallFiles. Copying new files
formatText = messageRecord.GetString(0);
name = messageRecord.GetString(1);
description = messageRecord.GetString(2);
message = messageRecord.ToString():
//
//
//
//
Es wird deutlich, dass die einzelnen Elemente ber die Methode Record.GetString(Index) ermittelt
werden knnen. Es werden auch noch Nachrichten vorgestellt, die entsprechende Informationen nicht
als Zeichenfolge, sondern als Ganzzahl bereitstellen. Um hier eine sptere Umwandlung des Datentyps
zu vermeiden, knnen diese Informationen durch Record.GetInteger(Index) abgerufen werden.
INSTALLMESSAGE_ACTIONDATA: Nachdem eine Aktion gestartet wurde und somit die
Nachricht INSTALLMESSAGE_ACTIONSTART gesendet wurde, knnen eine beliebige Anzahl
Nachrichten vom Typ INSTALLMESSAGE_ACTIONDATA empfangen werden. Diese Nachricht und
auch die internen Strukturen sind flexibel und orientieren sich an der jeweiligen Aktion. Hierzu wird
auf die Spalte Template der Tabelle ActionText zugegriffen. Diese enthlt beispielsweise fr die Aktion
InstallFiles den folgenden Eintrag:
File: [1] Directory: [9] Size: [6]
Das Objekt vom Typ Record enthlt in diesem Fall 9 Felder, die den folgenden Inhalt aufweisen.
0: {{InstallFiles: }}File: [1],
1: Football.exe
2:
Directory: [9],
Size: [6]
383
Kapitel 9
Externe Benutzeroberflchen
3:
4:
5:
6: 44032
7:
8:
9: C:\Program Files (x86)\Football 2008\
Durch die Funktion Record.ToString() werden die Parameter in die Vorlage eingefgt, die immer im
Feld mit dem Index 0 zu finden ist. Hierdurch ergibt sich die folgende formatierte Ausgabe:
File: Football.exe,
Size: 44032
Diese Option ist natrlich nicht nur auf diesen Nachrichtentyp begrenzt, sondern ist fr die anderen
Nachrichtenarten sinngem zu verwenden.
INSTALLMESSAGE_FILESINUSE
und
INSTALLMESSAGE_RMFILESINUSE:
Diese
Nachrichten werden gesendet, falls eine Datei in Verwendung ist, die durch die Installation
berschrieben oder gelscht werden soll. Die Nachricht INSTALLMESSAGE_RMFILESINUSE wird
gesendet, falls der Neustart-Manager von Windows Vista und Windows Server 2008 aktiv ist, und die
entsprechenden Manahmen veranlassen kann. Der Inhalt dieser Meldung ist davon abhngig ober der
zeichenfolgenbasierte Handler oder der datensatzbasierte Handler verwendet wird. Der
zeichenfolgenbasierte Handler enthlt lediglich den Hinweis, dass einige Anwendungen geschlossen
werden mssen. Der datenbankbasierte Handler liefert auch Informationen zu der Anwendung die
geschlossen werden sollte. Hierzu enthlt das Objekt vom Typ Record mehrere Felder. Im Feld mit
dem Index 0 befindet sich die Aufforderung zum Schlieen der Anwendung. Die Anzahl der
weiteren Felder ist abhngig von der Anzahl der zu schlieenden Anwendungen. Fr jede dieser
Anwendungen werden zwei Felder bentigt. Das erste Feld dieses Paares enthlt die Prozess-ID und
das zweite den Namen bzw. Titel der Anwendung, wie auch das folgende Beispiel zeigt.
0:
1:
2:
3:
4:
Die folgenden Anwendungen sollten geschlossen werden, bevor Sie die Installation fortsetzen:
2624
Winword
324
Outlook
Auf Basis dieser Informationen knnen sehr individuelle und komfortable Dialoge konstruiert werden,
wie das Beispiel aus Abbildung 9.83 zeigt:
384
Externe Benutzeroberflchen
Kapitel 9
Der zuvor dargestellte Dialog enthlt Optionen um den weiteren Installationsprozess zu beeinflussen.
So ist es mglich die Anwendungen automatisch schlieen zu lassen oder die Installation abzubrechen.
Weiterhin ist es mglich die Anwendung in diesem Zustand zu belassen, so dass ein Computerneustart
erforderlich wird. Diese Optionen mssen natrlich nach dem Schlieen des Dialogs an den Windows
Installer bermittelt werden, wozu der Nachricht der entsprechende Rckgabewert zuzuweisen ist. Die
Nachricht INSTALLMESSAGE_RMFILESINUSE kann mit den in Tabelle 9.77 aufgefhrten Werten
beantwortet werden.
Rckgabe
Wert
Beschreibung
OK
Cancel
Retry
Ignore
Die Aufforderung wird ignoriert und die Installation wird fortgesetzt. Ein
Computerneustart ist erforderlich.
No
Falls das Installationspaket ber den Dialog MsiRMFilesInUse verfgt, wird die
Nachricht 1610 gesendet. Falls ein solcher Dialog nicht vorhanden ist, wird die
Nachricht INSTALLMESSAGE_FILESINUSE gesendet.
Error
-1
Falls die Nachricht INSTALLMESSAGE_RMFILESINUSE weder vom externen noch vom internen
Handler
behandelt
wurde,
sendet
der
Windows
Installer
die
Nachricht
INSTALLMESSAGE_FILESINUSE. Wird auch diese Nachricht von keinem Handler behandelt und
bleiben die Anwendungen geffnet, ist ein Neustart des Computers erforderlich.
INSTALLMESSAGE_INSTALLSTART: Diese Nachricht steht erst mit dem Windows Installer 4.5
zur Verfgung und wird beim Starten der Installation eines Produkts gesendet. Die Nachricht besteht
aus zwei Feldern, wobei das erste Feld den Produktnamen und das zweite Feld den Produktcode
enthlt.
385
Kapitel 9
Externe Benutzeroberflchen
INSTALLMESSAGE_ INSTALLEND: Diese Nachricht steht erst mit dem Windows Installer 4.5 zur
Verfgung und wird nach dem Beenden eines Produkts gesendet. Die Nachricht besteht aus drei
Feldern, wobei das erste Feld den Produktnamen und das zweite Feld den Produktcode enthlt. Das
dritte Feld enthlt den Rckgabewert der ausgefhrten Top-Level-Aktion.
INSTALLMESSAGE_COMMONDATA: Hierbei handelt es sich um Nachrichten mit allgemeinen
Informationen zu Sprache, Produktname und Abbruchmglichkeiten. Dieser Nachrichtentyp wird bei
Verwendung einer externen Oberflche bentigt, um Meldungsfelder konfigurationsabhngig anpassen
zu knnen. Somit kann anhand dieser Meldung die Lokalisierung bestimmt und es knnen die
geeigneten Texte ermittelt werden. Darber hinaus kann der Titel des Meldungsfeldes richtig
festgelegt werden. Relevant ist auch die Schaltflche zum Abbrechen der Installation. Die Anzeige
dieser Schaltflche kann beispielsweise durch das Argument INSTALLUILEVEL_HIDECANCEL bei
Verwendung der Funktion SetInternalUI() verhindert werden. Diese Einstellung wirkt sich zunchst
nur auf die interne Oberflche aus, sollte aber auch bei der Darstellung der externen Oberflche
bercksichtigt werden.
Der Nachrichtentyp INSTALLMESSAGE_COMMONDATA besteht aus maximal drei Feldern. Jedes
Feld beginnt mit der Feldnummer der ein Doppelpunkt folgt und anschlieend weitere Daten enthlt,
wie dieses auch nachfolgend dargestellt wird:
1:<Daten> 2:<Daten> 3:<Daten>
Es mssen nicht immer alle Felder verwendet werden; es existieren auch Nachrichten, bei denen
Felder eine leere Zeichenfolge oder Null enthalten. Wichtig ist an dieser Stelle immer der Inhalt des
ersten Feldes, da hiermit der Informationsgehalt der Nachricht dargestellt wird. Ein Beispiel fr eine
Nachricht mit sprachspezifischen Informationen ist nachfolgend dargestellt:
1:0
2:1033
3:1252
Feld 1 enthlt hierbei den Wert 0, denn hierdurch wird eine Nachricht vom Typ
INSTALLMESSAGE_COMMONDATA gekennzeichnet, die Sprachinformationen (Language) enthlt.
Feld 2 enthlt die Sprachkennung (LANGID). In dem Beispiel ist dieses die 1033, die fr Englisch
steht. Feld 3 enthlt letztlich die Codepage, in dem Beispiel die 1252.
Enthlt das Feld 1 den Wert 1, wird damit eine Nachricht bezeichnet, die den Titel fr
Meldungsfelder enthlt (Caption). Dieser Titel resultiert letztlich aus dem Produktnamen und ist
gerade bei paketbergreifenden Transaktionen sehr hilfreich. Denn hiermit kann der Name des
Produktes abgerufen werden, das aktuell installiert wird.
1:1
2: Football 2008
3:Null
Wie bereits erlutert wird durch den Wert 1 im ersten Feld eine Nachricht definiert, die den Titel des
Produkts enthlt, der schlielich in Feld 2 zu finden ist. Feld 3 wird bei diesem Typ nicht verwendet
und enthlt Null oder eine leere Zeichenfolge. Ich bin bereits auf die Mglichkeit des Ausblendens der
Schaltflche Abbrechen zu sprechen gekommen. Enthlt das erste Feld der Nachricht den Wert 2,
wird hiermit der Status der Schaltflche Abbrechen (CancelShow) dargestellt wie das folgende
Beispiel zeigt:
1:2
2:1
Enthlt das Feld den Wert 0, wird hiermit ausgedrckt, dass die Schaltflche Abbrechen bei einer
internen Darstellungsform nicht angezeigt wird. Ein Wert von 1 bedeutet somit, dass die
386
Externe Benutzeroberflchen
Kapitel 9
Schaltflche angezeigt wird und die Installation somit auch abgebrochen werden kann. Eine
Zusammenfassung dieser Darstellungsformen ist in Tabelle 9.78 zu finden.
Beschreibung
Language
Caption
CancelShow
Feld 1
Feld 2
Feld 3
Null
Null
Beispiel
1:0 2:1033
1:2 2:1
3:1252
Ein programmtechnischer Ansatz zum Ermitteln der einzelnen Informationen wird in Listing 9.81
dargestellt.
// Nachricht in die Bestandteile zerlegen und Variablen zuordnen
private void ProcessCommonDataMessage(Record dataRecord)
{
if (dataRecord == null || dataRecord.FieldCount == 0)
return;
int fieldCount = dataRecord.FieldCount;
int progressType = dataRecord.GetInteger(1);
switch (progressType)
{
case 0: // Sprache
if (fieldCount < 3)
return;
// Sprache bernehmen
this.langid = dataRecord.GetInteger(2);
this.codepage = dataRecord.GetInteger(3);
break;
case 1: // Titel
if (fieldCount < 2)
return;
// Titel bernehmen
this.productTitle = dataRecord.GetString(2);
break;
case 2: // Schaltflche Abbrechen
if (fieldCount < 2)
return;
// Schaltflche ausblenden wenn Feld 2 den Wert 0 enthlt
this.hideButton = (dataRecord.GetInteger(2) == 0);
387
Kapitel 9
Externe Benutzeroberflchen
break;
}
}
Reset
ActionInfo
ProgressReport
ProgressAddition
Feld 1
Feld 2
Maximale Anzahl
der Teilstriche.
Anzahl der
Teilstriche, um die
der Fortschritt bei
jeder Meldung vom
Typ
INSTALLMESSAGE_
ACTIONDATA
verndert wird.
Feld 3
Richtung des
Wird nicht
Wird nicht
388
Externe Benutzeroberflchen
Kapitel 9
Fortschritts:
0 = Vorwrts,
1 = Rckwrts.
verwendet.
verwendet.
Feld 4
Ausfhrungsstatus:
0 = Berechnung
luft,
1 = Skript wird
ausgefhrt.
Wird nicht
verwendet.
Wird nicht
verwendet.
Wird nicht
verwendet.
Beispiel
1: 0 2: 68032 3: 0 4:
0
1: 1 2: 24000 3: 1 4:
0
1: 2 2: 32768 3: 0
4: 0
1: 3 2: 9000 3: 0 4:
0
Es wird deutlich, dass beim Konstruieren einer Fortschrittsanzeige einige Faktoren zu bercksichtigen
sind, die letztlich in das Design einflieen sollten. Im nachfolgenden Listing 9.82 findet sich ein
komplexes Beispiel zur Realisierung einer solchen Anforderung, bei dem die gesamte Logik in eine
eigene Klasse mit der Bezeichnung ProgressCounter ausgelagert wurde. Von dieser Klasse ist
zunchst eine Instanz zu erstellen, damit innerhalb des externen Nachrichten-Handlers darauf
zugegriffen werden kann. In diesem sind die folgenden Zeilen letztlich fr die Aktualisierung der
Fortschrittsanzeige erforderlich.
this.progressCounter.ProcessMessage(messageType, messageRecord);
this.progressBar.Value = (int)(this.progressBar.Minimum + this.progressCounter.Progress *
(this.progressBar.Maximum - this.progressBar.Minimum));
Der erste Befehl leitet die Nachricht an die Klasse weiter, in der die einzelnen Berechnungen
ausgefhrt und letztlich an die Eigenschaft Progress ein Wert zwischen 0 und 1 bergeben wird.
Diese Eigenschaft wird im nchsten Befehl angegriffen und mit den Eigenschaften Minimum und
Maximum der Fortschrittsanzeige kombiniert und anschlieend als Wert zugewiesen. Der
Programmcode zum Berechnen des Fortschritts ist relativ unspektakulr und sollte auch einfach
nachvollzogen werden knnen. Beim Instanziieren der Klasse kann ein Wert mit bergeben werden,
der die Gewichtung fr den skriptbasierten Installationsteil festlegt.
internal class ProgressCounter
{
private int maximumValue;
private int currentValue;
private int step;
private bool moveForward;
private bool enableActionData;
private int progressPhase;
private double scriptPhaseWeight;
//
//
//
//
//
//
//
Maximum
Aktueller Wert
Schrittgre
Fortschrittsanzeige vorwrts durchlaufen
Aktionsdaten werden hochgezhlt
Kennzeichnet die jeweilige Phase
Gewichtung der Skriptphase
389
Kapitel 9
Externe Benutzeroberflchen
: this(0.5) {}
// Erstellt eine Instanz des Objektes. Ermglicht die Vernderung in der Gewichtung der Skriptphase
public ProgressCounter(double scriptPhaseWeight)
{
// Gltigkeit des Wertes prfen und Daten bertragen
if (!(0 <= scriptPhaseWeight && scriptPhaseWeight <= 1))
throw new ArgumentOutOfRangeException("scriptPhaseWeight");
this.scriptPhaseWeight = scriptPhaseWeight;
}
// Nachricht verarbeiten
public void ProcessMessage(InstallMessage messageType, Record messageRecord)
{
// Nachrichtentyp auswerten
switch (messageType)
{
case InstallMessage.ActionStart: // Start einer Aktion
if (this.enableActionData)
this.enableActionData = false;
break;
case InstallMessage.ActionData: // Aktionsdaten
if (this.enableActionData)
{
// Falls eine Meldung vom Typ ActionInfo empfangen wurde den aktuellen Wert verndern.
if (this.moveForward)
this.currentValue += this.step;
else
this.currentValue -= this.step;
this.UpdateProgress();
}
break;
case InstallMessage.Progress: // Fortschritt aktualisieren
this.ProcessProgressMessage(messageRecord);
break;
}
}
390
Externe Benutzeroberflchen
Kapitel 9
if (fieldCount < 4)
return;
// Progress-Phase bestimmen
this.progressPhase++;
// Maximalwert setzen
this.maximumValue = progressRecord.GetInteger(2);
if (this.progressPhase == 1)
this.maximumValue += 50;
// Richtung und aktuellen Wert bestimmen
this.moveForward = (progressRecord.GetInteger(3) == 0);
this.currentValue = (this.moveForward ? 0 : this.maximumValue);
this.enableActionData = false;
this.UpdateProgress();
break;
case 1: // Aktionsinformationen
if (fieldCount < 3)
return;
if (progressRecord.GetInteger(3) == 0)
{
this.enableActionData = false;
}
else
{
// Schrittgre bestimmen, die beim Empfang der Nachricht ActionData verwendet wird
this.enableActionData = true;
this.step = progressRecord.GetInteger(2);
}
break;
case 2: // Aktuellen Wert anpassen
if (fieldCount < 2 || this.maximumValue == 0 || this.progressPhase == 0)
return;
if (this.moveForward)
this.currentValue += progressRecord.GetInteger(2);
else
this.currentValue -= progressRecord.GetInteger(2);
this.UpdateProgress();
break;
case 3: // Maximalwert korrigieren
this.maximumValue += progressRecord.GetInteger(2);
break;
}
}
// Indikator fr Fortschritt aktualisieren
391
Kapitel 9
Externe Benutzeroberflchen
Externe Benutzeroberflchen
Kapitel 9
Windows Installer 4.5 enthlt eine Funktionalitt die als integrierte externe Benutzeroberflche
(Embedded External UI) oder abgekrzt EEUI bezeichnet wird. Wie die Bezeichnung bereits
vermuten lsst, handelt es sich hierbei um eine externe Reprsentation, die in ein Installationspaket
integriert wurde. Einfach ausgedrckt wird hierzu die externe Oberflche als Objektbibliothek (.dll)
kompiliert und in einem spezifischen Datenspeicher des Installationspaketes abgelegt. Whrend der
Installation prft der Windows Installer die Existenz einer solchen Bibliothek und verwendet dieses
dann zur Darstellung der Benutzeroberflche. Durch diesen genderten Ansatz zur Darstellung der
Oberflche und noch einige technische Umsetzungen, knnen damit die folgenden Anforderungen
umgesetzt werden:
Mglichkeit der Integration einer externen Benutzeroberflche in ein Installationspaket, wobei alle
gestalterischen Freiheiten beim Design der Oberflche vorhanden sind.
Verwendung der Benutzeroberflche in allen Szenarien, wobei die gewhlte Aktivierungsart zur
Durchfhrung der Installation unerheblich ist.
Verwenden der Benutzeroberflche oder einer speziell angepassten Variante auch in Szenarien, in
denen der Benutzer die Installation unter Verwendung der Basis-Oberflche durchfhrt.
Effiziente Umsetzung, da nicht alle Darstellungen in der externen Oberflche abgebildet werden
mssen. Es besteht die Mglichkeit bestimmte Optionen von der internen Reprsentation erledigen
zu lassen.
Deaktivierung der Darstellung einer integrierten externen Oberflche durch Systemrichtlinien oder
installationsbezogene Eigenschaften.
Verwenden der externen Oberflche auch im Rahmen von paketbergreifenden Transaktionen als
zentrale Oberflche fr alle Pakete.
Es wird deutlich, dass durch diese Funktionalitt die aufgezeigten Problempunkte der Vergangenheit
angehren und somit interessante Alternativen zur internen Reprsentation gefunden wurden.
Integration
Bevor ich auf die programmtechnische Umsetzung einer solchen Oberflche zu sprechen komme,
werde ich zunchst die datenbankspezifische Integrationsmglichkeit erlutern. Dieses ist insofern
notwendig, da hierbei bestimmte Faktoren beeinflusst werden knnen, die im Rahmen der
Programmierung relevant sein knnten. Zur Integration einer externen Benutzeroberflche existiert
eine neue Datenbanktabelle mit der Bezeichnung MsiEmbeddedUI, die ber folgenden Aufbau verfgt.
Spalte
Typ
Gre
Schlssel
Null
Beschreibung
MsiEmbeddedUI
Identifier
s72
FileName
Filename
l255
Attributes
Integer
i2
Konfigurationsoptionen.
MessageFilter
DoubleInteger
i4
Data
Binary
v0
393
Kapitel 9
Externe Benutzeroberflchen
FileName: Hiermit wird der Name festgelegt unter dem die Dateien zur Darstellung der Oberflche
auf dem lokalen System gespeichert werden. Die erforderlichen Dateien befinden sich physisch in dem
Datenspeicher des Feldes Data. Whrend der Installation werden diese extrahiert und unter dem
definierten Namen in einem temporren Verzeichnis gespeichert und von dort verwendet. Die Angabe
des Dateinamens erfolgt im bekannten SFN|LFN-Format (Short FileName|Long Filename) des
Windows Installers. Beim extrahieren wird das lange Dateiformat verwendet, wenn dieses vom
Dateisystem untersttzt wird. Problematisch kann es werden, wenn mehrere Datenstze in dieser
Tabelle vorhanden sind, sich aber der Inhalt dieser Spalte nicht unterscheidet. Hierbei wird letztlich
eine Datei auf dem System abgelegt, aber welche das ist, kann nicht beeinflusst werden.
Attributes: Bei dieser Spalte handelt es sich um ein Bit-Feld, dass die in Tabelle 9.81 dargestellten
Werte aufnehmen kann. Hiermit ist es mglich, zustzliche Informationen zu den binren Daten der
Spalte Data bereit zustellen.
Name
Wert
Beschreibung
None
0 (0x00)
msidbEmbeddedUI
1 (0x01)
msidbEmbeddedHandlesBasic
2 (0x02)
MessageFilter: Hiermit knnen die Nachrichten definiert werden, die an die externe Oberflche
gesendet werden sollen. Dieses Verfahren ist analog zur bereits erluterten Filterung von Nachrichten
unter Verwendung der Funktionen MsiSetExternalUI() und MsiSetExternalUIRecord() zu sehen. Die
Informationen dieser Spalte sind jedoch nur relevant, wenn das Attribut msidbEmbeddedUI fr diesen
Datensatz festgelegt wurde. In diesem Fall darf der Inhalt dieses Feldes nicht Null sein. Im Gegensatz
dazu, darf das Feld Null enthalten, wenn der Datensatz eine Ressource-Datei reprsentiert und die
Spalte Attributes 0 enthlt.
Dieser Spalte kann ein Wert zugewiesen werden, der eine Kombination aus den Elementen der Tabelle
9.82 darstellt. Die hier aufgefhrten Nachrichtentypen sind identisch mit denen, die bei der klassischen
Verwendung einer externen Oberflche zur Verfgung stehen.
Nachricht
InstallMessage
Wert
Bedeutung
INSTALLLOGMODE_
FATALEXIT
FatalExit
1 (0x00001)
INSTALLLOGMODE_
ERROR
Error
2 (0x00002)
INSTALLLOGMODE_
Warning
4 (0x00004)
394
Externe Benutzeroberflchen
Kapitel 9
WARNING
INSTALLLOGMODE_
USER
User
8 (0x00008)
INSTALLLOGMODE_
INFO
Info
16 (0x00010)
INSTALLLOGMODE_
FILESINUSE
FilesInUse
32 (0x00020)
INSTALLLOGMODE_
RESOLVESOURCE
ResolveSource
64 (0x00040)
INSTALLLOGMODE_
OUTOFDISKSPACE
OutOfDiskSpace
128 (0x00080)
INSTALLLOGMODE_
ACTIONSTART
ActionStart
256 (0x00100)
INSTALLLOGMODE_
ACTIONDATA
ActionData
512 (0x00200)
INSTALLLOGMODE_
PROGRESS
Progress
1024 (0x00400)
INSTALLLOGMODE_
COMMONDATA
CommonData
2048 (0x00800)
INSTALLLOGMODE_
INITIALIZE
Initialize
4096 (0x01000)
INSTALLLOGMODE_
TERMINATE
Terminate
8192 (0x02000)
INSTALLLOGMODE_
SHOWDIALOG
ShowDialog
16384 (0x04000)
INSTALLLOGMODE_
RMFILESINUSE
RMFilesInUse
33554432
(0x02000000)
INSTALLLOGMODE_
INSTALLSTART
InstallStart
67108864
(0x04000000)
INSTALLLOGMODE_
INSTALLEND
InstallEnd
134217728
(0x08000000)
Data: Diese Spalte enthlt die tatschlichen binren Daten, also die Objektbibliothek oder die
Ressource-Dateien. Wurde in der Spalte Attribute der Wert msidbEmbeddedUI verwendet, muss dieses
Feld eine Objektbibliothek beinhalten. Im anderen Fall kann dieses Feld eine Datei im beliebigen
Format enthalten.
Persnliche Ausfertigung fr Martin Martinsson
395
Kapitel 9
Externe Benutzeroberflchen
Die Definition der Tabelle MsiEmbeddedUI ist mit Windows Installer-XML durch das Element
<EmbeddedUI/> mglich, wie dieses auch in Listing 9.83 dargestellt wird. Erfolgen keine weiteren
Angaben, werden alle Nachrichten an die externe Oberflche weitergeleitet. Sollen Nachrichten
hingegen von der internen Reprsentation verarbeitet werden, ist dieses mit Hilfe spezieller Attribute
mglich.
<UI>
<EmbeddedUI Id="TestUI" Name="MSIUI.dll" SourceFile =".\Files\EEUI.CA.dll"
IgnoreResolveSource="yes" SupportBasicUI="no">
<EmbeddedUIResource Id="Image1" Name="Setup.png" SourceFile =".\Files\Setup.png"/>
</EmbeddedUI>
</UI>
Listing 9.83: Definition einer integrierten externen Benutzeroberflche in einem Windows Installer-XMLDokument
Wie bereits eingehend erlutert, existiert keine Mglichkeit der Festlegung von Installationsquellen
aus einer externen Benutzeroberflche. Aus diesem Grund wurde das Attribut IgnoreResolveSource
auf Yes gesetzt, so dass diese Nachrichten an die interne Benutzeroberflche weiter geleitet und dort
verarbeitet werden. Voraussetzung dafr ist natrlich die entsprechende Konfiguration der internen
Reprsentation, aber dazu spter mehr.
396
Externe Benutzeroberflchen
Kapitel 9
Visual Studio erstellt nun ein neues Projekt aus dem die automatisch erzeugte Datei customaction.cs
entfernt werden kann. Fgen Sie stattdessen eine neue Klasse hinzu und benennen Sie diese
beispielsweise als eeui.cs. ffnen Sie anschlieend diese Klasse und implementieren Sie das Interface
Microsoft.Deployment.WindowsInstaller.IEmbeddedUI. Fgen Sie dem Projekt weiterhin einen
Verweis auf die Bibliothek System.Windows.Forms.dll hinzu. Danach sollte die Klasse EEUI, das in
Listing 9.84 darstellte Erscheinungsbild aufweisen.
namespace
{
using
using
using
MsiUI
System;
System.Windows.Forms;
Microsoft.Deployment.WindowsInstaller;
397
Kapitel 9
Externe Benutzeroberflchen
{
throw new NotImplementedException();
}
}
}
Listing 9.84: Rudimentre Implementierung zur Verwendung einer integrierten externen Oberflche
In dem Listing sind die drei Funktionen zu erkennen, die es nun zu erlutern gilt. Auch ohne weitere
Modifikationen lsst sich das Projekt bereits kompilieren. Das dargestellte Projekt trgt die
Bezeichnung MsiUI wodurch die Dateien msiui.dll und msiui.ca.dll erzeugt werden. An dieser Stelle
kommt eine Besonderheit zum Tragen. Der Windows Installer kann keine .NET Assemblies
verwenden, wodurch von der Deployment Tools Foundation eine spezielle Implementierung verwendet
wird. Bei der erzeugten Datei msiui.ca.dll handelt es sich um eine native Windows-Bibliothek, die als
Proxy fungiert. Das bedeutet, dass die Aufrufe des Windows Installers zu diesem gelangen und von
hieraus zum .NET-Assembly weitergeleitet werden. Das .NET-Assembly und weitere Referenzen, wie
die Microsoft.Deployment.WindowsInstaller.dll befinden sich als Ressource in der nativen Bibliothek
und werden automatisch extrahiert und im aktuellen Verzeichnis gespeichert.
Aus den Erluterungen lsst sich ableiten, dass die Datei msiui.ca.dll der Spalte Data der Tabelle
MsiEmbeddedUI hinzugefgt werden muss. Alle weiteren Aktionen werden automatisch vom
Windows Installer und von der spezifischen Implementierung dieser Bibliothek veranlasst. Eine
potentielle Fehlerquelle ergibt sich bei der Verwendung unglcklich gewhlter Dateinamen. Es ist zu
beachten, dass diese native Bibliothek noch andere Dateien beinhaltet, die extrahiert und unter Ihrem
regulren Namen gespeichert werden. Wird in der Tabelle MsiEmbeddedUI im Feld FileName nun
einer dieser Dateinamen angegeben, fhrt das unweigerlich zum Fehler, da die erforderliche Datei
nicht erzeugt werden kann. In einem solchen Fall hilft allerdings das Installationsprotokoll weiter,
denn diesem werden hilfreiche Informationen angefgt.
SFXCA: Extracting embedded UI to temporary directory: C:\Users\AK\AppData\Local\Temp\MSI3022
SFXCA: Failed to extract to temporary directory. Cabinet error code 11.
SFXCA: Ensure that no MsiEmbeddedUI.FileName values are the same as any file contained
in the embedded UI package.
Die entsprechenden Eintrge sind durch den Prfix SFXCA gekennzeichnet, da diese Probleme in
der Bibliothek auftreten, die fr das Extrahieren der Dateien verantwortlich. Diese Datei trgt die
Bezeichnung sfxca.dll.
398
Externe Benutzeroberflchen
Kapitel 9
Zeitlich betrachtet wird diese Funktion vom Windows Installer aufgerufen, bevor eine Nachricht
gesendet wird und somit auch bevor die Benutzeroberflche angezeigt wird. Dieses ist notwendig, da
die Darstellung der internen Benutzeroberflche hierdurch modifiziert werden kann. Die Analogie zur
klassischen externen Oberflche wird deutlich. Dabei wurde eine Funktion aufgerufen, in der die
externe Oberflche registriert und die Nachrichten abonniert wurden. Weiterhin wurde die Darstellung
der internen Benutzeroberflche angepasst. Die ersten beiden Optionen werden bei integrierter
Oberflche direkt im Installationspaket festgelegt. Das Modifizieren der internen Benutzeroberflche
erfolgt hingegen in dieser Funktion, wie die folgenden Parameter auch zeigen.
Session: Hierbei handelt es sich um eine Referenz auf die aktuelle Windows Installer-Session, die
durch das Objekt Microsoft.Deployment.WindowsInstaller.Session bereitgestellt wird. Hiermit ist
es mglich auf bestimmte Eigenschaften der Installation zuzugreifen, diese abzurufen und auch zu
verndern. Das Session-Objekt wird aus dem Handle des Installationsmoduls erzeugt, dass den
Installationsprozess ausfhrt. Wird eine Installation unter Verwendung der vollstndigen oder
reduzierten Benutzeroberflche durchgefhrt, geschieht dieses durch den Client-Prozess. Wird
hingegen die Basisdarstellung der Benutzeroberflche gewhlt, erfolgt dieses durch den ServerProzess. Hierbei ist nicht entscheidend, welche Darstellungsoptionen tatschlich zur Verfgung
stehen, sondern die Option, die beispielsweise ber die Befehlszeile festgelegt wurde. Wichtig ist
an dieser Stelle noch, dass das Handle und somit auch das Session-Objekt nur innerhalb dieser
Funktion zur Verfgung steht. Nachdem diese Funktion beendet wurde und die Befehlsausfhrung
zum Windows Installer zurckgekehrt wird, wird das Handle geschlossen. Es ist somit auch nicht
mglich, das Handle oder das Session-Objekt zwischen zu speichern und spter zu verwenden. Es
besteht nur die Mglichkeit, innerhalb dieser Funktion die erforderlichen Werte abzugreifen und
diese statisch abzulegen, damit sie zu einem spteren Zeitpunkt verwendet werden knnen. Es ist
ebenfalls nicht mglich und auch nicht erforderlich das Session-Objekt oder das Handle innerhalb
dieser Funktion zu schlieen. Eine solche Implementierung fhrt zu einem Fehler.
resourcePath: Diesem Argument wird vom Windows Installer der vollstndige Pfad zu dem
Ordner bergeben, in den die Bibliothek und alle weiteren Ressourcen extrahiert wurden. Beim
Speichern der Dateien wird der Dateiname verwendet, der im Feld FileName der Tabelle
MsiEmbeddedUI definiert wurde. Durch diesen Mechanismus wird es mglich, separate Dateien
wie Lizenzbestimmungen oder Bilder dynamisch in die Benutzeroberflche zu laden.
internalUILevel: Hiermit kann der interne Darstellungsmodus geprft und festgelegt werden.
Diesem Argument wird vom Windows Installer der aktuell ausgewhlte Hauptdarstellungsmodus,
also InstallUIOptions.Full, InstallUIOptions.Reduced oder InstallUIOptions.Basic bergeben.
Darber hinaus enthlt dieser Parameter auch zustzliche Darstellungsoptionen wie
InstallUIOptions.EndDialog, InstallUIOptions.ProgressOnly, InstallUIOptions.HideCancel oder
InstallUIOptions.SourceResolutionOnly, sofern vorhanden. Durch diese Implementierung wird es
fr die Darstellungslogik mglich, sehr flexibel auf unterschiedliche Modi zu reagieren und
unterschiedliche Dialogsequenzen bereitzustellen. Wird eine Installation allerdings im
unbeaufsichtigten Modus (InstallUIOptions.Silent) durchgefhrt, wird die integrierte
Benutzeroberflche niemals verwendet.
Da dieser Parameter auch fr die Ausgabe benutzt werden kann, besteht die Mglichkeit die interne
Reprsentation zu verndern. Wie bereits bei der Erluterung zur Funktion SetInternalUI() und
SetExternalUI() angesprochen, sollte die interne Benutzeroberflche im klassischen
Installationsprozess in den unbeaufsichtigten Modus versetzt werden. Hierbei ist natrlich zu
bercksichtigen, dass die Verwaltung der Installationsquellen durch die interne Oberflche
ermglicht wird. Die hiermit festzulegenden Darstellungsoptionen sind in Tabelle 9.83 aufgefhrt.
Persnliche Ausfertigung fr Martin Martinsson
399
Kapitel 9
Externe Benutzeroberflchen
Es ist jedoch nicht mglich eine Erhhung der Darstellungsform zu veranlassen. Das bedeutet
beispielsweise dass bei Anforderung der Basisoberflche hier keine Zuweisung fr die vollstndige
Oberflche vorgenommen werden kann. In einem solchen Fall, wird der Ausgabeparameter
zurckgesetzt, so dass die ursprngliche Oberflchenform verwendet wird. Zu beachten ist
weiterhin, dass bei Zuweisung eines ungltigen Wertes automatisch InstallUIOptions.None
verwendet wird.
Die Funktion Initialize() erwartet einen booleschen Rckgabewert, wobei True die erfolgreiche
Initialisierung der Oberflche bedeutet. Wird hingegen False zurckgeliefert wird die Installation ohne
Verwendung der integrierten Oberflche weiter gefhrt.
Wert
Beschreibung
InstallUIOptions.Full
InstallUIOptions.Reduced
InstallUIOptions.Basic
InstallUIOptions.None
InstallUIOptions.SourceResolutionOnly
Die Implementierung dieser Funktion ist natrlich stark von den Anforderungen und Konfigurationen
abhngig. Sollen beispielsweise die Basis- und die reduzierte Darstellung ebenfalls durch eine externe
Oberflche realisiert werden, sind natrlich unterschiedliche Dialogsequenzen zu implementieren. Das
nachfolgende Listing 9.85 erzeugt eine externe Oberflche hingegen nur bei vollstndiger Darstellung;
alle anderen Szenarien werden durch die interne Reprsentation abgebildet. Zur Deinstallation des
Produktes wird hierbei ebenfalls die interne Oberflche verwendet.
public bool Initialize(Session session, string resourcePath, ref InstallUIOptions internalUILevel)
{
if (session != null)
{
// Eine integrierte Oberflche kann durchaus eine Implementierung fr die Basis- und
// die reduzierte Darstellung besitzen. Hierbei ist das nicht der Fall, so dass
// diese Darstellungsformen durch die interne Reprsentation dargestellt werden.
if ((internalUILevel & InstallUIOptions.Full ) != InstallUIOptions.Full )
return false;
// Die Deinstallation wird ebenfalls ber die interne Reprsentation dargestellt
400
Externe Benutzeroberflchen
Kapitel 9
In dem vorstehenden Listing wird deutlich, dem Darstellungsdialog der Pfad zu den Ressourcen
bergeben wird, so dass diese dynamisch verwendet werden knnen. Nach Anzeige des externen
Dialoges wird die interne Reprsentation modifiziert. So wird diese in den unbeaufsichtigten Modus
versetzt, allerdings wird sie zur Auswahl von Installationsquellen weiterhin verwendet.
Die Funktion wird am Ende des Installationsprozesses aufgerufen. Nach diesem Aufruf werden keine
weiteren Nachrichten an den externen Handler gesendet. Die Objektbibliothek wird anschlieend
entladen. Die programmtechnische Umsetzung ist natrlich wieder von den tatschlichen
Anforderungen abhngig. Die Fortfhrung des Beispiels wird in Listing 9.86 dargestellt.
public void Shutdown()
401
Kapitel 9
Externe Benutzeroberflchen
{
// Externe Oberflche wird geschlossen
if (this.setupWizard != null)
this.setupWizard.Close();
}
Die Methode des Beispiels ist sehr einfach, da keine weiteren Terminierungen durchgefhrt werden
mssen. Somit ist es ausreichend den Installations-Dialog zu schlieen.
Es wird deutlich, dass die Signatur identisch mit der datensatzbasierten Rckruffunktion ist, die beim
Aufruf von Microsoft.Deployment.WindowsInstaller.Installer.SetExternalUI() zugewiesen wird. Somit
sind auch die Argumente identisch, die folgende Informationen enthalten.
messageType: Hierbei handelt es sich um den Typ der Nachricht. Die mglichen Nachrichtenarten
sind in Tabelle 9.82 zusammengefasst. Der fr diese Funktion relevante Wert wird in der Spalte
InstallMessage aufgefhrt.
messageRecord: Enthlt ein Objekt vom Typ Microsoft.Deployment.WindowsInstaller.Record, das
wiederum Informationen enthlt, die von der Art der Nachricht anhngig sind. Der Aufbau und der
Inhalt dieses Objektes wurde bereits im Abschnitt Darstellung der Informationen erlutert.
buttons: Enthlt einen Wert, der die Darstellung der Schaltflchen eines Dialogfeldes definiert.
icon: Enthlt einen Wert, der das Symbol festlegt, dass im Dialogfeld verwendet wird.
defaultButton: Legt die Standardschaltflche fr das Dialogfeld fest.
Die Weiterfhrung des Installationsprozesses kann natrlich durch die geeignete Wahl des
Rckgabewertes beeinflusst werden. Die mglichen Rckgabewerte und die Auswirkung auf den
Installationsprozess wurden bereits im Abschnitt Beeinflussung des Installationsprozesses erlutert.
Die programmtechnische Umsetzung dieser Funktion ist die wahrscheinlich komplexeste
installationsspezifische Implementierung bei der Verwendung einer externen Oberflche. Das
nachfolgende Beispiel behandelt die relevanten Nachrichten zur Darstellung des
Installationsfortschritts. Dieses Beispiel baut auf den Ausfhrungen des Listing 9.85 auf und
verwendet die darin geffnete Benutzeroberflche zur Darstellung der Informationen.
public MessageResult ProcessMessage(InstallMessage messageType, Record messageRecord,
MessageBoxButtons buttons, MessageBoxIcon icon, MessageBoxDefaultButton defaultButton)
{
// Fortschrittsanzeige aktualisieren
402
Externe Benutzeroberflchen
Kapitel 9
this.setupWizard.ProcessMessage(messageType, messageRecord);
switch (messageType)
{
case InstallMessage.FatalExit:
case InstallMessage.Error:
case InstallMessage.Warning:
case InstallMessage.User:
case InstallMessage.OutOfDiskSpace:
// Ein Problem ist aufgetreten. Die Darstellungsoptionen fr das Hinweisfeld werden bernommen
return (MessageResult)MessageBox.Show(messageRecord.ToString(), this.productTitle,
buttons, icon, defaultButton);
case InstallMessage.CommonData:
// Daten ermitteln
this.ProcessCommonDataMessage(messageRecord);
break;
case InstallMessage.ActionStart:
// Aktuelle Aktion darstellen
string actionText = messageRecord.GetString(2);
if (!string.IsNullOrEmpty(actionText))
this.setupWizard.ActionText = actionText;
break;
default:
// Keine Behandlung der Nachricht. Diese soll durch den Windows Installer behandelt werden
return MessageResult.None;
}
// Installation abbrechen
if (this.setupWizard.Cancel)
return MessageResult.Abort ;
return MessageResult.OK ;
}
Zu Beginn dieser Methode wird die Funktion ProcessMessage() des Installationsdialoges aufgerufen.
Hierbei handelt es sich um die bereits bekannte Implementierung zur Auswertung der Nachricht vom
Typ InstallMessage.Progress (INSTALLMESSAGE_PROGRESS), sowie die Aktualisierung der
Fortschrittsanzeige. Im Folgenden werden die einzelnen Nachrichtenarten ausgewertet und davon
abhngige Aktivitten veranlasst und Informationen dargestellt. Alle Nachrichten, die in dieser
Funktion nicht behandelt werden, werden an die interne Reprsentation weiter geleitet. Der
Installationsdialog enthlt eine Schaltflche zum Abbrechen der Installation. Der Status der
Schaltflche wird innerhalb dieser Funktion geprft und falls erforderlich wird die Installation
abgebrochen.
Debuggen
Mitunter kann es erforderlich werden die Objektbibliothek zur Darstellung der Benutzeroberflche zu
debuggen. Die Vorgehensweise hierbei ist identisch mit dem Debuggen von benutzerdefinierten
403
Kapitel 9
Externe Benutzeroberflchen
Aktionen vom Typ Objektbibliothek. Der Windows Installer verwendet die Umgebungsvariable
MsiBreak, um festzustellen, ob eine solche benutzerdefinierte Aktion im Debugger ausgefhrt werden
soll. Hierbei ist zu beachten, dass der Windows Installer die Existenz dieser Umgebungsvariablen nur
prft, wenn die Installation durch einen Systemadministrator durchgefhrt wird. Zum Debuggen einer
Objektbibliothek weisen Sie zunchst der Umgebungsvariablen MsiBreak den Namen der jeweiligen
benutzerdefinierten Aktion zu und starten Sie dann den Installationsprozess. Beim Aufruf der
benutzerdefinierten Aktion durch den Windows Installer erscheint eine Dialogbox in der die ID des
entsprechenden Prozesses angegeben ist. Verbinden Sie den Debugger mit diesem Prozess, ffnen Sie
die jeweiligen Programmquellen, setzen Sie die Haltepunkte und prfen Sie, ob die Symboldateien der
benutzerdefinierten Aktion geladen sind. Nach dem Schlieen der Dialogbox wird die Ausfhrung der
benutzerdefinierten Aktion am ersten Haltepunkt unterbrochen. Nun knnen Sie schrittweise durch den
Programmcode navigieren und die Problemquellen analysieren.
Wie bereits angedeutet, verhlt es sich mit dem Debuggen der integrierten Oberflche hnlich. Hierzu
ist der Umgebungsvariablen MsiBreak die Zeichenfolge MsiEmbeddedUI zuzuweisen, wobei die
Gro- und Kleinschreibung zu beachten ist.
Die Verwendung eines integrierten Chainers erfolgt nach dem gleichen Muster. Auch hierbei ist es
mglich 32-Bit oder 64-Bit Code zu verwenden.
Hinweis Ende
404
Externe Benutzeroberflchen
Kapitel 9
Interne Ablufe
Im bisherigen Verlauf der Erluterungen zur integrierten externen Benutzeroberflche wurden die
hierfr erforderlichen internen Ablufe des Windows Installers nur oberflchig betrachtet. An dieser
Stelle soll nun eine detailliertere Betrachtung folgen, bei der auch relevante Eintragungen im
Installationsprotokoll aufgefhrt werden. Alle Eintragungen des Installationsprotokolls die auf die
integrierte Benutzeroberflche abzielen, sind durch den Prfix EEUI gekennzeichnet.
405
Kapitel 9
Externe Benutzeroberflchen
Im ersten Schritt wird geprft, ob eine eventuell vorhandene integrierte externe Oberflche verwendet
werden kann und darf. Es wird zunchst geprft, ob die Verwendung durch die Systemrichtlinie
MsiDisableEmbeddedUI oder die Eigenschaft MSIDISABLEEEUI deaktiviert wurde. Falls das der Fall
ist, wird eine solche auch nicht verwendet. Dem Installationsprotokoll wird der nachfolgende Eintrag
angefgt:
MSI (c) (2C:18) [13:34:43:015]: EEUI - Disabling MsiEmbeddedUI due to property or policy
Falls das jedoch nicht der Fall ist, wird geprft, ob bereits eine externe Oberflche aktiv ist. Hierbei ist
es unerheblich ob diese externe Oberflche ber den klassischen Mechanismus oder die
Integrationsmglichkeit verwendet wird. Auch in einem solchen Fall wird eine Nachricht dem
Installationsprotokoll angefgt.
MSI (c) (38:10) [13:41:34:429]: EEUI - Disabling MsiEmbeddedUI due to existing external or embedded UI
In dem Fall dass keine externe Oberflche aktiv ist, wird geprft, ob die Tabelle MsiEmbeddedUI
einen Datensatz enthlt, bei dem das Attribut msidbEmbeddedUI gesetzt wurde und ein entsprechender
Nachrichtenfilter definiert ist. Wird die Installation unter Verwendung der Basisoberflche ausgefhrt,
wie dass beispielsweise durch den nachfolgenden Aufruf ermglicht wird, muss der Datensatz
ebenfalls durch das Attribut msidbEmbeddedHandlesBasic gekennzeichnet sein.
msiexec.exe /i <Installationspaket> /qb
Das Installationsprotokoll stellt dieses ebenfalls dar und weist darauf hin, dass Programmcode nun
ausgefhrt wird.
MSI (c) (30:64) [12:59:52:377]: Machine policy value 'MsiDisableEmbeddedUI' is 0
MSI (c) (30:64) [12:59:52:377]: EEUI - Running MsiEmbeddedUI code
Es folgt die Erstellung eines Verzeichnisses im Ordner %temp% des Benutzers. Das Verzeichnis wird
ausschlielich fr diese Installationssitzung verwendet, so dass keine Dateien durch eine andere
Installation in diesem Verzeichnis abgelegt werden knnen. Das gilt auch fr den Fall, dass eine
Installation mehrfach aufgerufen wird. Der Zugriff auf das Verzeichnis wird ebenfalls geregelt, so dass
nur der Systemadministrator und der Benutzer der die Installation ausfhrt, darauf zugreifen drfen.
Der Pfad zu dem Verzeichnis wird der integrierten Oberflche bergeben, so dass diese darauf
zugreifen kann und falls erforderlich auch Unterverzeichnisse erzeugen und Dateien darin ablegen
kann. Die Dateien der Tabelle MsiEmbeddedUI werden nun extrahiert und in dem erzeugten
Verzeichnis gespeichert. Falls mehrere Datenstze in der Tabelle vorhanden sind, die identische
Dateinamen aufweisen, ist das Endergebnis nicht vorhersehbar. Eine Datei wird hierbei gewinnen, aber
es ist jedoch nicht mglich zu sagen, welche Datei gewinnen wird. Kommt es beim Ablegen der
Dateien in dem Verzeichnis zu einem Fehler, wird die Installation abgebrochen.
Nachdem die Dateien extrahiert wurden, wird die durch das Attribut msidbEmbeddedUI
gekennzeichnete Datei in einem speziellen clientseitigen Custom Action-Server geladen und die
Funktion InitializeEmbeddedUI() wird aufgerufen. Soll die Installation hingegen unter Verwendung
der Basisdarstellung ausgefhrt werden, wird die Bibliothek in den impersonierten Custom ActionServer des Server-Prozesses geladen. Kann die Bibliothek nicht geladen werden, wird dem
Installationsprotokoll eine Meldung angefgt und die Installation wird unter Verwendung der internen
Benutzeroberflche fortgesetzt.
406
Externe Benutzeroberflchen
Kapitel 9
MSI (c) (80:C4) [14:30:23:236]: EEUI - Unable to load embedded DLL handler
Kommt es beim Ausfhren der Funktion InitializeEmbeddedUI() zum Fehler, so dass die Funktion mit
dem Rckgabewert ERROR_INSTALL_FAILURE beendet wird, wird die Installation ebenfalls mit
diesem Fehlercode abgebrochen. Dem Installationsprotokollwerden entsprechende Hinweise angefgt.
MSI (c) (80:C4) [14:30:23:236]: EEUI - Unable to load embedded DLL handler
Wird die Funktion InitializeEmbeddedUI() nicht ausgefhrt, so wird die interne Benutzeroberflche
auf den angeforderten Darstellungsmodus gesetzt und die Bibliothek zur Darstellung der integrierten
Oberflche wird entladen. Zu diesem Verhalten gelangt man beispielsweise, wenn die Installation aus
Listing 9.85 in Basisdarstellung ausgefhrt wird. Das Installationsprotokoll weist wie folgt hierauf hin.
MSI (c) (84:E8) [16:02:36:608]: EEUI - Setting handler to be nonfunctional and changing internal UI level
Die Initialisierungsphase ist danach abgeschlossen und die externe Benutzeroberflche steht zur
Verfgung.
407
Kapitel 9
Externe Benutzeroberflchen
mit der Nachricht geschehen soll, wie dieses auch in Abbildung 9.85 aufgezeigt wird.
Es ist unbedingt zu beachten, dass sich eine externe Benutzeroberflche und eine integrierte externe
Benutzeroberflche gegenseitig ausschlieen. Falls eine externe Oberflche aktiv ist, wird eine
eventuell vorhandene integrierte Oberflche nicht aufgerufen. Wird hingegen eine integrierte
Oberflche bereits verwendet, schlgt ein eventueller Aufruf zur Registrierung einer externen
Oberflche fehl.
Wichtig Ende
Installationsmodul herunterfahren
Nachdem die Installation abgeschlossen wurde, muss die externe Benutzeroberflche noch geschlossen
werden. Dieses geschieht whrend der Terminierung des Installationsmoduls. Zunchst wird die
Funktion ShutdownEmbeddedUI() der Bibliothek zur Darstellung der externen Oberflche aufgerufen.
Innerhalb dieser Funktion ist natrlich die Benutzeroberflche zu schlieen. Weiterhin knnen in
dieser Funktion auch weitere Aufrumarbeiten durchgefhrt werden. Nachdem die Verarbeitung zum
Windows Installer zurckgekehrt ist, wird die Objektbibliothek entladen. Die Host-Prozesse (Custom
Action-Server) in denen die Bibliothek ausgefhrt wurde, werden im Rahmen der Aufrumarbeiten des
Installationsmoduls ebenfalls beendet. Anschlieend wird das erzeugte temporre Verzeichnis
gelscht. Dieses geschieht wie gesagt, nachdem die Custom Action-Server heruntergefahren wurden.
408
Externe Benutzeroberflchen
Kapitel 9
Hierdurch kann sichergestellt werden, dass die Objektbibliothek keine weiteren Dateien verwendet.
Falls individuelle Unterverzeichnisse erstellt wurden, werden diese natrlich ebenfalls entfernt, wie
das Protokoll auch zeigt.
MSI (c) (84:0C) [17:07:56:541]: FDeleteFolder: Deleting file
'C:\Users\AK\AppData\Local\Temp\MSI15570\MsiUI.dll'
MSI (c) (84:0C) [17:07:56:541]: FDeleteFolder: Deleting folder
'C:\Users\AK\AppData\Local\Temp\MSI15570\EmbeddedUI'
MSI (c) (84:0C) [17:07:56:541]: FDeleteFolder: Deleting file
'C:\Users\AK\AppData\Local\Temp\MSI15570\Setup.png'
Falls das Entfernen der erzeugten Verzeichnisse hingegen nicht mglich ist, wird dieses auf einen
spteren Zeitpunkt verschoben. Das bedeutet, dass die markiert werden, so dass das Lschen nach dem
nchsten Computerneustart durchgefhrt wird.
409
Kapitel 9
Externe Benutzeroberflchen
Das dargestellte Verhalten entspricht jedoch nicht der Standardeinstellung, ist aber in den meiten
Szenarien die angestrebte Reprsentation. Aus diesem Grund mssen einige Faktoren bercksichtigt
werden. Zunchst geht es um das Starten der Transaktion. Hierzu wird die Funktion
MsiBeginTransaction()
verwendet.
Diese
Funktion
verfgt
ber
den
Parameter
dwTransactionAttributes, dem die Werte 0x0 oder 0x1 zugewiesen werden knnen. Der Wert 0x1 wird
durch die Konstante MSITRANSACTION_CHAIN_EMBEDDEDUI reprsentiert. Wird diesem
Parameter der Wert 0x0 zugeordnet, wird die Benutzeroberflche einer vorherigen Installation
geschlossen. Das bedeutet, dass whrend der Terminierung des Installationsmoduls ebenfalls die
Terminierung der Benutzeroberflche erfolgt, unabhngig davon, ob mehrere Pakete innerhalb einer
Transaktion installiert werden. Anders verhlt es sich, falls der Wert 0x1 zugewiesen wird. In diesem
Fall bleibt die integrierte Benutzeroberflche bis zum Ende der Transaktion geffnet. Das bedeutet,
dass die oben geschilderte Aufrumphase erst durch die Funktion MsiEndTransaction() ausgelst wird.
Zu beachten ist jedoch, dass der Windows Installer automatisch die Transaktionen erzeugt und
beendet, falls dieses nicht explizit durch einen Chainer erfolgt. Der Windows Installer verwendet
hierbei das Attribut MSITRANSACTION_CHAIN_EMBEDDEDUI und stellt somit sicher, dass eine
integrierte Oberflche auch paketbergreifend verwendet wird.
Wichtig ist ebenfalls in diesem Zusammenhang die Funktion MsiJoinTransaction(). Hiermit wird ein
neuer Client als Eigentmer der Transaktion festgelegt. Auch diese Funktion verfgt ber den gerade
dargestellten Parameter, den auch hierbei die identischen Werte zugewiesen werden knnen, die
410
Externe Benutzeroberflchen
Kapitel 9
natrlich zu einem identischen Verhalten fhren. Bei dieser Funktion kann dem Parameter auch der
Wert
0x2
zugewiesen
werden,
der
durch
die
Konstante
MSITRANSACTION_JOIN_EXISTING_EMBEDDEDUI dargestellt wird. Hiermit wird der Windows
Installer angewiesen, die integrierte Benutzeroberflche der Originalinstallation zu verwenden. Verfgt
diese Installation ber keine integrierte Benutzeroberflche, wird dieses Attribut ignoriert.
Anwendungsszenarien
Aus den bisherigen Erluterungen sollte das sehr weite Anwendungsspektrum der integrierten
Benutzeroberflche deutlich geworden sein. Diese bisherigen Betrachtungen waren berwiegend
theoretischer Natur, so dass bestimmte Faktoren noch einiger zustzlicher Erklrungen bedrfen. Ich
denke, dass gerade in Verbindung mit den paketbergreifenden Transaktionen konkrete
Anwendungsszenarien das Verstndnis verbessern sollten.
411
Kapitel 9
Externe Benutzeroberflchen
25. Der
Chainer
ruft
MsiBeginTransaction()
auf,
wobei
das
Attribut
MSITRANSACTION_CHAIN_EMBEDDEDUI gesetzt wird. Das Attribut ist erforderlich, um es der
integrierten Benutzeroberflche von a.msi zu ermglichen, auch die Darstellung weiterer Pakete
zu bernehmen. Durch den Aufruf der Funktion MsiBeginTransaction() wird der Chainer auch als
Eigentmer der Transaktion registriert.
26. Der Chainer ruft MsiInstallProduct() auf um a.msi zu installieren.
Nachdem das Installationspaket geffnet und die Transaktionen und Patches angewendet
wurden, wird die ui.dll aus a.msi in den clientseitigen Custom Action-Server fr integrierte
Oberflchen geladen und die Initialisierung wird vorgenommen.
Die Installation wird wie gewohnt fortgesetzt und wechselt zum Server-Prozess. Die CommitPhase wird nicht ausgefhrt, da der Eigentmer der Transaktion, also der Chainer, dieses noch
nicht explizit veranlasst hat. Die serverseitige Installation wird abgeschlossen und die Kontrolle
wird an den Client zurckgegeben.
Der clientseitige Custom Action-Server fr integrierte Benutzeroberflchen bleibt bestehen, da
das Attribut MSITRANSACTION_CHAIN_EMBEDDEDUI gesetzt wurde. Alle anderen Custom
Action-Server und der Client-Prozess werden terminiert und MsiInstallProduct() wird beendet.
27. Der Chainer ruft MsiInstallProduct() auf um b.msi zu installieren.
Der Chainer verfgt bereits ber den Nachrichten-Kontext um die integrierte
Benutzeroberflche zu verwenden. Hiermit ist gemeint, dass der Custom Action-Server fr
integrierte Oberflchen bereits existiert und der Chainer, als Eigentmer der Transaktion, diesen
auch verwenden kann. Somit wird die ui.dll von a.msi verwendet um die Nachrichten
darzustellen, die bei der Installation von b.msi empfangen werden.
28. Der Chainer ruft MsiEndTransaction() auf um bei allen Paketen die Commit-Phase einzuleiten. Da
fr die Transaktion das Attribut MSITRANSACTION_CHAIN_EMBEDDEDUI gesetzt ist, fhrt
MsiEndTransaction() auch dazu, dass der Custom Action-Server fr integrierte Oberflchen
heruntergefahren wird.
Ein klassisches Anwendungsszenario fr diesen Ablauf ist die Installation mehrerer Pakete unter
Verwendung eines Chainers, wie das beispielsweise bei der Installation des Microsoft SQL Servers
2008 der Fall ist.
Externe Benutzeroberflchen
Kapitel 9
ausgefhrt. Da der Server-Prozess der Eigentmer der Transaktion ist, wird bei der Aktion
InstallFinalize nicht die Commit-Phase eingeleitet, sondern die Tabelle MsiEmbeddedChainer
auf Existenz eines geeigneten Chainers geprft. Hierzu werden die in der Tabelle definierten
Bedingungen ausgewertet. Falls ein solcher Chainer gefunden wurde, wird dieser als
benutzerdefinierte Aktion vom Typ Anwendung ausgefhrt. Der zum Starten erforderlichen
Befehlszeile wird das Handle der Transaktion angefgt. Falls weitere Eigenschaften in der
Tabelle definiert wurden, werden diese ebenfalls der Befehlszeile angefgt.
30. Der Chainer-Prozess ruft MsiJoinTransaction() auf, wobei das Handle der Transaktion verwendet
wird, dass ber die Befehlszeile bergeben wurde. Weiterhin wird das Attribut
MSITRANSACTION_JOIN_EXISTING_EMBEDDEDUI angewendet.
31. Durch
MsiJoinTransaction()
in
Verbindung
mit
dem
Attribut
MSITRANSACTION_JOIN_EXISTING_EMBEDDEDUI wird der Nachrichten-Kontext verndert,
so dass der Chainer den bereits existierenden Custom Action-Server fr integrierte Oberflchen
verwenden kann.
32. Der Chainer ruft dann MsiInstallProduct() fr b.msi und c.msi auf. Der Nachrichten-Kontext
des Chainers wurde fr die Verwendung der integrierten Benutzeroberflche bereits vorbereitet, so
dass diese Oberflche zur Behandlung der Nachrichten von b.msi und c.msi verwendet wird.
33. Der Chainer ruft MsiEndTransaction() auf und veranlasst somit den Commit fr alle Pakete. Der
Chainer wird beendet, die serverseitige Aufrumphase wird ausgefhrt und die Kontrolle wird an
den Client zurckgegeben. Der Client-Prozess und der Custom Action-Server fr integrierte
Oberflchen werden heruntergefahren.
Dieses ist ein zukunftsorientierter Ansatz zur Installation eines Produktes unter Verwendung von
Mikro-Paketen. Somit ergibt sich ein solches Anwendungsszenario natrlich bei der Installation aber
auch wenn der Wartungsmodus ber den Dialog Software der Systemsteuerung aufgerufen wird.
413
Kapitel 9
Externe Benutzeroberflchen
ausgefhrt. Beim Ausfhren dieser Aktion wird nicht in die Commit-Phase gewechselt, da der
Server der Eigentmer der Transaktion ist. Somit wird die Tabelle MsiEmbeddedChainer auf
Existenz eines geeigneten Chainers geprft, indem die definierten Bedingungen ausgewertet
werden. Falls ein solcher Chainer gefunden wurde, wird dieser als ausgefhrt. Der zum Starten
erforderlichen Befehlszeile wird das Handle der Transaktion angefgt.
35. Der Chainer ruft MsiJoinTransaction() auf, wobei das bergebende Handle der Transaktion und
das Attribut MSITRANSACTION_JOIN_EXISTING_EMBEDDEDUI verwendet werden.
36. Durch
MsiJoinTransaction()
in
Verbindung
mit
dem
Attribut
MSITRANSACTION_JOIN_EXISTING_EMBEDDEDUI wird der Nachrichten-Kontext verndert,
so dass der Chainer den bereits existierenden Custom Action-Server fr integrierte Oberflchen
verwenden kann.
37. Der Chainer ruft dann MsiInstallProduct() auf, um die Deinstallation fr b.msi und c.msi zu
veranlassen. Der Nachrichten-Kontext des Chainers wurde fr die Verwendung der integrierten
Benutzeroberflche bereits vorbereitet, so dass diese Oberflche zur Behandlung der Nachrichten
von b.msi und c.msi verwendet wird.
38. Der Chainer ruft MsiEndTransaction() auf und veranlasst somit den Commit oder den Rollback fr
alle Pakete. Der Chainer wird beendet, die serverseitige Aufrumphase wird ausgefhrt und der
Custom Action-Server fr integrierte Oberflchen wird heruntergefahren.
Die mglichen Anwendungsszenarien erstrecken sich zunchst auf die Deinstallation eines aus
mehreren Paketen bestehenden Produktes durch den Dialog Software der Systemsteuerung. Weiterhin
kommt es zu diesem Ablauf, wenn eine solche Anwendung repariert wird. Hierbei ist es unerheblich
ob dieses ber den bekannten Dialog Software erfolgt oder ob die automatische Reparatur dieses
veranlasst.
Externe Benutzeroberflchen
Kapitel 9
Oberflchen geladen und die Initialisierung wird vorgenommen. Anschlieend erfolgt die
Installation in bereits geschilderter Ausprgung.
Der clientseitige Custom Action-Server fr integrierte Benutzeroberflchen bleibt bestehen, da
das Attribut MSITRANSACTION_CHAIN_EMBEDDEDUI gesetzt wurde. Alle anderen Custom
Action-Server und der Client-Prozess werden terminiert und MsiInstallProduct() wird beendet.
43. Der Chainer c2.exe ruft MsiInstallProduct() auf um y.msi zu installieren.
Der Chainer verfgt bereits ber den Nachrichten-Kontext um die integrierte
Benutzeroberflche zu verwenden. Somit wird die ui.dll von x.msi verwendet um die
Nachrichten darzustellen, die bei der Installation von y.msi empfangen werden.
44. Der Chainer c2.exe ruft MsiEndTransaction() auf um die Commit-Phase fr alle Pakete
einzuleiten und die Custom Action-Server fr integrierte Oberflchen herunterzufahren.
Fr dieses Anwendungsszenario existieren derzeitig noch keine konkreten Beispiele. Allerdings sollte
sich dieses perspektivisch gesehen schnellstens ndern. Dieses wre bei Szenarien der Fall, in denen
die eigene Anwendung bestimmte Voraussetzungen installieren muss, die ebenfalls ber einen
externen Chainer bereitgestellt werden. Nahezu identisch sind die Ablufe, falls die eigene
Anwendung ber keinen externen Chainer verfgt, sondern diese mit Hilfe der Tabelle
MsiEmbeddedChainer bereitgestellt wird. Es wird deutlich, dass die Kombination der skizzierten
Szenarien ebenfalls mglich ist und zuknftig wahrscheinlich eine nicht unerhebliche Rolle im
Installationsprozess einnehmen wird.
Fazit
In vielen Bereichen nimmt die Darstellung und die Verwendung einer Benutzeroberflche eine eher
untergeordnete Rolle ein. Dieses ist gerade im Firmenumfeld zu beobachten, da hier die Installationen
automatisch und ohne Benutzereingriffe durchgefhrt werden. Allerdings kommt auch hier
Standardsoftware zum Einsatz, die natrlich auch fr andere Einsatzfelder konzipiert wurde, die
vielfach eine Benutzeroberflche zur Darstellung der Installation erfordern. Gerade bei der Aufteilung
eines Produktes in mehrere Installationspakete und die Verwendung einer paketbergreifenden
Transaktion im Installationsprozess fhrt zu einem Umdenken beim Design der Oberflche. Die hufig
verwendete integrierte Benutzeroberflche ist in solchen Szenarien nur bedingt geeignet, so dass die
Verwendung externer Benutzeroberflchen zunehmen wird. Die klassische Vorgehensweise bentigt
eine separate Anwendung zur Registrierung der Oberflche, so dass diese Vorgehensweise auch nicht
in allen Bereichen umsetzbar ist. Mit dem Windows Installer 4.5 kommt eine neue Funktionalitt zum
Einsatz, die als integrierte externe Benutzeroberflche (EEUI) bezeichnet wird. Hierdurch werden die
Vorteile einer externen Benutzeroberflche mit den Vorzgen der internen Oberflche kombiniert.
Einfache Verwendung und fast grenzenlose Funktionalitt werden wohl dazu fhren, dass
perspektivisch hufiger externe Benutzeroberflchen zum Einsatz kommen.
415
Kapitel 10
10
Optimierungen im Servicemodell
Optimierungen im Servicemodell
Softwareaktualisierungen
Struktur und Verwendung von Patchpaketen
Erstellen von Patches
Optimierungen
Fazit
416
425
434
450
464
Das Ziel jedes Servicemodells ist die Aktualisierung der bereits installierten Ressourcen und die
dadurch realisierte berfhrung des Produktes in einen neuen Status. Ein Realisierungskonzept hierfr
verwendet vollstndige Installationspakete, die als minimale oder komplexe Aktualisierungen dieses
Ziel verwirklichen. Ein weiteres Modell sieht den Windows Installer-Patch als optimales Medium fr
solche Anwendungsszenarien vor. Mit den Windows Installer-Versionen 3.0 und 3.1wurde die
Patching-Funktionalitt wesentlich erweitert, so dass seitdem sehr komplexe Aktualisierungsszenarien
mit Hilfe von Windows Installer-Patches umgesetzt werden knnen. Dennoch waren einige Szenarien
gar nicht oder nicht optimal abgedeckt, so dass hier noch Nachbesserungen durchgefhrt werden
mussten. Gerade bei der Deinstallation von Patches, konnten einige Anforderungen nicht vollstndig
abgedeckt werden, so dass diesbezgliche Optimierungen in den Windows Installer 4.5 integriert
wurden.
Softwareaktualisierungen
Die primre Aufgabe der Installation liegt darin, Ressourcen vom Quellmedium auf den Zielcomputer
zu bertragen und hierdurch eine funktionsfhige Anwendung zu erhalten. Weitere Aktionen innerhalb
der Installation sind stark von der verwendeten Technologie abhngig. Die Aufgaben des Windows
Installers sind ja bekanntermaen nach der Erstinstallation noch nicht beendet, sondern erstecken sich
auf den gesamten Lebenszyklus der Anwendung. Zur Realisierung legt der Windows Installer
zustzliche Metainformationen ab, die somit die Grundlage fr die Verwaltung der Anwendung bilden.
So wird eine Kopie des Installationspaketes auf dem lokalen Rechner in einem speziell hierfr
vorgesehenen Verzeichnis (%windir%\Installer) abgelegt. Zur Reduzierung des Speicherbedarfs
werden eingebettete Kabinettdateien zuvor entfernt. Wird zu einem spteren Zeitpunkt die
Wartungsinstallation ausgefhrt oder stellt der Windows Installer fest, dass eine Reparatur notwendig
ist, werden die Informationen aus diesem zwischengespeicherten Paket verwendet. Zustzlich werden
in der Systemregistrierung whrend des Installationsprozesses weitere Informationen abgelegt, wie
Daten, die im Dialogfeld Software der Systemsteuerung erscheinen sollen, Daten ber die
zwischengespeicherte Datei selbst und Informationen zu den Beziehungen und die Verwendung von
Komponenten, Features und Produkten. Das bedeutet natrlich auch, dass im Rahmen einer
Softwareaktualisierung auch diese Metainformationen bercksichtigt werden mssen, wodurch sich die
416
Optimierungen im Servicemodell
Kapitel 10
417
Kapitel 10
Optimierungen im Servicemodell
Anhand des Listings wird ebenfalls deutlich, dass sich die Modifikationen zwischen den erzeugten
Paketen lediglich auf die installierten Ressourcen beziehen. Die Metainformationen des Paketes wie
die Id oder die Version bleiben in diesem Beispiel unverndert. Dennoch sind diese Eigenschaften
nicht trivial, denn Windows Installer verwendet sie, um die Aktualisierungsart des Installationspaketes
festzulegen, wie dieses in Tabelle 10.84 dargestellt wird. Hier sei anzumerken, dass das Attribut Id des
Elements <Product/> eines WXS-Dokumentes der Eigenschaft ProductCode des spteren
Installationspaketes entspricht. Identisches gilt fr das Attribut Version und der Eigenschaft
ProductVersion.
Aktualisierungsart
418
ProductCode
ProductVersion
Beschreibung
Optimierungen im Servicemodell
Kapitel 10
Small-Update (QFE,
Hotfix, Security-Fix)
Nicht ndern
Nicht ndern
Minor-Upgrade (Service
Pack)
Nicht ndern
ndern
Major-Upgrade (RTM)
ndern
ndern
Durch die Informationen der Tabelle 10.84 wird deutlich, dass die Definition des AktualisierungsTyps durch die Eigenschaften ProductCode und ProductVersion erfolgt Bei dem ProductCode handelt
es sich um eine Eigenschaft, die die Softwarelsung eindeutig identifiziert und in Form einer GUID
vorliegt. Die Eigenschaft ProductVersion legt die Version des Produktes fest und wird in dem Format
Major.Minor.Build definiert. Der maximale Wert fr die Major- und fr die Minor-Version betrgt
255. Der maximale Wert fr die Build-Version betrgt 65535. Zur Definition der ProductVersion
kann auch eine Versionsangabe in dem Format xxx.xxx.xxxxx.xxxxx verwendet werden. Der
Windows Installer bercksichtigt das vierte Feld jedoch nicht. Allerdings ist eine solche Formatierung
fr ein effektives Versionsmanagement hervorragend geeignet. Wird ein Aktualisierungspaket
verwendet, bei dem lediglich das vierte Feld verndert wurde, interpretiert Windows Installer dieses
als Small-Update, da nur die ersten drei Felder der Versionsbezeichnung hierfr verwendet werden.
Zur Unterscheidung kann dieses Element jedoch herangezogen werden. Hufig stellt sich jedoch die
Frage, was unter einem Small- oder Minor-Upgrade zu verstehen ist, auch wenn Synonyme wie
Hotfix oder Service Pack aussagekrftiger sind. Zum besseren Verstndnis werden die
Unterschiede der Aktualisierungsarten anhand eines alltglichen Beispiels in Abbildung 10.87
dargestellt.
419
Kapitel 10
Optimierungen im Servicemodell
Minimale Aktualisierungen
Die Festlegung der Aktualisierungsart ist in erster Linie von den Eigenschaften ProductCode und
ProductVersion abhngig. Allerdings ist dieses nur die formale Definition, denn sie ist ebenfalls vom
Umfang der durchzufhrenden Modifikationen abhngig. Die Technologie der minimalen
Aktualisierungen (Small- und Minor Upgrade) wurde in den Windows Installer integriert, um kleinere
nderungen an existierenden Produkten vorzunehmen, ohne hierfr ein neues Produkt zu erstellen. Die
minimalen Aktualisierungen verwenden den Reinstallations-Mechanismus des Windows Installers, um
die nderungen an dem System vorzunehmen. Damit dieser Mechanismus fehlerfrei und effektiv
angewendet werden kann, sind beim Design der Aktualisierungspakete bestimmte Voraussetzungen zu
erfllen, die sich auf den Unterschied zum ursprnglichen Paket beziehen.
Die Feature-Struktur darf nicht neu organisiert werden. Das bedeutet, dass der Wert der Spalte
Feature_Parent der Tabelle Features nicht verndert werden darf. Es drfen jedoch neue Features
hinzugefgt werden. Es drfen auch existierende Features entfernt werden, allerdings mssen dann
auch die untergeordneten Subfeatures ebenfalls entfernt werden.
Der Wert der Spalte ComponentId bei existierenden Windows Installer-Komponenten darf nicht
verndert werden.
Der Wert der Spalte KeyPath darf bei existierenden Windows Installer-Komponenten nicht
verndert werden. Durch eine Vernderung des KeyPath wre diese Komponente nicht mehr
abwrtskompatibel, so dass ebenfalls die ComponentId zu verndern ist.
Der Name der MSI-Datei darf nicht verndert werden.
Ganz erhebliche Auswirkungen hat die Vernderung der ComponentId, da dieses immer dazu fhrt,
dass die Eigenschaft ProductCode verndert werden muss und somit die Regeln fr minimale
Aktualisierungen durchbrochen werden. Hierbei ist besondere Vorsicht geboten, denn eine unberlegte
nderung im Aktualisierungspaket kann dazu fhren, dass das geplante Servicemodell fr die
Softwarelsung nicht mehr aufrechterhalten werden kann. Die nachfolgenden Szenarien sind daher
besonders zu beachten, denn sie stellen dar, wann die ComponentId gendert werden muss.
Die Ressourcen der Komponente des neuen Paketes sind nicht anwendungskompatibel mit den
Ressourcen der Komponente des ursprnglichen Paketes.
Die Dateinamen in der Komponente des neuen Paketes wurden gendert.
Das standardmige Zielverzeichnis der Komponente des neuen Paketes wurde verndert.
Eine Ressource wurde aus der Komponente des neuen Paketes entfernt.
der Komponente des neuen Paketes wurde eine Ressource hinzugefgt.
In vielen Fllen lsst sich ein Produkt installieren, das gegen diese Richtlinien verstt. Das aus diesen
Versten resultierende Fehlverhalten tritt vielfach erst zu einem spteren Zeitpunkt auf, so dass
entsprechende Korrekturen nur sehr schwierig durchzufhren sind. Zur Vermeidung dieser
Fehlerquellen lsst sich die Installation von Aktualisierungspaketen verhindern, die gegen folgende
Regeln verstoen:
Eine Komponente wird aus dem Installationspaket entfernt. Dieser Fall kann auch eintreten, falls
die ComponentId einer existierenden Komponente verndert wird. Hierdurch wird die bisherige
Komponente aus dem Paket entfernt und die neue Komponente dem Paket hinzugefgt.
Ein neues Feature wird erstellt und an den Beginn oder in die Mitte einer existierenden FeatureStruktur integriert, wie dieses auch in Abbildung 10.88 dargestellt wird.
420
Optimierungen im Servicemodell
Kapitel 10
Der Automatismus zur Verhinderung der Installation solcher Pakete kann durch die Eigenschaft
MSIENFORCEUPGRADECOMPONENTRULES
oder
durch
die
Systemrichtlinie
EnforceUpgradeComponentRules aktiviert werden.
421
Kapitel 10
Optimierungen im Servicemodell
Paketes verwendet.
Das alte Paket wird aus dem Ordner %windows%\installer entfernt und das neue Installationspaket
wird in diesen Ordner kopiert. Bei knftigen Installationen wird das neue Installationspaket
verwendet.
Der PackageCode des neuen Installationspaketes wird registriert und die Konfigurationsdaten des
Produktes werden entsprechend aktualisiert.
Durch die Reinstallation im Rahmen einer minimalen Aktualisierung wird sichergestellt, dass die
installierten Ressourcen aktualisiert werden. Wird die Aktualisierung lediglich mit dem Parameter
ADDLOCAL=ALL aufgerufen, werden die Ressourcen nicht aktualisiert, falls sie bereits lokal
installiert wurden. Aus diesem Grund sollte eine Aktualisierung immer durch den Parameter
REINSTALL=ALL veranlasst werden. Zur Durchfhrung der Reinstallation sind mehrere
Befehlszeilenoptionen mglich, wobei die folgenden eine vollstndige Reinstallation veranlassen:
msiexec /fvomus [Pfad zum Aktualisierungspaket]
msiexex
/i
[Pfad
zum
Aktualisierungspaket]
REINSTALLMODE=vomus
REINSTALL=ALL
Um nur definierte Teile erneut zu installieren, sind die Optionen wie folgt zu verwenden:
msiexec
/i
[Pfad
REINSTALLMODE=vomus
zum
Aktualisierungspaket]
REINSTALL=[Features]
Der Umfang der Aktualisierung wird ber die Eigenschaft REINSTALL festgelegt. Diese Eigenschaft
kann den Wert ALL oder eine durch Semikolon getrennte Liste der zu aktualisierenden Features
enthalten. Aus dieser Festlegung ergibt sich, dass eine Reinstallation im einfachsten Fall immer fr ein
komplettes Feature ausgefhrt wird, auch wenn nur eine Datei im Aktualisierungspaket verndert
wurde. Die angewendete Logik bezieht sich hierbei auf den logischen Zusammenhang zwischen
Komponenten und Features.
Ein Ziel des Windows Installers liegt darin, eine lauffhige Version der Anwendung auf dem
Zielsystem zu installieren und diesen Zustand durch geeignete Manahmen aufrecht zu erhalten. Das
Feature ist die kleinste installierbare Einheit eines Softwareproduktes aus Sicht des Endanwenders.
Somit ist ein Feature als ein in sich konsistentes Gebilde zu sehen. Beim Design des
Installationspaketes wird ein logischer oder technischer Zusammenhand zwischen den Features und
den Komponenten eines Installationspaketes hergestellt. Eine Reinstallation, die auf Ebene der
Komponenten oder auf Dateiebene erfolgen wrde, wrde zwangslufig zu einer Inkonsistenz
innerhalb des Features fhren. Das Ergebnis wre eine nicht mehr lauffhige Version der Anwendung.
Wie bereits erlutert, verfgt der Windows Installer ber keinen speziellen Updatemodus, sondern
verwendet bei minimalen Aktualisierungen den Reinstallations-Mechanismus. Hierbei gelten smtliche
Spezifikationen, die dieser Modus beinhaltet, auch wenn er in diesem Szenario ein abweichendes Ziel
verfolgt. Somit lsst sich eine Aktualisierung ebenfalls nur auf Ebene der Features ausfhren. Anders
verhlt es sich bei den Windows Installer-Patches, denn diese werden seit dem Windows Installer 3.0
in einem speziellen Update-Modus angewendet, so dass Aktualisierungen auch auf
Komponentenebene mglich sind.
422
Optimierungen im Servicemodell
Kapitel 10
Hinweis Beginn
Die geschilderte Funktionalitt kann natrlich auch programmtechnisch umgesetzt werden. Hierzu
stehen die Funktionen MsiReinstallProduct() und MsiReinstallFeature() der Windows InstallerProgrammierschnittstelle zur Verfgung. Bei der Verwendung der Deployment Tools Foundation sind
die Funktionen Installer.ReinstallProduct() und Installer.ReinstallFeature() des Namensraums
Microsoft.Deployment.WindowsInstaller zu verwenden.
Hinweis Ende
Selbstextrahierende Archive
Im vorherigen Abschnitt wurden die Befehlszeilenparameter aufgezeigt, die zur Durchfhrung einer
minimalen Aktualisierung zu verwenden sind. Problematisch ist hierbei, dass eine Aktualisierung nicht
durch einen Doppelklick auf die MSI-Datei ausgefhrt werden kann, da immer die Befehlszeile
bergeben werden muss. Um hier eine hheren Komfort zu bieten, knnen Aktualisierungspakete in
selbstextrahierende Archive integriert werden. Bei einem Doppelklick auf ein solches Archiv wird das
enthaltene Installationspaket extrahiert und die Installation unter Verwendung einer konstruierten
Befehlszeile gestartet. Der Komfort ist garantiert und die Fehleranflligkeit durch die Verwendung
ungltiger Befehlszeilen wird minimiert.
Das Betriebssystem stellt zur Erzeugung solcher Archive die Anwendung iexpress.exe zur Verfgung.
Nach dem Starten der Anwendung werden einige Dialoge angezeigt, in denen die Einstellungen fr das
Archiv vorgenommen werden knnen und das Archiv erzeugt werden kann. Es besteht aber auch die
Mglichkeit, die Einstellungen in einer speziellen Datei zu speichern, die als Self Extraction
Directive File bezeichnet wird. Hierdurch ist es mglich, die Einstellungen jederzeit zu korrigieren
und ein neues Archiv zu erzeugen. Es besteht sogar die Mglichkeit, dieses im unbeaufsichtigten
Modus unter Verwendung der folgenden Befehlszeile durchzufhren.
iexpress.exe /n /q setup.sed
In Listing 10.89 wird der Inhalt einer SED-Datei dargestellt, mit dem die Datei product.msi in ein
Archiv eingebettet wird und beim Extrahieren die Installation ber eine konstruierte Befehlszeile
gestartet wird.
[Version]
Class=IEXPRESS
SEDVersion=3
[Options]
PackagePurpose=InstallApp
ShowInstallProgramWindow=0
HideExtractAnimation=0
UseLongFileName=1
InsideCompressed=0
CAB_FixedSize=0
CAB_ResvCodeSigning=0
RebootMode=N
InstallPrompt=%InstallPrompt%
DisplayLicense=%DisplayLicense%
FinishMessage=%FinishMessage%
423
Kapitel 10
Optimierungen im Servicemodell
TargetName=%TargetName%
FriendlyName=%FriendlyName%
AppLaunched=%AppLaunched%
PostInstallCmd=%PostInstallCmd%
AdminQuietInstCmd=%AdminQuietInstCmd%
UserQuietInstCmd=%UserQuietInstCmd%
SourceFiles=SourceFiles
[Strings]
InstallPrompt=
DisplayLicense=
FinishMessage=
TargetName=Setup.exe
FriendlyName=Colors 1.0
AppLaunched=msiexec /fvomus product.msi /qb
PostInstallCmd=<None>
AdminQuietInstCmd=
UserQuietInstCmd=
FILE0="Product.msi"
[SourceFiles]
SourceFiles0=
[SourceFiles0]
%FILE0%=
Relevant ist hierbei die Befehlszeile, die durch den Schlssel AppLaunched festgelegt wurde. Es ist
erkennbar, dass der Reparaturmodus ausgefhrt und hierbei die Basisdarstellung der
Benutzeroberflche verwendet wird.
Komplexe Aktualisierungen
Den minimalen Aktualisierungen steht das Major-Upgrade gegenber. Bei einem Major-Upgrade
handelt es sich um die Installation eines neuen Produktes, wodurch keine zustzlichen
Befehlszeilenoptionen wie REINSTALL oder REINSTALLMODE bergeben werden mssen. Im
Rahmen dieser Installation knnen auch alte Produkte vom System entfernt werden. Durch die
Verwendung eines neuen Produktcodes sind keine Limitierungen beim Design der Komponenten- und
Feature-Struktur vorhanden, wie das bei den minimalen Aktualisierungen noch der Fall war. Minimale
Aktualisierungen waren dadurch gekennzeichnet, dass die Eigenschaft ProductCode nicht gendert
wurde. In einigen Szenarien ist es jedoch unerlsslich eine diesbezgliche nderung vorzunehmen und
somit aus Sicht des Windows Installers ein neues Produkt zu erzeugen. Die nachfolgende Liste fasst
die Szenarien zusammen in denen der Produktcode verndert werden muss:
Ein Parallelbetrieb des Originalproduktes und des aktualisierten Produktes auf demselben System
mssen mglich sein.
Der Name der MSI-Datei wurde gendert.
Die ComponentId einer existierenden Windows Installer-Komponente wurde verndert.
Eine Komponente wurde von einem existierenden Feature entfernt.
Ein existierendes Feature wurde einem neuen Feature untergeordnet. Hierbei wurde zwangslufig
424
Optimierungen im Servicemodell
Kapitel 10
425
Kapitel 10
Optimierungen im Servicemodell
existieren einige Vorteile die im weiteren Verlauf dieses Kapitels dargelegt werden. Einer davon
bezieht sich auf die Befehlszeile. Zum Einspielen eines Patches sind keine speziellen
Befehlszeilenargumente erforderlich, wie es noch bei den minimalen Aktualisierungspaketen der Fall
sein musste. Aus diesem Grund ist es mglich, den Patch durch einen Doppelklick zu installieren. Falls
dennoch die Befehlszeile verwendet werden soll, stehen die folgenden Mglichkeiten zur Verfgung,
die synonym zu verwenden sind. Hierbei wird deutlich, dass nicht nur ein Patch angegeben werden
kann, sondern dass im Rahmen einer Installationstransaktion mehrere Patches eingespielt werden
knnen.
msiexec.exe /p <Patch-Datei 1>[; Patch-Datei 2]
msiexec.exe /update <Patch-Datei 1>[; Patch-Datei 2]
Ich hatte bereits erwhnt, dass Major-Upgrade-Patches nur aus Grnden der Kompatibilitt noch
untersttzt werden. Das steht damit im Zusammenhang, dass mit dem Windows Installer 3.x die
gesamte Verwendung von Patches erheblich verbessert und erweitert wurde. Um diese neuen
Funktionalitten nutzen zu knnen, muss ein Patch entsprechend als Windows Installer-Patch 3.0
gekennzeichnet werden. Wie das funktioniert, kommt spter. Ein nicht gekennzeichneter Patch wird
als Patch 2.0 identifiziert und wird somit nach dem alten Modell verwendet. Ein Major-UpgradePatch kann nicht als Patch 3.0 gekennzeichnet werden, so dass die neuen Funktionalitten hierbei nicht
verfgbar sind. An dieser Stelle sei angemerkt, dass sich alle weiteren Betrachtungen und
Erluterungen auf einen Patch 3.0 beziehen, der somit im Rahmen eines Small- oder Minor-Upgrades
verwendet wird.
Die Zielsetzung eines Patches liegt ganz klar in der Aktualisierung eines Softwareproduktes. Hierzu
sind einige Aktionen erforderlich, die nachfolgend dargestellt werden:
45. Das Anwenden des Patches wird durch die Befehlszeile oder durch einen Doppelklick auf die
MSP-Datei gestartet.
46. Der Summary Information Stream des Patches wird ausgewertet und die Anwendbarkeit des
Patches wird hierdurch geprft.
47. Der Client-Prozess verwendet diese Informationen und den Aufrufkontext, um das Produkt zu
bestimmen, auf das der Patch angewendet werden kann.
48. Der Client-Prozess ermittelt das Installationspaket des Produktes, das aktualisiert werden soll.
49. Der Client-Prozess prft alle Transformationen des Patches und ermittelt diejenigen, die fr das
Produkt zutreffend sind. Im Anschluss werden die ermittelten Transformationen auf eine im
Arbeitsspeicher befindlichen Kopie des Paketes angewendet.
50. Basierend auf der gewhlten Darstellungsform der Benutzeroberflche, werden die entsprechenden
Sequenztabellen verarbeitet. Wird die Installation nur mit der Basisoberflche oder ohne
Benutzeroberflche ausgefhrt, wird direkt die Tabelle InstallExecuteSequence verwendet und die
Kontrolle an den Server-Prozess bergeben.
51. Der Server-Prozess verarbeitet ebenfalls die geschilderten Schritte 47-49 und wendet die
Transformationen auf seine im Speicher befindliche Kopie des Paketes an.
52. Im Folgenden ermittelt der Windows Installer, welche Komponenten und Features im Rahmen
dieser Installation aktualisiert werden sollen. Bei einem Patch 3.0 werden diese automatisch
ermittelt, so dass sich die Aktualisierung nur auf die tatschlich vernderten Komponenten bezieht.
426
Optimierungen im Servicemodell
Kapitel 10
Beim Patch 2.0 ist das nicht der Fall. Hierbei muss der bereits bekannte Parameter REINSTALL
verwendet werden, um somit die betroffenen Features zu definieren.
53. Anschlieend werden die Aktionen der Sequenztabelle ausgefhrt. Bei einem Patch 2.0 werden
alle Aktionen ausgefhrt, bei einem Patch 3.0 jedoch nur diejenigen, die fr die Aktualisierung
tatschlich bentigt werden.
54. Bei einem Patch 2.0 werden schlielich alle Ressourcen erneut installiert, die den zu
aktualisierenden Features zugeordnet wurden. Bei einem Patch 3.0 werden hingegen nur die
aktualisierten Komponenten ersetzt.
Ganz entscheidend, fr die weiteren Erluterungen ist das Verstndnis fr die Anwendung eines
Patches. Das Windows Installer-Paket wird in den Arbeitsspeicher geladen und der Patch wird darauf
angewendet. Hieraus ergibt sich somit eine verbundene Ansicht, wie das auch in Abbildung 10.89
dargestellt wird.
Die gerade erwhnte verbundene Ansicht lsst sich sehr schn mit Orca nachvollziehen. Hierzu ist ein
Installationspaket zu ffnen und der oder die Patches sind darauf anzuwenden. In den Tabellen wird
nun diese verbundene Ansicht verwendet, so dass sich die nderungen durch den Patch direkt ablesen
lassen. Zur Verbesserung des Komforts hebt Orca die nderungen auch farbig hervor.
427
Kapitel 10
Optimierungen im Servicemodell
Die schematische Darstellung zeigt sowohl die unbedingt erforderlichen Elemente, als auch die neuen
Elemente eines Patches 3.0. Ein Windows Installer-Patch enthlt immer:
Mindestens ein Transformationspaar.
Summary Information Stream
Ressourcen in Form von integrierten Kabinettdateien (Payload).
Ein Patch, der die Funktionalitt des Windows Installers 3.0 und hher verwenden soll, enthlt darber
hinaus:
Tabelle MsiPatchSequence
Tabelle MsiPatchMetadata
Ein Windows Installer-Patch kann im Gegensatz zu einem konventionellen Update auf mehrere
Produktversionen angewendet werden. So ist es mglich einen Patch zu erstellen, der ein Produkt auf
die Version 2.0 aktualisiert, unabhngig davon, ob die Version 1.0 oder 1.5 des Produktes auf dem
System installiert ist. Ein solcher Patch wird als Multi-Target-Patch bezeichnet. Darber hinaus
besteht auch die Mglichkeit einen Patch zur Aktualisierung von verschiedenen Produktlinien zu
erstellen und zu verwenden. Ein solcher Patch ist eine spezielle Form des Multi-Target-Patch und kann
sehr gut mit Multi-SKU-Patch (Stock Keeping Unit) umschrieben werden.
Optimierungen im Servicemodell
Kapitel 10
berprfung auf mehrere Produktcodes erfolgen muss. Die Produktcodes der Anwendungen, die durch
den Patch aktualisiert werden knnen, sind im Summary Information Stream abgelegt.
Wie zuvor erlutert, wird beim Anwenden des Patches zunchst die Existenz eines qualifizierten
Produktes geprft. Wurde kein qualifiziertes Produkt gefunden, wird die Installation mit dem
Fehlercode 1642 (ERROR_PATCH_TARGET_NOT_FOUND) beendet. Die berprfung auf
existierende Produkte wird nicht im Installationsprotokoll vermerkt, da das Installationsprotokoll erst
erstellt wird, wenn mindestens ein qualifiziertes Produkt gefunden wurde. Wurde hingegen ein Produkt
gefunden, dass rein formal aktualisiert werden kann, muss im nchsten Schritt festgestellt werden, ob
dieses auch ber die geeignete Produktversion oder Sprache verfgt. Hierzu werden die im Patch
befindlichen Transformationen bentigt.
Eingebettete Transformationen
Ein Windows Installer-Patch enthlt im Minimalfall einen Satz an eingebetteten Transformationen, die
das entsprechende Zielprodukt kennzeichnen. Jeder Satz besteht hierbei aus zwei Transformationen;
der Datenbank-Transformation und der Patch-Transformation. Beide Transformationen verfgen ber
einen identischen Namen, wobei dem Namen der Patch-Transformation das Zeichen # vorangestellt
wird. Alle Namen, der im Patch enthaltenen Transformationen sind in der Eigenschaft
PID_LASTAUTHOR des Summary Information Streams abgelegt. Da es sich um eingebettete
Transformationen handelt, wird den Bezeichnungen der Doppelpunkt : vorangestellt, wie
beispielsweise :1TTo1U;:#1TTo1U. Wie bereits erlutert besteht die Mglichkeit einen Patch zu
erstellen, der mehrere Produktversionen aktualisiert, also einen Multi-Target-Patch. Fr jedes
Zielprodukt eines solchen Patches existiert ein Transformationspaar. Bei der Anwendung eines Patches
der mehrere Transformationspaare beinhaltet, wird vom Windows Installer zunchst das zutreffende
Transformationspaar ermittelt. Hierzu werden die Daten des Summary Information Stream der
Datenbanktransformationen verwendet
Der Summary Information Stream der Datenbanktransformation bildet somit den zweiten und letzten
Prfpunkt, der feststellt, ob der Patch auf ein existierendes Produkt angewendet werden kann. Im Feld
PID_CHARCOUNT sind hierbei die Validierungsbedingungen festgelegt, die beim Anwenden der
Transformation erfllt sein mssen. In Abhngigkeit zu dem hier definierten Wert, werden die Inhalte
der Felder PID_TEMPLATE und PID_REVNUMBER fr die weitere berprfung herangezogen.
Kabinettdateien
Ein Windows Installer-Patch enthlt mindestens eine eingebettete Kabinettdatei, in der die zu
installierenden Ressourcen enthalten sind. Die Anzahl der Kabinettdateien in einem Patch richtet sich
nach der Anzahl der Datenstze in der Tabelle ImageFamilies der PCP-Datei. Bei einem normalen
Patch und bei einem Multi-Target-Patch enthlt diese Tabelle lediglich einen Datensatz, so dass
hierfr auch nur eine Kabinettdatei erstellt wird. Bei einem Multi-SKU-Patch existiert fr jedes
Ausgangsprodukt ein Eintrag in der Tabelle. Somit wird fr jedes Ausgangsprodukt eine Kabinettdatei
erstellt und in das Patch-Paket eingebettet. Bei der Erstellung eines Patches wird der Name der
Kabinettdateien durch patchwiz.dll nach dem folgenden Schema automatisch generiert:
PCW_CAB_ + Wert der Spalte Family aus der Tabelle ImageFamilies.
Eine Referenz auf das Kabinett muss bei der Anwendung des Patches in die Tabelle Media des
Installationspaketes bertragen werden. Hierzu ist ein entsprechender Eintrag in der PatchTransformation vorhanden, der ebenfalls von den weiteren Eintragungen der Tabelle ImageFamilies
der PCP-Datei abhngig ist.
Persnliche Ausfertigung fr Martin Martinsson
429
Kapitel 10
Optimierungen im Servicemodell
In der Kabinettdatei sind die Ressourcen enthalten, die zur Aktualisierung des jeweiligen
Installationspaketes bentigt werden. Diese Ressourcen gliedern sich in zwei Typen von Dateien:
Vollstndige Dateien
Binr-Patches (Byte-Level-Patches)
Bei Binr-Patches handelt es sich um Dateifragmente (Delta), die beim Anwenden des Patches, die
existierende Datei in eine neuere Version berfhren. Vollstndige Dateien werden verwendet, falls
diese in der ursprnglichen Produktversion noch nicht vorhanden waren, also der neuen
Produktversion erst hinzugefgt wurden. Eine weitere Verwendungsmglichkeit von vollstndigen
Dateien ergibt sich aus einer integrierten Logik in der Bibliothek patchwiz.dll. Wurde eine Datei
extrem modifiziert, so kann es passieren, dass die Gre aller erforderlichen Binr-Patches, die
bentigt werden, um die Datei in die neue Version zu berfhren, die Gre der Datei bersteigt. In
einem solchen Fall verwendet patchwiz.dll ebenfalls eine vollstndige Datei.
Die gerade erluterten Dateitypen werden in der folgenden Reihenfolge in der Kabinettdatei abgelegt:
Zuerst die vollstndigen Dateien in der Reihenfolge wie sie in der Spalte Sequence der Tabelle File
definiert wurden.
Im Anschluss folgen die Binr-Patches in der Reihenfolge der Definition in der Spalte Sequence
der Tabelle Patch. Diese Reihenfolge wird nicht vom Autor sondern von patchwiz.dll festgelegt.
Die Verwendung von Binr-Patches kann bei der Erstellung des Patches deaktiviert werden, so dass
ausschlielich vollstndige Dateien verwendet werden. Hierzu ist in der Tabelle Property der PCPDatei die Eigenschaft IncludeWholeFilesOnly auf den Wert 1 zu setzen.
Datenbanktabellen
Mit dem Windows Installer 3.0 und hher werden neue Funktionalitten zur Verfgung gestellt, die bei
der Anwendung von Patches zum Tragen kommen. Bei einem Patch 3.0 sind zustzliche
Informationen notwendig, um diese neuen Funktionalitten zu verwenden. Aus diesem Grund enthlt
ein solcher Patch eine Datenbank die aus zwei Tabellen besteht. Alle erforderlichen Informationen sind
in diesen Tabellen abgelegt, so dass das restliche Format des Patches unverndert bleibt. Diese
Implementierung ermglicht die uneingeschrnkte Verwendung von Patches 3.0 auch auf Systemen,
auf denen einen ltere Version des Windows Installers vorhanden ist.
Tabelle MsiPatchSequence
Bei der Tabelle MsiPatchSequence handelt es sich um die wichtigste Tabelle in einem Patch 3.0. Eine
neue Funktionalitt beim Windows Installer 3.0 und hher bezieht sich auf die Festlegung der
Anwendungsreihenfolge von Patches. Hierdurch wird es mglich, eine logische Ordnung vorzugeben,
in der die Patches auf das Produkt angewendet werden sollen. Hierbei ist es unerheblich in welcher
chronologischen Reihenfolge die tatschliche Anwendung erfolgt. Die Tabelle MsiPatchSequence
enthlt alle Informationen, die der Windows Installer bentigt, um einen Small-Update-Patch relativ
zu anderen Patches anzuordnen. Bei der Anwendung eines Minor-Upgrade-Patches wird diese Tabelle
bentigt, um vorherige Patches in einen pseudoinstallierten Zustand zu versetzen (Supersedencing).
Bei der Anwendung von Patches prft der Windows Installer zunchst, ob es sich um einen Patch der
Version 3.0 handelt. Dieses ist insofern erforderlich, da modifizierte Algorithmen im Gegensatz zu
einem Patch 2.0 verwendet werden. Die Prfung auf einen Patch 3.0 wird vom Windows Installer
anhand der Existenz der Tabelle MsiPatchSequence durchgefhrt. Bei einem Patch, der ber diese
Tabelle verfgt, handelt es sich um einen Patch der Version 3.0, im anderen Fall um einen Patch der
430
Optimierungen im Servicemodell
Kapitel 10
Version 2.0.
Hinweis Beginn
Durch die Bezeichnung Patch 3.0 wird lediglich ausgedrckt, dass bei der Anwendung des Patches die
neuen Funktionalitten des Windows Installers 3.0 und hher verwendet werden. Hiermit wird kein
Bezug zu einer expliziten Windows Installer-Version hergestellt, denn ein solcher Patch kann zunchst
auf jedem System verwendet werden. Um die erforderliche Windows Installer-Version dennoch
festzulegen, ist die Eigenschaft PID_WORDCOUNT des Summary Information Streams zu verndern.
Hinweis Ende
Tabelle MsiPatchMetadata
Diese Tabelle ist ebenfalls im Patchpaket zu finden und enthlt beschreibende Informationen zu dem
Patch, die im Dialog Software der Windows-Systemsteuerung angezeigt werden. Darber hinaus ist die
Tabelle MsiPatchMetadata zur Kennzeichnung eines deinstallierbaren Patches erforderlich und kann
auch zur Festlegung von Optimierungseinstellungen verwendet werden. Tabelle 10.85 zeigt die
mglichen Eigenschaften der Tabelle MsiPatchMetadata.
Eigenschaft
Wert
Erforderlich
Beschreibung
AllowRemoval
Integer
Ja
Classification
String
Ja
CreationTimeUTC
String
Description
String
Ja
DisplayName
String
Ja
ManufacturerName
String
Ja
MinorUpdateTargetRTM
Integer
MoreInfoURL
String
OptimizeCA
String
OptimizedInstallMode
Integer
431
Kapitel 10
Optimierungen im Servicemodell
hher.
TargetProductName
String
Ja
Chronologische Reihenfolge
Vor der Einfhrung des Windows Installers 3.0 wurden Patches ausschlielich in chronologischer
Ordnung auf ein installiertes Produkt angewendet. Fr die meisten Szenarien war dieser Lsungsansatz
vollkommen ausreichend, obwohl einige problematische Aspekte hierbei zu bercksichtigen waren.
Ein Patch konnte hierbei eine inkorrekte Dateiversion installieren, indem ein lterer Patch nach einer
aktuelleren Version des Patches auf das Produkt angewendet wurde. Das nachfolgende
Installationsprotokoll wurde bei der Anwendung des Patches QFE1 auf ein Produkt mit bereits
installierten Patch QFE2 erstellt. Hierbei ist ersichtlich, in welcher Reihenfolge die Patches auf das
Produkt angewendet werden. Patches, die hierbei lediglich durch eine GUID dargestellt werden, sind
bereits registriert und werden zur Konstruktion der verbundenen Ansicht bentigt. Die neuen
Patches sind an der zustzlichen Pfadangabe zu erkennen. In der Darstellung der Dateiaktionen ist
432
Optimierungen im Servicemodell
Kapitel 10
ersichtlich, dass die bereits existierende Datei, somit mit der Datei des vorherigen Patches
berschrieben wird.
MSI (s) (A4:E0) [12:54:52:993]: PATCH SEQUENCER: 2.0 QFE patch D:\Setup\QFE1.msp is applicable.
MSI (s) (A4:E0) [12:54:52:993]: SequencePatches returns success.
MSI (s) (A4:E0) [12:54:52:993]: Final Patch Application Order:
MSI (s) (A4:E0) [12:54:52:993]: {8E11C8A0-14A6-41C0-87D3-FA3C474F9FA6} MSI (s) (A4:E0) [12:54:52:993]: {CDE584C5-07C7-425B-B3BA-5CF4642F3C45} - D:\Setup\QFE1.msp
Da dieses Verhalten nicht in allen Fllen gewnscht wird, besteht die Notwendigkeit im Rahmen der
Patch-Erstellung eine Logik zu verwenden, die dieses Verhalten unterbindet. Hierzu ist es erforderlich
die Validierungsbedingungen fr den Patch auf den ProductCode und die ProductVersion
auszudehnen. Solange Patches verwendet werden, die auch die Produktversion verndern, also MinorUpgrade-Patches, erfllt diese Implementierung die definierten Anforderungen. Bei der Verwendung
von Small-Update-Patches kann diese Implementierung jedoch nicht den gewnschten Erfolg
vorweisen. Da ein solcher Patch die Produktversion nicht verndert, ist bei der Anwendung eines
weiteren Patches anhand der Validierungsbedingungen nicht berprfbar, ob die Installation im
Original- oder einem bereits aktualisierten Zustand auf dem System vorhanden ist. Eine wirkungsvolle
Lsung fr dieses Problem ist mit den Funktionen des Windows Installers 2.0 und frher nicht
mglich.
Logische Reihenfolge
Bei der Verwendung des Windows Installers 3.0 und hher existiert fr den Autor des Patches eine
Implementierung, mit der die Anwendungsreihenfolge von Patches festgelegt werden kann. Hierbei ist
die chronologische Reihenfolge unerheblich, in der die Patches auf das Produkt angewendet werden.
Es wird bereits beim Design des Patches die erforderliche Reihenfolge definiert. Der Windows
Installer kombiniert bei der Anwendung die festgelegten logischen Ordnungsmerkmale mit den
Inhalten des Patches, um hieraus die exakten Ressourcen fr das Produkt zu bestimmen, unabhngig
davon, in welcher chronologischen Reihenfolge der Patch auf das Produkt angewendet wurde.
In dem vorherigen Beispiel wurde der Patch QFE1 in der zeitlichen Abfolge nach dem Patch QFE2 auf
das Produkt angewendet. Als Ergebnis wurden hierbei neuere Ressourcen berschrieben, da keine
logische Anwendungsreihenfolge zwischen den beiden Patches definiert wurde bzw. definiert werden
konnte. Den beiden Patches wurden nun Sequenzinformationen hinzugefgt, die definieren, dass der
Patch QFE1 in einer logischen Ordnung immer vor dem Patch QFE2 angewendet wird. Bei der
tatschlichen Anwendung des Patches wertet der Windows Installer diese Informationen aus und
erstellt daraufhin die exakte Anwendungsreihenfolge fr die Patches. Diese Informationen werden
detailliert dem Installationsprotokoll angefgt.
MSI (s) (AC:F4) [13:13:19:957]: PATCH SEQUENCER: verifying the applicability of QFE patch D:\Setup\QFE1.msp
against product code: {AE581993-EA96-4632-A0F8-2D3B7DBB86E8}, product version: 1.00.0000, product language
1031 and upgrade code: {30F18E7F-D3A8-4B41-B120-79010859477A}
MSI (s) (AC:F4) [13:13:19:957]: PATCH SEQUENCER: QFE patch D:\Setup\QFE1.msp is applicable.
433
Kapitel 10
Optimierungen im Servicemodell
MSI (s) (AC:F4) [13:13:19:958]: PATCH SEQUENCER: The resulting #_OrderedGUIDs table:
MSI (s) (AC:F4) [13:13:19:958]: Patch: {CDE584C5-07C7-425B-B3BA-5CF4642F3C45} Order: 0 (Family: RM)
MSI (s) (AC:F4) [13:13:19:958]: Patch: {8E11C8A0-14A6-41C0-87D3-FA3C474F9FA6} Order: 1 (Family: RM)
MSI (s) (AC:F4) [13:13:19:958]: The ordered #_QFESequence table: - has the final sequence of QFEs. It lists
each PatchGUID only once.
MSI (s) (AC:F4) [13:13:19:958]: PatchGUID: {CDE584C5-07C7-425B-B3BA-5CF4642F3C45} ResultantVersion: 1.00.0000
PatchFamily: RM Sequence: 1.0.0.100 Order: 0
MSI (s) (AC:F4) [13:13:19:958]: PatchGUID: {8E11C8A0-14A6-41C0-87D3-FA3C474F9FA6} ResultantVersion: 1.00.0000
PatchFamily: RM Sequence: 1.0.0.200 Order: 1
MSI (s) (AC:F4) [13:13:19:958]: PATCH SEQUENCER: there's no supersedence information available, so no patches
will be superseded.
MSI (s) (AC:F4) [13:13:19:958]: SequencePatches returns success.
MSI (s) (AC:F4) [13:13:19:958]: Final Patch Application Order:
MSI (s) (AC:F4) [13:13:19:958]: {CDE584C5-07C7-425B-B3BA-5CF4642F3C45} - D:\Setup\QFE1.msp
MSI (s) (AC:F4) [13:13:19:958]: {8E11C8A0-14A6-41C0-87D3-FA3C474F9FA6} -
In dem Protokollauszug ist vornehmlich an den letzten Eintrgen zu erkennen, dass der Patch QFE1 in
der logischen Reihenfolge vor dem Patch QFE2 angeordnet wurde, obwohl er von der zeitlichen
Abfolge erst danach eingespielt wird.
Hinweis Beginn
Die
Windows
Installer-Programmierschnittstelle
enthlt
die
Funktionen
MsiDeterminePatchSequence() und MsiDetermineApplicablePatches() mit deren Hilfe die
Anwendungsreihenfolge von Patches ermittelt werden kann. Bei der Verwendung der Deployment
Tools Foundation ist die Funktion Installer.DetermineApplicablePatches() zu verwenden.
Hinweis Ende
Klassischer Lsungsansatz
In Abbildung 10.91 wird der Prozess zur Erstellung von Patches schematisch verdeutlicht. Es soll ein
Produkt, dass die Dateien dd.exe und hilfe.chm enthlt, auf die Version 1.2 aktualisiert werden. Als
Ausgangsprodukt wird sowohl die Version 1.0, als auch die Version 1.1 untersttzt. Die tatschliche
Erstellung erfolgt durch das Tool msimsp.exe, das die Informationen der PCP-Datei verwendet. Das
434
Optimierungen im Servicemodell
Kapitel 10
Ergebnis des Erstellungsprozesses ist letztlich ein Windows Installer-Patch. Hier bei sei anzumerken,
dass die Logik zum Erstellen von Patches in der Datei patchwiz.dll aus dem Windows Installer-SDK
verankert ist. Diese Datei wird von nahezu allen Tools und Anwendungen zur Erstellung von Patches,
einschlielich des Befehlszeilentools msimsp.exe verwendet. Ergnzende Erluterungen zu der
patchwiz.dll folgen an spterer Stelle.
Das Erstellen eines Windows Installer-Patches ist als nicht trivialer Prozess anzusehen, da viele
strukturierte Ablufe einflieen mssen. Um bereits im Vorfeld Problemflle bei der Anwendung eines
Windows Installer-Patches auszuschlieen, sollten die folgenden Hinweise beachtet werden:
Die Primrschlssel der Tabelle File (FTK) zwischen den Originalpaketen und dem
Aktualisierungspaket drfen nicht verndert werden.
Es drfen keine Dateien von einem Installationsordner in einen anderen verschoben werden.
Es drfen keine Dateien von einer Kabinettdatei in eine andere verschoben werden.
Die Reihenfolge der Dateien in einer Kabinettdatei darf nicht verndert werden.
Die Verwendung von Primrschlsseln der Tabelle File, die sich lediglich durch Gro- und
Kleinschreibung unterscheiden, ist zu vermeiden.
Falls die erforderlichen Ressourcen vorliegen und die entsprechenden Hinweise beachtet wurden, kann
mit der Erstellung des Patches begonnen werden. An dieser Stelle wird nun die klassische
Vorgehensweise erlutert, die mit dem Bordmitteln des Windows Installer-SDK durchgefhrt wird.
Die abweichende Methode unter ausschlielicher Verwendung von Windows Installer-XML wurde
bereits im Kapitel 2 erlutert. Zur Erstellung eines Patches auf eben diese klassische Weise, gehen Sie
wie folgt vor:
Erstellen Sie eine Kopie des Basisinstallationspaketes und nehmen Sie die entsprechenden
Modifikationen daran vor. Beachten Sie, dass das Originalinstallationspaket zur Erzeugung eines
Patches bentigt wird.
Erstellen Sie vom Basisinstallationspaket ein administratives Abbild, indem Sie die Installation mit
dem Parameter /a ausfhren. Bei der Verwendung mehrerer Ausgangsprodukte mssen Sie von
jedem Produkt ein administratives Abbild erstellen.
Persnliche Ausfertigung fr Martin Martinsson
435
Kapitel 10
Optimierungen im Servicemodell
436
Optimierungen im Servicemodell
Kapitel 10
Durch das Kompilieren und Linken der erforderlichen Dateien, wird eine vollstndige PCP-Datei
erzeugt, die smtliche Informationen zur spteren Erstellung des Patches enthlt.
Objektbibliothek patchwiz.dll
Nachdem die administrativen Abbilder und die PCP-Datei erstellt wurden, kann auf Grundlage dieser
Informationen das Patchpaket erzeugt werden. Das Windows Installer-SDK stellt zu diesem Zweck die
Objektbibliothek patchwiz.dll bereit, in der alle notwendigen Funktionalitten integriert sind. Diese
Bibliothek kann sowohl programmtechnisch, als auch ber das Tool msimsp.exe zur Erstellung eines
Patches verwendet werden, wobei dieses durch die nachfolgenden Schritte realisiert wird:
Analyse der Dateien des Aktualisierungspaketes und der Zielpakete.
Erstellen der Transformationen.
Erstellen der Kabinettdatei.
Integration der Transformationen und der Kabinettdatei in das Patchpaket.
Die Erstellung von Patches unter Verwendung der Bibliothek patchwiz.dll hat sich im Vergleich zu
vorherigen Versionen des Windows Installers nicht wesentlich gendert. Allerdings wurde diese
Bibliothek bei der Entwicklung des Windows Installer 4.0 vollstndig neu entwickelt, wobei ein
Schwerpunkt auf die Geschwindigkeit beim Erstellen von Patches gelegt wurde. Allerdings verfgte
die Version 4.0 der patchwiz.dll ber gravierende Fehler, die sogar zu Datenverlusten fhren konnten.
Aus diesem Grund wurde eine fehlerbereinigte Version dem Windows Installer-SDK 4.5 hinzugefgt
und deswegen erst an dieser Stelle des Buches erlutert.
Achtung Beginn
Zur Vermeidung von Datenverlusten sollte unbedingt die Version 4.5 der patchwiz.dll verwendet
werden.
Achtung Ende
437
Kapitel 10
Optimierungen im Servicemodell
Parameter
Beschreibung
-s
-p
-f
{Temporrer Ordner}
-l[p]
-k
-d
-?
Die Signatur der Funktion UiCreatePatchPackage() ist hiermit nahezu identisch, allerdings sind die
Parameter dwFlags und dwReserved nicht vorhanden. Die nachfolgende Erluterung der Argumente
kann dennoch auf beide Funktionen bertragen werden.
szPcpPath: Enthlt die vollstndige Pfadangabe zur PCP-Datei, die zur Generierung des Patches
438
Optimierungen im Servicemodell
Kapitel 10
Bedeutung
0x00000000
0x00000001
0x00000002
0x00000004
0x00000008
Es werden Informationen zur Performance bei der Erstellung des Patches dem Protokoll
angefgt.
0x00000000f
0x00000010
439
Kapitel 10
Optimierungen im Servicemodell
Listing 10.91: Erstellen eines Patches durch Verwenden der Funktion UICreatePatchPackageEx()
Wie zuvor schon angedeutet, kann die Verwendung der Version 4.0 von patchwiz.dll zu
Datenverlusten fhren, falls die Bibliothek auf folgende Weise verwendet wird:
Die Funktion UiCreatePatchPackage() wird aufgerufen und der Parameter hwndStatus wird auf
Null gesetzt.
Oder die Funktion UiCreatePatchPackageEx() wird aufgerufen, der Parameter hwndStatus wird
auf Null und dwFlags wird auf 0x8000 gesetzt.
Oder die Bibliothek patchwiz.dll 4.0 wird durch die Version 3.0 der msimsp.exe aufgerufen.
Intern wird in diesen Fllen der Fehlercode falsch ausgewertet und als Indikator zum Lschen der
temporren Daten angesehen. Hierbei wird jedoch nicht das temporre Verzeichnis entfernt, sondern es
440
Optimierungen im Servicemodell
Kapitel 10
Interne Ablufe
Die patchwiz.dll 4.0 wurde vollstndig auf neu entwickelt. Ihr liegt nun ein modernes WorkflowKonzept zu Grunde, so dass sich der Gesamtablauf sehr strukturiert und transparent darstellt, wie das
auch in Abbildung 10.92 ersichtlich ist.
Dem Funktionsaufruf von UICreatePatchPackage() werden die PCP-Datei und einige zustzliche
Parameter bergeben, wie das auch im Workflow dargestellt ist. Im Folgenden werden mehrere Phasen
durchlaufen, in denen Zwischenergebnisse erzeugt und spter zusammengefgt werden. Das Ergebnis
ist letztlich die spezifizierte Patch-Datei. In dem Protokoll des Generierungsvorgangs werden die
einzelnen Phasen entsprechend dargestellt.
Phase 1: Validierung
Den Beginn macht die Phase 1, in der eine Validierung der Eingabeparameter und der erforderlichen
Dateien durchgefhrt wird. Die berprfung der Eingabeparameter erstreckt sich sowohl auf die
Argumente des Funktionsaufrufs, als auch auf die Informationen der PCP-Datei. Entspricht ein
441
Kapitel 10
Optimierungen im Servicemodell
Parameter nicht den Vorgaben, wird die Erstellung an dieser Stelle beendet, wie auch der Auszug des
Protokolls verdeutlicht.
INFO: Using Pcp Path: D:\Fix1.1\qfe1.pcp.
INFO: Using Temporary Directory: C:\Users\AK\AppData\Local\Temp\~pcw_tmp.tmp.
INFO: Passed all of the main control parameter validation to PatchWiz, now calling the next 5 phases.
INFO: Phase I: Entered validation and processing phase.
INFO:
Validation of Pcp.
ERROR: The property `MinimumRequiredMsiVersion` in the PCP File is invalid.
ERROR:
The Last Error Received is: 87
PERF INFO: Time Spent Validating: 14 ms
INFO: Temporary folder is about to be cleaned out and deleted: C:\Users\AK\AppData\Local\Temp\~pcw_tmp.tmp
ERROR: Internal PatchWiz Error occurred.
ERROR:
The Last Error Received is: -1072803326
PERF INFO: Total Patch Creation Time: 17 ms
ERROR: Internal PatchWiz Error occurred.
ERROR: The Last Error Received is: -1072803326
Anschlieend wird geprft, ob die bentigten Installationspakete vorhanden sind und ob diese im
entsprechenden Format vorliegen. Auch hier wird abgebrochen, falls die Vorgaben nicht erfllt
wurden.
INFO: Using Pcp Path: D:\Fix1.1\qfe1.pcp.
INFO: Using Temporary Directory: C:\Users\AK\AppData\Local\Temp\~pcw_tmp.tmp.
INFO: Passed all of the main control parameter validation to PatchWiz, now calling the next 5 phases.
INFO: Phase I: Entered validation and processing phase.
INFO:
Validation of Pcp.
INFO:
MinimumRequiredMsiVersion is 300.
INFO:
SEQUENCE_DATA_GENERATION_DISABLED is 0.
INFO:
ListOfPatchGUIDsToReplace is .
INFO:
ListOfTargetProductCodes is *.
INFO:
PatchGUID is {CDE584C5-07C7-425B-B3BA-5CF4642F3C45}.
INFO:
PatchOutputPath is D:\Fix1.1\qfe1.msp.
INFO:
AllowProductCodeMismatches is 1.
INFO:
AllowProductVersionMajorMismatches is 1.
INFO:
ApiPatchingSymbolFlags is 0.
INFO:
DontRemoveTempFolderWhenFinished is 0.
INFO:
IncludeWholeFilesOnly is 0.
INFO:
OptimizePatchSizeForLargeFiles is 0.
INFO:
TrustMsi is 0.
INFO:
AllowLaxValidationFlags is 0.
ERROR: TargetImages.MsiPath 'D:\Setup\FB.msi' is marked as having compressed files (PID_WORDCOUNT property
of Summary Information stream). PatchWiz is unable to patch files compressed in a cabinet.
ERROR:
The Last Error Received is: 0
PERF INFO: Time Spent Validating: 36 ms
INFO: Temporary folder is about to be cleaned out and deleted: C:\Users\AK\AppData\Local\Temp\~pcw_tmp.tmp
ERROR: Internal PatchWiz Error occurred.
ERROR:
The Last Error Received is: -1072803554
PERF INFO: Total Patch Creation Time: 39 ms
442
Optimierungen im Servicemodell
Kapitel 10
wird die erste Transformation erzeugt und auf dem Datentrger gespeichert. Hierbei handelt es sich um
die Datenbank-Transformation, die letztlich die Modifikationen zwischen der Datenbank des
Basispaketes und der Datenbank des Aktualisierungspaketes enthlt. Diese Transformation wird
demzufolge nur bentigt, um die vorgenommenen nderungen in der verbundenen Ansicht
abzubilden. Das bedeutet auch, dass die Transformation keine Mechanismen enthlt um die
Ressourcen physisch zu aktualisieren. Die Erstellung der Transformation ist relativ einfach, denn
dieses geschieht unter Verwendung der Funktion MsiDatabaseGenerateTransform(), wobei das Basisund das Aktualisierungspaket bergeben werden.
Phase 3: Analyse und Erstellen der Patch-Transformation
Die Phase 3 ist nochmals unterteilt, denn hierbei handelt es sich um den komplexesten Vorgang
innerhalb der Patch-Generierung. Letztlich wird hierbei die Patch-Transformation erzeugt und es
werden die Dateien ermittelt, die sich im Aktualisierungspaket gendert haben.
Der erste Schritt betrifft die Ermittlung dieser Dateien, wobei die Eigenschaft TrustMsi entscheidend
ist, die in der Tabelle Properties der PCP-Datei festgelegt werden kann. Der Standardwert dieser
Eigenschaft ist 0. Wurde dieser Wert nicht verndert, werden die administrativen Abbilder zur
Feststellung der genderten Dateien verwendet. Das bedeutet, dass ein physischer Vergleich jeder
Datei zwischen dem Basis- und dem Aktualisierungs-Abbild durchgefhrt wird. Ausgenommen sind
jedoch die Dateien, die in der Tabelle UpgradedFilesToIgnore enthalten sind. Es wird zunchst geprft
ob die Dateigre und oder die Dateiversion abweicht. In diesem Fall wurde die Datei auf jeden Fall
verndert und sie wird der Liste der genderten Dateien hinzugefgt. Ist die Dateigre und die
Version identisch, wird Byte fr Byte geprft, ob Unterschiede vorhanden sind. Wurde hingegen die
Eigenschaft TrustMsi auf den Wert 1 festgelegt, wird die in Phase 2 erzeugte DatenbankTransformation zur Ermittlung der genderten Dateien verwendet. Hierbei werden nun alle Dateien der
Liste hinzugefgt, die ber abweichende Daten in der Tabelle File oder MsiFileHash verfgen.
Das Ergebnis der Phase3a ist somit eine Auflistung der genderten Dateien, die nun nacheinander
abgearbeitet und an Phase 3b bergegen werden. Das bedeutet, dass in dieser Phase jede der
genderten Dateien fr die physische Modifikation des Zielsystems vorbereitet wird. Hier wird
zunchst die Eigenschaft IncludeWholeFilesOnly ausgewertet, die in der Tabelle Properties der PCPDatei festgelegt werden kann. Wurde diese Eigenschaft auf den Wert 1 festgelegt, werden
vollstndige Dateien in den Patch bertragen. Das bedeutet, dass von jeder Datei zunchst eine Kopie
erstellt und im Ausgabeverzeichnis abgelegt wird. Weiterhin wird ein Verweis hierauf in die DDFDatei bertragen. Hierbei handelt es sich um eine Steuerdatei, die zur Erzeugung der Kabinettdatei
bentigt wird. Wurde die Eigenschaft IncludeWholeFilesOnly hingegen auf den Wert 0 gesetzt oder
wurde diese Eigenschaft gar nicht definiert, wird ein Binr-Patch erstellt. Das bedeutet, dass die
binren Abweichungen zwischen der ursprnglichen und der aktuellen Datei ermittelt und diese in eine
Datei bertragen werden. Falls konfiguriert werden hierbei noch eventuelle Symboldateien
ausgewertet, da hiermit eine effektivere Identifikation der Abweichungen ermglicht wird. Zur
Generierung der binren Deltas wird die Funktion CreatePatchFileEx() der Bibliothek mspatchc.dll
aufgerufen. Die so erzeugten Deltas werden ebenfalls im Ausgabeverzeichnis abgelegt und eine
Referenz wird der DDF-Datei hinzugefgt. Wird hingegen eine Datei dem Produkt durch den Patch
hinzugefgt, kann kein Delta erstellt werden, da eine ursprngliche Datei gar nicht vorhanden ist. Die
Datei wird somit in vollstndiger Form in den Patch integriert. Nachdem alle binren Deltas erstellt
wurden, wird noch geprft, ob diese grer sind, als die entsprechende vollstndige Datei. Falls das
der Falls ist, wird anstelle des binren Deltas die vollstndige Datei verwendet.
Nachdem fr jede genderte Datei, ein binres Delta oder eine vollstndige Datei ins
Persnliche Ausfertigung fr Martin Martinsson
443
Kapitel 10
Optimierungen im Servicemodell
Ausgabeverzeichnis abgelegt wurden und die DDF-Datei erzeugt wurde, wird die PatchTransformation erzeugt. Die Patch-Transformation ist erforderlich um die Ressourcen physisch zu
modifizieren. Fr die Erstellung dieser Transformation wird zunchst eine Kopie des
Aktualisierungspaketes erstellt und die unten aufgefhrten nderungen darin vorgenommen. Im
Anschluss daran wird eine Transformation zwischen dem vernderten und dem unvernderten
Aktualisierungspaket erstellt. Die in den nachfolgenden Tabellen dargestellten nderungen, die an der
Kopie des Aktualisierungspaketes vorgenommen werden, resultieren berwiegend aus den
Einstellungen und Daten der PCP-Datei.
Die Tabelle PatchPackage beschreibt alle Patches, die auf dieses Produkt angewendet wurden. Dieser
Tabelle wird ein Datensatz mit den folgenden Informationen angefgt:
Feld der Tabelle
PatchPackage.PatchId
Property.PatchGUID
PatchPackage.Media
ImageFamilies.MediaDiskId
Die Tabelle Media enthlt Informationen ber die Quellmedien, die zur Installation bentigt werden.
Dieser Tabelle wird ebenfalls ein neuer Datensatz hinzugefgt.
Feld der Tabelle
Media.DiskId
ImageFamilies.MediaDiskId
Media.LastSequence
Media.DiskPrompt
ImageFamilies.DiskPrompt
Media.Cabinet
Media.VolumeLabel
ImageFamilies.VolumeLabel
Media.Source
ImageFamilies.MediaSrcPropName
Die Tabelle File enthlt eine komplette Aufstellung der Quelldateien mit den bentigten Attributen.
Dateien knnen auf dem Quellmedium im nicht komprimierten Zustand oder in einer Paketdatei
gespeichert werden. Dieser Tabelle wird fr jede vollstndige Datei, die der Kabinettdatei hinzugefgt
wird, ein Datensatz mit den dateispezifischen Informationen angefgt.
Feld der Tabelle
File.Attributes
msidbFileAttributesPatchAdded
File.Sequence
444
Optimierungen im Servicemodell
Kapitel 10
In der Tabelle Patch sind alle Dateien enthalten, die durch Binr-Patches aktualisiert werden. Dieser
Tabelle wird fr jeden Binr-Patch, der der Kabinettdatei hinzugefgt wird, ein Datensatz mit
entsprechenden Informationen angefgt
Feld der Tabelle
Verwendete Daten
Patch.File_
Schlssel fr den Binr-Patch, der identisch ist mit dem Schlssel der Datei die
aktualisiert werden soll.
Patch.Sequence
Patch.PatchSize
Patch.Attributes
Patch.Header
Enthlt einen Hash (24 Byte) des Binr-Patches. Dieser Hash wird bentigt um zu prfen,
ob die entsprechende Datei bereits gepatcht worden ist. In diesem Fall wird der BinrPatch nicht extrahiert.
Verwendete Daten
Action
PatchFiles
Sequence
Das Ergebnis gesamten Phase 3 ist somit die Patch-Transformation, die DDF-Datei und die
modifizierten Dateien, wobei letztere entweder in vollstndiger Form oder als binres Delta vorliegen.
Der Umfang der diesbezglichen Eintragungen im Generierungsprotokoll ist natrlich von der
Komplexitt des Patches abhngig. Sie bieten jedoch den nachfolgend dargestellten
Informationsgehalt.
INFO: Phase III: Entering Prepare Files.
INFO Comparing Files: C:\Users\AK\AppData\Local\Temp\WIX\1.0\Colors\Colors.exe
C:\Users\AK\AppData\Local\Temp\WIX\1.1\Colors\Colors.exe...
INFO File Key: F__Colors.exe is modified
PERF INFO: File Info Lookup Time: 1 ms
INFO Comparing Files: C:\Users\AK\AppData\Local\Temp\WIX\1.0\Colors\InfoLib.dll
C:\Users\AK\AppData\Local\Temp\WIX\1.1\Colors\InfoLib.dll...
INFO File Key: F__InfoLib.dll is modified
PERF INFO: File Info Lookup Time: 1 ms
445
Kapitel 10
Optimierungen im Servicemodell
67 ms
446
Optimierungen im Servicemodell
Kapitel 10
Nachdem die Sequenzinformationen erzeugt wurden, mssen noch die Metainformationen angefgt
werden. Hierbei werden die Informationen der Tabelle PatchMetadata der PCP-Datei in die Tabelle
MsiPatchMetadata bertragen, wie dieses auch in Abbildung 10.94 zustzlich verdeutlicht wird. Die
Ablufe hierzu sind ebenfalls im Protokoll zu finden.
INFO: Phase V: Entering Generate MSP.
INFO:
Generating Patch Metadata.
PERF INFO: Time spent stuffing everything into the MSP: 7 ms
INFO: Temporary folder is about to be cleaned out and deleted: C:\Users\AK\AppData\Local\Temp\~pcw_tmp.tmp
INFO: Patch created successfully.
PERF INFO: Total Patch Creation Time: 293 ms
Wie auch im Protokoll dargestellt wird, ist die Erstellung des Patches nun abgeschlossen. Zuvor wurde
jedoch noch der Summary Information Stream des Patches erzeugt, so dass einer Verwendung des
447
Kapitel 10
Optimierungen im Servicemodell
Die gerade dargestellten Aktionen und Ablufe beziehen sich auf einen normalen Patch, also ein Patch
der letztlich auf Grundlage eines Basis- und eines Aktualisierungspaketes erzeugt wurde. Der
Workflow wird natrlich auch bei Multi-Target-Patches und Multi-SKU-Patches beibehalten,
allerdings werden hierbei einige Aktionen mehrfach ausgefhrt, so dass der Gesamtprozess
komplexere Zge annimmt.
448
Optimierungen im Servicemodell
Kapitel 10
Das relevante Objekt zur Ermittlung der Informationen eines Patches ist die Klasse PatchPackage, die
wiederum von der Klasse Database abgeleitet ist. Die Klasse Database verfgt ber einige interessante
Eigenschaften wie SummaryInfo, mit der die Inhalte des Summary Information Streams ausgelesen
werden knnen. Interessant ist hier beispielsweise die Eigenschaft Template, denn diese enthlt die
Produktcode der Produkte, auf die dieser Patch angewendet werden kann. Zurckblickend handelt es
sich hierbei um den ersten Prfpunkt, bei der Anwendung eines Patches. Diese Produkte knnen
jedoch auch durch die Funktion PatchPackage.GetTargetProductCodes() abgerufen werden. Der
zweite diesbezgliche Prfpunkt bezieht sich auf die Ermittlung der geeigneten Transformationen. Zur
Ermittlung dieser Transformation enthlt die Klasse PatchPackage einige Funktionen wie
GetTransforms() oder GetTransformsInfo(). Wie bereits erlutert, enthlt ein Patch immer mehrere
Transformationen, so dass diese Funktionen immer eine Ergebnisliste zurckliefern. Zur Ermittlung
eines geeigneten Transformationspaares kann die Funktion GetValidTransforms() verwendet werden,
die allerdings eine Referenz auf das entsprechende Produkt bentigt. Die Vorgehensweise zum Abruf
der Informationen ist denkbar einfach und wird im Listing 10.92 dargestellt.
private void ViewPatch(string fileName)
449
Kapitel 10
Optimierungen im Servicemodell
{
using (PatchPackage patchPackage = new PatchPackage(fileName))
{
TransformInfo[] transformInfos = patchPackage.GetTransformsInfo(true);
}
}
Die hieraus resultierenden Ergebnisse werden sehr deutlich, wenn ein Haltepunkt gesetzt wird, so dass
die Objekte und Eigenschaften im berwachungsfenster angezeigt werden, wie dieses in Abbildung
10.96 der Fall ist.
Zustzlich zu den gerade gezeigten Eigenschaften, kann auch direkt auf die Patch-Datenbank
zugegriffen werden, so dass ebenfalls die Metadaten und Inhalte der Tabellen MsiPatchSequence und
MsiPatchMetadata ermittelt werden knnen. Die erforderliche Vorgehensweise ist identisch mit dem
Zugriff auf die Datenbank eines Installationspaketes, wie es bereits in Kapitel 4 erlutert wurde.
Optimierungen
Mit dem Windows Installer 4.5 wird das schon hervorragende Servicemodell des Windows Installer
weiter optimiert. Konkret wurden hierbei drei Anwendungsflle aufgegriffen, die in lteren Windows
Installer-Versionen keine optimale Lsung geboten haben. Diese Anwendungsflle beziehen sich
vornehmlich auf die Deinstallation von Patches, aber auch im Rahmen der pseudoinstallierten Patches
gibt es eine Verbesserung.
450
Optimierungen im Servicemodell
Kapitel 10
Pseudoinstallierte Patches
Eine der grundstzlichen Anforderungen in einem Servicemodell ist die Steuerung der
Gltigkeitsdauer von Patches, also die Festlegung, wann ein Patch fr die Ausfhrung des Produktes
nicht mehr bentigt wird. Diese Anforderungen kommen hufig zum Tragen, wenn ein Patch auf ein
installiertes Produkt angewendet werden soll, der die Aktualisierungen vorheriger Patches bereits
enthlt (Kumulativ) oder der neue Funktionalitten hinzufgt, die ltere, bereits aktualisierte
Funktionalitten auer Kraft setzen. Die Steuerung der Gltigkeitsdauer von Patches bedeutet nicht,
dass der entsprechende Patch physisch vom System entfernt wird, vielmehr wird hierdurch ein Patch
aus der Anwendungsreihenfolge ausgeschlossen, so dass er in einem Pseudoinstallierten Zustand auf
dem System verbleibt. Das bedeutet, dass er zur Konstruktion der verbundenen Ansicht nicht mehr
bercksichtigt wird, wie dieses auch bereits zuvor schon erlutert wurde.
Bei der Installation eines Patches, erstellt der Windows Installer ein im Arbeitsspeicher befindliches
Abbild des Produktes, auf das der Patch angewendet werden soll. Auf dieses Abbild werden dann alle
gltigen Patches in der definierten Reihenfolge angewendet. Der Windows Installer aktualisiert
daraufhin die installierten Ressourcen auf Grundlage der Informationen des im Speicher befindlichen
Abbildes des Produktes. Patches, deren Gltigkeitsdauer verstrichen ist, werden auf das im Speicher
befindliche Abbild nicht mehr angewendet, so dass die enthaltenen Informationen bei der physischen
Aktualisierung der Ressourcen nicht mehr bercksichtigt werden. Diese Vorgehensweise des Windows
Installers lsst sich auch in einem Installationsprotokoll nachvollziehen.
MSI (s) (1C:08) [10:20:29:239]: PatchGUID: {CDE584C5-07C7-425B-B3BA-5CF4642F3C45} PatchFamily: RM
Sequence: 1.0.0.100 SequenceOrder: 0 Type: QFE
MSI (s) (1C:08) [10:20:29:239]: PatchGUID: {8E11C8A0-14A6-41C0-87D3-FA3C474F9FA6} PatchFamily: RM
Sequence: 1.0.0.200 SequenceOrder: 1 Type: QFE
MSI (s) (1C:08) [10:20:29:239]: PatchGUID: {07C6F87F-F3CC-47F7-B00B-D1F92BC0F97C} PatchFamily: RM
Sequence: 1.5.0.300 SequenceOrder: 2 Type: minor upgrade
MSI (s) (1C:08) [10:20:29:239]: PATCH SEQUENCER: minor upgrade patch {07C6F87F-F3CC-47F7-B00B-D1F92BC0F97C}
cannot be superseded because there is no supersedence defined in RM family yet for this type
MSI (s) (1C:08) [10:20:29:239]: PATCH SEQUENCER: minor upgrade patch {07C6F87F-F3CC-47F7-B00B-D1F92BC0F97C}
will attempt to supersede in RM family, starting from sequence 1.5.0.300
MSI (s) (1C:08) [10:20:29:239]: PATCH SEQUENCER: QFE patch {8E11C8A0-14A6-41C0-87D3-FA3C474F9FA6}
is superseded
MSI (s) (1C:08) [10:20:29:239]: PATCH SEQUENCER: QFE patch {CDE584C5-07C7-425B-B3BA-5CF4642F3C45}
is superseded
MSI (s) (1C:08) [10:20:29:239]: SequencePatches returns success.
Die berfhrung eines Patches in einen pseudoinstallierten Zustand kann mit dem Windows InstallerVersionen 3.0 und hher durch zwei unterschiedliche Verfahren erfolgen, die als Obsolescence
(Veralten) und Supersedence (Ablsung) bezeichnet werden. Das als Supersedence bezeichnete
Verfahren basiert auf den Sequenzinformationen eines Patches und steht daher erst seit der Version 3.0
des Windows Installers zur Verfgung. In den Sequenzinformationen kann fr jeden Patch festgelegt
werden, ob ltere Patches der gleichen Patch-Familie abgelst werden sollen, also auf das im Speicher
befindliche Abbild nicht mehr angewendet werden. Hierzu muss die Spalte Attributes der Tabelle
MsiPatchSequence ber den Wert 1 verfgen. Als Obsolescence wird eine Mglichkeit bezeichnet,
die auf das gleiche Ergebnis abzielt, aber nur mit Patches der Windows Installer-Version 2.0 mglich
ist. Ein Patch, der ber Sequenzinformationen verfgt, also ein Patch 3.0, kann ausschlielich das
Verfahren Supersedence verwenden, um die Gltigkeitsdauer von Patches zu beeinflussen.
451
Kapitel 10
Optimierungen im Servicemodell
Obsolescence
Supersedence
Zielbestimmung
Umfang
Alle Patches
Bedingung
Nein
Verketten (Chaining)
Ja
Patches entfernen
Nein
Ja
Bei der Verwendung des Windows Installers 2.0 kann ein Patch nur in einen pseudoinstallierten
Zustand versetzt werden, indem dieser als Obsoleted gekennzeichnet wird. Hierzu ist es erforderlich
den PatchCode des veralteten Patches der Eigenschaft Obsolete des Summary Information Stream des
aktuellen Patches hinzuzufgen. Bei der Installation des aktuellen Patches, wird der veraltete Patch
vollstndig vom Produkt entfernt. Dies bedeutet, dass sowohl die Registrierungsinformationen, als
auch das zwischengespeicherte Patchpaket entfernt werden; allerdings sind die modifizierten
Ressourcen hiervon ausgenommen. Da smtliche Konfigurationsdaten hierbei entfernt werden, lsst
sich zu einem spteren Zeitpunkt nicht mehr feststellen, dass dieser Patch jemals installiert war. Dieses
ist insofern ein Problem, da im Rahmen einer Inventarisierung des Systems, dieses durchaus erwnscht
452
Optimierungen im Servicemodell
Kapitel 10
wre. Weiterhin kann ein solcher Patch zu einem spteren Zeitpunkt wieder problemlos auf das
Produkt angewendet werden, wodurch nderungen des aktuellen Patches eventuell berschrieben
werden.
Wird hingegen ein Patch unter Verwendung des Windows Installer 3.0 und hher in den Status
Obsoleted oder Superseded versetzt, bedeutet dies, dass der Patch bei Installationsttigkeiten nicht
mehr auf das im Speicher befindliche Abbild des Produktes angewendet wird. Allerdings bleiben die
Status- und Metainformationen des Patches erhalten, so dass im Rahmen einer Inventarisierung
jederzeit exakte Informationen zur Verfgung stehen. Diese nderungen gegenber dem Windows
Installer 2.0 resultieren in den folgenden vernderten Verhaltensmustern:
Pseudoinstallierte Patches bleiben dem System erhalten: Patches, die in den Zustand Obsoleted
oder Superseded versetzt werden, bleiben in den Konfigurationsdaten des Produktes erhalten.
Hierdurch ist es mglich, dass Patches, die nicht mehr zu den aktiven Patches eines Produktes
gehren, trotzdem ber die Inventarisierungsfunktionen des Windows Installers abgerufen werden
knnen. Die Inventarisierungsdaten enthalten hierbei einen Hinweis auf den aktuellen
Installationsstatus des Patches.
Patches werden reaktiviert, wenn sich die Bedingung ndert: Befindet sich ein Patch im Status
Obsoleted oder Superseded und wird die hierfr zustndige Bedingung gendert, wird der Patch
wieder aktiviert und auf das Produkt angewendet. Die Reaktivierung wird in der gleichen
Transaktion ausgefhrt, in der auch die Bedingung verndert wird. Durch die Installation des
Patches SP1 wird beispielsweise der Patch QFE1 in den Status Superseded versetzt. Wird nun der
Patch SP1 deinstalliert, wird der Patch QFE1 in der gleichen Transaktion wieder auf das Produkt
angewendet. Die Ressourcen befinden sich anschlieend in der Version auf dem System, wie sie im
Patch QFE1 definiert wurden.
Eine erneute Installation des Patches versetzt das Produkt in keinen ungltigen Status: Befindet
sich ein Patch im Status Obsoleted oder Superseded und wird dieser Patch erneut auf das Produkt
angewendet, behalten die Ressourcen und der Patch den aktuellen Status bei. Durch die Installation
des Patches SP1 wird beispielsweise der Patch QFE1 in den Status Superseded gesetzt. Wird im
Anschluss der Patch QFE1 erneut auf das Produkt angewendet, behalten die Ressourcen den
aktuellen Status bei, das bedeutet, dass sie nicht verndert werden.
Gerade bei Produkten, die ber einen sehr langen Zeitraum verwendet und gepflegt werden, nimmt die
Anzahl der aktuellen und natrlich auch der pseudoinstallierten Patches stndig zu. Die Forderung
nicht mehr bentigte Patches in einem pseudoinstallierten Zustand auf dem System zu belassen, anstatt
sie zu deinstallieren, bleibt unbestritten.
Inventarisierung
Im Kapitel 4 wurden bereits Lsungsanstze aufgezeigt, mit denen die bereits installierten Produkte
eines Systems ermittelt werden konnten. Zustzlich zu den Produkten knnen natrlich auch die
Patches ermittelt werden, die sich auf dem System befinden. Hierbei knnen ebenfalls der Status des
Patches, der Installationszeitpunkt und weiteren Daten abgerufen werden, wodurch der Updateverlauf
sehr gut dargestellt werden kann. Wie bereits bei den Produkten stellt auch hierzu die Deployment
Tools Foundation die notwendigen Werkzeuge zur Verfgung. Das wesentliche Objekt hierzu ist die
Klasse PatchInstallation die sich im Namensraum Microsoft.Deployment.WindowsInstaller befindet
und deren Struktur in Abbildung 10.97 dargestellt ist.
453
Kapitel 10
Optimierungen im Servicemodell
Die Klasse PatchInstallation ist wiederum sehr einfach zu verwenden. Um alle registrierten Patches
abzurufen, kann die Eigenschaft PatchInstallation.AllPatches verwendet werden. Um die
Ergebnismenge im Vorfeld einzuschrnken sollte die die Funktion PatchInstallation.GetPatches()
verwendet werden. Beim Aufruf der Funktion knnen diverse Filterbedingungen, wie das zugeordnete
Produkt, der Installationskontext, der Benutzer oder der Status des Patches vorgegeben werden. Das
Ergebnis ist wie bei der zuvor genannten Mglichkeit eine Liste aller Patches, die diesen Kriterien
entsprechen. Die Liste kann einfach durchlaufen und die Eigenschaften knnen abgerufen werden, wie
dieses in Listing 10.93 dargestellt wird.
private void ViewPatches()
{
// Patches fr ein speziellen Produkt abrufen
IEnumerable<PatchInstallation> patches = PatchInstallation.GetPatches(
null,
"{AE581993-EA96-4632-A0F8-2D3B7DBB86E8}",
null,
UserContexts.UserUnmanaged,
true);
// Informationen aller Patches ausgeben
foreach (PatchInstallation patch in patches)
{
Console.WriteLine("DisplayName: " + patch.DisplayName);
Console.WriteLine("IsSuperseded: " + patch.IsSuperseded.ToString());
Console.WriteLine("IsObsoleted: " + patch.IsObsoleted.ToString());
Console.WriteLine("InstallDate: " + patch.InstallDate.ToShortDateString());
Console.WriteLine("Uninstallable: " + patch.Uninstallable.ToString());
Console.WriteLine("LocalPackage: " + patch.LocalPackage);
}
}
454
Optimierungen im Servicemodell
Kapitel 10
Die Klasse PatchInstallation kann ebenfalls verwendet werden um die registrierten Installationsquellen
des Patches abzurufen oder zu modifizieren. Weiterhin knnen Eigenschaften des Patches wie
PatchCode oder ProductCode verwendet werden, um weitere Funktionen der Deployment Tools
Foundation aufzurufen. Die Mglichkeiten sind somit sehr gro und der Phantasie sind nahezu keine
Grenzen gesetzt.
455
Kapitel 10
Optimierungen im Servicemodell
ComponentId={57B2DC5A-BFC6-4C8C-B573-8E04B3608D68})
Wie bereits angedeutet, sind die neu hinzugefgten Komponenten mit dem Attribut
msidbComponentAttributesUninstallOnSupersedence zu kennzeichnen. Das bedeutet, dass in der
Tabelle Components des Aktualisierungspaketes auf den Wert der Spalte Attributes der Wert 1024
addiert werden muss. Bei der Verwendung von Windows Installer-XML ist dem Element Component
das Attribut UninstallWhenSuperseded anzufgen, wie dieses auch auszugsweise in Listing 10.94
zeigt.
<!--Neue Komponente-->
<Component Id="C__New.txt" Guid="{57B2DC5A-BFC6-4c8c-B573-8E04B3608D68}" UninstallWhenSuperseded="yes">
<File Id="F__Readme.txt" Source=".\Binaries\ReadMe.txt" Name="ReadMe.txt" KeyPath="yes" DiskId="1" />
</Component>
Listing 10.94: Kennzeichnung einer Komponente die in bestimmten Situationen automatisch entfernt wird
Der skizzierte Lsungsansatz ist einfach umsetzbar, offenbart jedoch eine groe Schwachstelle, da er
nur fr knftige Patches verwendet werden kann. Es ist jedoch zu vermuten, dass eine Vielzahl von
Patches bereits existiert, bei denen die neuen Komponenten noch nicht gekennzeichnet sind und somit
wieder zu dem problematischen Verhalten fhren werden. Auch fr diese Flle stellt der Windows
Installer 4.5 in Form der Eigenschaft MSIUNINSTALLSUPERSEDEDCOMPONENTS einen
Lsungsansatz zur Verfgung. Bei der Installation des Patches, der die vorherigen Patches in den
pseudoinstallierten Zustand versetzt, muss diese Eigenschaft auf den Wert 1 gesetzt werden. Hierbei
ist es unerheblich, ob die Eigenschaft ber die Befehlszeile gesetzt wird oder ob Sie bereits in der
Tabelle Property des Aktualisierungspaketes definiert wurde. Wichtig ist nur, dass durch diese
Kennzeichnung, die Komponenten der Patches entfernt werden, die in den Status Superseded gesetzt
wurden.
Bleibt
an
dieser
Stelle
nur
noch
anzumerken,
dass
das
Attribut
msidbComponentAttributesUninstallOnSupersedence
und
die
Eigenschaft
MSIUNINSTALLSUPERSEDEDCOMPONENTS erst seit der Version 4.5 des Windows Installers zur
Verfgung stehen und dass frhere Versionen des Windows Installer diese Daten ignorieren.
Interne Ablufe
Zur Deinstallation von Patches verwendet der Windows Installer den Reinstallations-Modus des
Produktes, der fr diesen Zweck speziell angepasst wurde. Durch diese Anpassung werden nur die
Dateien durch eine ltere Dateiversion ersetzt, die tatschlich von dem Patch gendert wurden. Die
Eigenschaft REINSTALLMODE verwendet hierbei generell die Option a, so dass unabhngig vom
Ergebnis der Versionierungsregel, die Dateien berschrieben werden knnen. Hieraus lsst sich
ableiten, dass die Eigenschaft REINSTALLMODE nicht global fr das gesamte Produkt gilt, sondern
sich ausschlielich auf die durch den Patch modifizierten Dateien auswirkt. Durch diese
456
Optimierungen im Servicemodell
Kapitel 10
Vorgehensweise wird eine performante Ausfhrung bei der Deinstallation des Patches gewhrleistet.
Weiterhin wird der Zugriff auf die Installationsquellen vermieden, da nur Ressourcen bentigt werden,
die bereits auf dem System vorhanden sind oder durch die Informationen des zwischengespeicherten
Installationspaketes und des Patch-Paketes hergestellt werden knnen. Der vollstndige
Deinstallationsprozess von Patches lsst sich somit in mehrere Abschnitte unterteilen, die nachfolgend
aufgefhrt werden:
55. Festlegung der Anwendungsreihenfolge der Patches: Es werden alle bereits angewendeten
Patches bei der Festlegung bercksichtigt. Der zu deinstallierende Patch wird jedoch aus dieser
Auflistung entfernt. Die erneute Festlegung ist erforderlich, um den Status der pseudoinstallierten
Patches erneut auszuwerten und diese bei Bedarf wieder zu reaktivieren.
56. Erstellen einer Dateiliste: Es wird eine Liste der genderten Dateien unter Verwendung der im
Patch enthaltenen Transformationen erstellt.
57. Generierung einer Liste von Features: Zur Anwendungsoptimierung werden die Features
ermittelt, die von den nderungen des Patches tatschlich betroffen sind. Zustzlich werden die
Elemente ermittelt, die durch die Anwendung des Patches, dem Produkt hinzugefgt wurden, wie
beispielsweise neue Eintragungen in der Systemregistrierung. Zum einen werden die hiervon
betroffenen Features der Auflistung hinzugefgt und zum anderen werden zum Entfernen dieser
Elemente die erforderlichen Operationsanweisungen erstellt.
58. Setzen der Eigenschaften: Es werden die Eigenschaften REINSTALL und REINSTALLMODE auf
die ermittelten Werte gesetzt. Die Eigenschaft REINSTALL wird entweder auf ALL oder auf die
optimierte Liste der Features gesetzt. Die Eigenschaft REINSTALLMODE wird auf amus gesetzt,
um Dateien unabhngig vom Ergebnis der Versionsprfung zu berschreiben. Zu beachten ist
hierbei, dass die Option a nicht global fr das Produkt gilt, sondern nur fr die Dateien der
generierten Dateiliste.
59. Entfernen der Patch-Informationen: Es werden Operationsanweisungen zum Entfernen der
Registrierungsinformationen des Patches und zum Lschen des zwischengespeicherten PatchPaketes erstellt.
Der entscheidende Punkt ist wiederum das Festlegen der Anwendungsreihenfolge der Patches, wobei
der zu entfernende Patch auer Acht gelassen wird. Bildlich dargestellt wird der zu deinstallierende
Patch aus der ursprnglichen verbundenen Ansicht entfernt um die neue Sicht auf das finale Produkt
zu erhalten, wie dieses auch Abbildung 10.98 zeigt. Dieser Punkt ist so entscheidend, da alle weiteren
Aktivitten, diese neue verbundene Darstellung nutzen und somit eventuelle Probleme weitreichende
Folgen htten.
457
Kapitel 10
Optimierungen im Servicemodell
Patch nicht in allen Fllen deinstalliert werden. Diese Einschrnkung ist von dem Inhalt und der Art
des Patches abhngig, sowie von Systemrichtlinien und den Rechten des jeweiligen Benutzers. Um
einen Patch deinstallieren zu knnen mssen die folgenden Vorgaben erfllt sein:
Die Deinstallation darf nicht durch die Systemrichtlinie DisablePatchUninstall verhindert werden.
Der Benutzer muss ber die erforderlichen Privilegien verfgen und die Deinstallation muss im
geeigneten Kontext erfolgen.
Der Patch muss fr die Deinstallation gekennzeichnet sein.
Gerade der letzte Punkt ist uerst interessant, da er nicht in allen Fllen direkt beeinflusst werden
kann. Bei der Installation eines Patches wird bereits festgelegt, ob ein Patch wieder deinstalliert
werden kann. Diese Informationen werden in den Konfigurationsdaten abgelegt, und knnen jederzeit
abgeprft werden. In Listing 10.93 wurde bereits dargestellt wie bestimmte Eigenschaften der
Konfigurationsdaten eines Patches abgerufen werden knnen. In dem Beispiel wird ebenfalls die
Eigenschaft Uninstallable ausgegeben, die ber die Deinstallierbarkeit eines Patches informiert. Diese
Kennzeichnung wird vom Windows Installer automatisch vergeben und orientiert sich an den
folgenden Faktoren.
Der Patch muss formal fr die Deinstallation gekennzeichnet werden. Hierzu muss die Eigenschaft
AllowRemoval der Tabelle MsiPatchMetadata den Wert 1 enthalten.
Es darf sich um keinen Major-Upgrade-Patch handeln.
Der Patch darf nur nderungen vornehmen, die auch zurckgenommen werden knnen. Das
bedeutet auch, dass nderungen an bestimmten Tabellen der Datenbank den Patch in einen nicht
deinstallierbaren Zustand versetzen.
Sind diese Voraussetzungen geschaffen, stehen mehrere Mglichkeiten zur Verfgung, einen Patch zu
deinstallieren. Diese Verfahren erstrecken sich auf Optionen der Befehlszeile, auf programmtechnische
Funktionsaufrufe oder auf Erweiterungen in der Benutzeroberflche des jeweiligen Betriebssystems.
Die letztgenannte dialoggesttzte Option zur Deinstallation von Patches ist wesentlich vom
verwendeten Betriebssystem abhngig. Bei der Verwendung von Windows XP und Windows Server
2003 werden diese Optionen im Dialog Software der Systemsteuerung angeboten. Bei Windows Vista
und Windows Server 2008 ist eine Deinstallation mit Hilfe des Dialogs Installierte Updates mglich
wie auch Abbildung 10.99 zeigt.
458
Optimierungen im Servicemodell
Kapitel 10
Die Deinstallation von Patches kann auch durch Befehlszeilenoptionen realisiert werden. Hierzu stehen
zwei unterschiedliche Aufrufmglichkeiten zur Verfgung.
msiexec /i <Referenz auf das Produkt> MSIPATCHREMOVE=<Referenz auf
den Patch>[;<Referenz auf den Patch>]
msiexec /package <Referenz auf das Produkt> /uninstall <Referenz auf
den Patch>[;<Referenz auf den Patch>]
Bei allen Mglichkeiten zur Deinstallation von Patches muss immer das Produkt angegeben werden,
von dem der Patch entfernt werden soll. Bei Verwendung von Multi-SKU-Patches mssen demzufolge
mehrere Befehlszeilenaufrufe erfolgen, um den Patch von allen Produkten zu entfernen. Zur Angabe
des Produktes kann sowohl eine Pfadangabe zu dem Installationspaket, als auch die Eigenschaft
ProductCode verwendet werden. Der zu deinstallierende Patch kann ebenfalls ber eine Pfadangabe
oder die Eigenschaft PatchCode festgelegt werden. Es besteht auch die Mglichkeit mehrere Patches
innerhalb einer Transaktion von einem Produkt zu entfernen. Hierzu sind die Referenzen auf die
Patches durch Semikolon voneinander zu trennen.
Ein Patch kann natrlich auch programmtechnisch entfernt werden, wobei die gleichen Vorgaben und
Persnliche Ausfertigung fr Martin Martinsson
459
Kapitel 10
Optimierungen im Servicemodell
Einschrnkungen gelten. Bei Verwendung der Deployment Tools Foundation steht zum Entfernen von
Patches die Funktion Installer.RemovePatches() zur Verfgung. In Kombination mit den
Inventarisierungsmglichkeiten, kann eine Funktion erstellt werden, die einen Patch von allen
Produkten entfernt, auf die er angewendet wurde.
private void RemovePatch(string patchCode)
{
// Installierte Patches abrufen
IEnumerable<PatchInstallation> patches = PatchInstallation.GetPatches(
patchCode,
null,
null,
UserContexts.All,
true);
// PatchCode einer Liste hinzufgen
List<string> patchGuids = new List<string>();
patchGuids.Add(patchCode);
// Patch von allen Produkten entfernen
foreach (PatchInstallation patch in patches)
{
if (patch.Uninstallable)
{
Installer.RemovePatches(patchGuids, patch.ProductCode, string.Empty);
}
}
}
Optimierungen im Servicemodell
Kapitel 10
Dieser neue Algorithmus des Windows Installers wird jedoch nicht automatisch verwendet, vielmehr
muss die jeweilige Komponente mit dem Attribut msidbComponentAttributesShared gekennzeichnet
werden. Die Kennzeichnung muss nicht in jedem Paket vorgenommen werden, mit dem diese
Komponente installiert wird, sondern die Kennzeichnung in mindestens einem Paket ist hierfr
ausreichend. In dem Beispiel ist es somit unerheblich, ob die Komponenten im Installationspaket von
461
Kapitel 10
Optimierungen im Servicemodell
Microsoft Word 2007 oder Microsoft Outlook 2007 gekennzeichnet wurde. Wichtig ist nur, dass die
Komponente in mindestens einem Paket fr die gemeinsame Verwendung markiert wurde.
Hinweis Beginn
Es gilt zu beachten, dass aus Grnden der Kompatibilitt oder sonstiger Anforderungen, das optimierte
Verhaltensmuster bei gemeinsamen Komponenten auer Kraft gesetzt werden kann. Hierzu ist die
neue Systemrichtlinie DisableSharedComponent auf den Wert 1 zu setzen.
Hinweis Ende
Die zuvor erwhnte Kennzeichnung ist in der Tabelle Components vorzunehmen, indem fr die
gemeinsame Komponente der Wert der Spalte Attributes um 2048 erhht wird. Bei der Verwendung
von Windows Installer-XML ist dem Element Component das Attribut Shared anzufgen, wie dieses
auch auszugsweise in Listing 10.96 aufgezeigt wird.
<Directory Id="CommonFilesFolder">
<Directory Id="COMMONINSTALLLOCATION" Name ="Windows Installer-Shared">
<Component Id="C__Spellchecker.dll" Guid="{EC60E883-8FD6-4bd3-85A9-FD995174F491}" Shared="yes" >
<File Id="F__Spellchecker.dll" Source=".\Binaries\SpellChecker_120.dll" Name="Spellchecker.dll"
KeyPath="yes" AssemblyManifest="F__Spellchecker.dll" AssemblyApplication="F__Spellchecker.dll"
Assembly=".net" DiskId="1" />
</Component>
</Directory>
</Directory>
Die grundstzliche Vorgehensweise zur Nutzung von gemeinsam verwendeten Komponenten, sollte
natrlich in der Verwendung von Mergemodulen oder alternativen Technologien wie Windows
Installer-XML-Bibliotheken liegen. Hierdurch wird die Komponente nur an einer Stelle definiert und
kann von mehreren Quellen referenziert werden, so dass die erzeugten Installationspakete identische
Daten enthalten und sich natrlich im Installationsprozess auch identisch verhalten. Es wird deutlich,
dass durch die Verwendung geeigneter Werkzeuge und der neuen Mglichkeiten des Windows
Installers 4.5, die Nutzung gemeinsamer Komponenten wesentlich effektiver gestaltet werden kann.
462
Optimierungen im Servicemodell
Kapitel 10
Datenbankmoduls ersetzt. Weiterhin werden durch eine benutzerdefinierte Aktion einige der
Systemtabellen angepasst, damit sie von dem aktualisierten Datenbankmodul verwendet werden
knnen. Wird zu einem spteren Zeitpunkt der Patch wieder entfernt, wird zwar das Datenbankmodul
auf die ursprngliche Version zurck gesetzt, aber die Systemtabellen bleiben unverndert. Hierdurch
bedingt, kann die Ausfhrung des Produktes nicht mehr sichergestellt werden. Zur Vermeidung einer
solchen Problematik existieren im Prinzip nur zwei Lsungsanstze.
Der Patch wird als nicht deinstallierbar gekennzeichnet. Diese Methode ist sehr einfach
durchfhrbar, setzt aber einige der relevanten Funktionen des Servicemodells auer Kraft.
Die Aktualisierung des Microsoft SQL Servers wird durch zwei Patches realisiert. Der erste Patch
enthlt die benutzerdefinierte Aktion, die bei der Deinstallation des zweiten Patches ausgefhrt
werden soll.
Die zuletzt genannte Vorgehensweise ist mglich und stellt bei Verwendung des Windows Installers
4.0 die einzige echte Mglichkeit zur Lsung des Problems dar. Die Umsetzung ist problematisch
und unkomfortabel. Zunchst muss die Ausfhrung der benutzerdefinierten Aktion mit einer
Bedingung versehen werden, damit sie nur bei der Deinstallation des entsprechenden Patches
ausgefhrt wird und nicht bei der Deinstallation jedes Patches. Hierzu kann die Eigenschaft
MsiPatchRemovalList verwendet werden. Dieser Eigenschaft werden die Patchcodes aller Patches
angefgt, die whrend der Patch-Deinstallation entfernt werden. Somit muss der erste Patch den
Patchcode des zweiten Patches kennen, damit die Bedingung entsprechend definiert werden kann. Ein
weiterer problematischer Punkt liegt in der Aufteilung des Codes zur Durchfhrung der nderungen,
da ja fr die Installation und Deinstallation unterschiedliche Patches verwendet werden mssen. Dieses
durchbricht auch die Symmetrielsung, die beim Design von benutzerdefinierten Aktionen gefordert
ist. Weiterhin wird natrlich auch die Pflege und Verwaltung der Codefragmente wesentlich erschwert.
Mit dem Windows Installer 4.5 wird das Portfolio der benutzerdefinierten Aktionen um eine echte
Patch Uninstall Custom Action erweitert, also um eine benutzerdefinierte Aktion, die im Patch
definiert werden kann aber auch nur bei der Deinstallation des Patches ausgefhrt wird. Zur
Kennzeichnung einer solchen benutzerdefinierten Aktion wurde das Schema der Tabelle CustomAction
angepasst, indem eine neue Spalte mit der Bezeichnung ExtendedType angefgt wurde, wie das auch
nachfolgend dargestellt wird.
Spalte
Typ
Gre
Schlssel
Null
Beschreibung
Action
Identifier
s72
Type
Integer
i2
Source
CustomSource
s72
Target
Formatted
s255
ExtendedType
DoubleInteger
i4
463
Kapitel 10
Optimierungen im Servicemodell
Zur Kennzeichnung einer benutzerdefinierten Aktion, die nur bei der Deinstallation eines Patches
ausgefhrt werden soll, ist diese mit dem Attribut msidbCustomActionTypePatchUninstall zu versehen.
Das bedeutet, dass der Spalte ExtendedType der Wert 32768 zuzuweisen ist. Noch ein Wort zu der
Vernderung der Tabellenstruktur und der Frage warum die Kennzeichnung nicht in der Spalte Type
vorgenommen werden kann. Der Spalte Type liegt der Datentyp Integer zu Grunde, so dass als
Maximalwert 32767 verwendet werden kann. Das bedeutet, dass sich der Wert
msidbCustomActionTypePatchUninstall auerhalb des gltigen Bereichs befindet und kleinere Werte
nicht mehr zur Verfgung stehen. Eine nachtrgliche nderung des Datentyps der Spalte Type in
DoubleInteger wrde die Kompatibilitt durchbrechen.
Die Definition in einem WXS-Dokument ist wiederum relativ einfach und richtet sich natrlich auch
nach der Art der benutzerdefinierten Aktion. Wesentlich ist jedoch das Attribut PatchUninstall des
Elementes <CustomAction/>, das auf den Wert yes zu setzen ist, wie das auch in Listing 10.97
gezeigt wird.
<!--Festlegen der benutzerdefinierten Aktion-->
<CustomAction Id="PatchUnstallCA" PatchUninstall ="yes" BinaryKey="CADLL" Execute="deferred"
Impersonate="no" DllEntry="RemoveTable"/>
<!--Einordnen in die Ausfhrungssequenz-->
<InstallExecuteSequence>
<Custom Action="PatchUnstallCA" After="RemoveFiles" />
</InstallExecuteSequence>
Listing 10.97: Benutzerdefinierten Aktion, die bei der Deinstallation eines Patches ausgefhrt wird
Eine benutzerdefinierte Aktion, die bei der Deinstallation eines Patches ausgefhrt werden soll, ist im
Aktualisierungspaket zu definieren, so dass sie in den Patch bertragen wird. Bei der Deinstallation des
Patches, wird auf die im Patchpaket enthaltene Aktion zugegriffen und sie wird ausgefhrt. Es ist nicht
mglich eine benutzerdefinierte Aktion, die bereits im Installationspaket vorhanden ist, nachtrglich
durch einen Patch zu modifizieren und somit fr den Deinstallationsfall nutzbar zu machen.
Problematische Aspekte ergeben sich bei der Verwendung des Windows Installers 4.0 oder frher in
Verbindung mit solchen benutzerdefinierten Aktionen. Wird ein entsprechend definierter Patch auf
einem solchen System angewendet, wird die benutzerdefinierte Aktion nicht bei der Deinstallation des
Patches ausgefhrt, da die diesbezgliche Funktionalitt nicht zur Verfgung steht. Vielmehr wird die
benutzerdefinierte Aktion bei jeder Installationsttigkeit, also bei der Installation, der Reparatur oder
der Aktualisierung ausgefhrt. Zur Vermeidung ist die Ausfhrung von einer Bedingung abhngig zu
machen, die auf die Eigenschaft MSIPATCHREMOVE abzielt und somit die Installation unter lteren
Versionen des Windows Installers nicht beeintrchtigt.
Fazit
Durch die Verwendung von Windows Installer-Patches wird das Servicemodell zur Aktualisierung von
Windows Installer-Produkten extrem erweitert. Das begrndet sich dadurch dass kleine, kompakte
Daten fr diese Zwecke zur Verfgung gestellt werden knnen, die weiterhin auch noch auf mehrere
Zielprodukte angewendet werden knnen. Mit dem Windows Installer 3.0 wurden neue funktionale
Ergnzungen eingefhrt, die viele Probleme bei der Verwendung von Patches beseitigen, die mit
frheren Versionen des Windows Installers aufgetreten sind. Mit dem Windows Installer 4.5 wurde
noch ein wenig nachgebessert, um nahezu optimale Ergebnisse im Aktualisierungsprozess erzielen zu
464
Optimierungen im Servicemodell
Kapitel 10
knnen. Diese Nachbesserungen beziehen sich nicht nur auf optimierte und flexiblere Ablufe im
tatschlichen Installationsprozess sondern beinhalten auch Verbesserungen in der Toollandschaft.
Das ist jedoch nicht alles was der Windows Installer 4.5 zu bieten hat, denn es sind auch
Erweiterungen und Verbesserungen in anderen Bereichen vorgenommen worden. Ein groes Plus
ergibt sich zunchst durch die breite Plattformuntersttzung. So kann diese Windows Installer-Version
auf den Betriebssystemen der aktuellen Generation verwendet werden, aber auch die vorherigen
Betriebssysteme Windows XP und Windows Server 2003 werden noch untersttzt. Der Hauptgrund
der zur Entwicklung des Windows Installer 4.5 gefhrt hat, ist der Wandel, den die moderne
Softwareinstallation derzeitig durchluft. Die zuknftige Installationslandschaft ist nicht mehr durch
monolithische Installationspakete gekennzeichnet, sondern orientiert sich an einem Modell, in dem
modular aufgebaute Pakete verwendet werden und somit flexibler auf Marktanforderungen reagiert
werden kann. Der Windows Installer 4.5 stellt nun alle Funktionalitten zur Verfgung, um die
modularen Installationspakete zu einer Gesamtinstallation zusammenzufassen, die transaktional ber
Paketgrenzen hinweg arbeitet und darber hinaus noch eine konsistente Benutzerinteraktion whrend
des gesamten Lebenszyklus des Produktes ermglicht.
465
Anhang A
Glossar
Glossar
Hier wird automatisch ein Inhaltsverzeichnis generiert, bitte nicht manuell bearbeiten!
A
ACL: Siehe Zugriffssteuerlisten
Administrative Installation: Kennzeichnet eine Installationsart, bei der das Produkt in keinen
ausfhrbaren Zustand versetzt wird, sondern lediglich die Inhalte eines Installationspaketes extrahiert
werden. Solche Installationen knnen wiederum als Installationsquelle fr klassische
Installationsprozesse dienen oder zur Erzeugung von Windows Installer-Patches verwendet werden.
Advertising: Bezeichnet eine Installationsform des Installers, bei der nur Schnittstellen auf dem
System registriert werden, ohne das Produkt physisch zu installieren. Wird eine dieser Schnittstellen
aktiviert, wird das Produkt automatisch installiert.
B
Basisinstallation: Die klassische erstmalige Installation eines Produktes. Andere Bezeichnungen
hierfr sind Client- oder Erstinstallation.
Benutzerdefinierte Aktion (engl. custom action): Eine Aktion, die durch den Autor des
Installationspaketes erstellt wurde mit dem Ziel eine funktionsspezifische Aufgabe im
Installationsprozess auszufhren, fr die keine Standardaktion vorhanden ist.
Benutzerkontensteuerung (engl. User Account Control): Ein Mechanismus in den Betriebssystemen
Windows Vista und Windows Server 2008, mit dem die unbefugte Ausfhrung von Software
verhindert oder eingeschrnkt wird.
Bootstrapper: Eine Anwendung zur Steuerung der Installation mehrerer Produkte. Der Bootstrapper
sehr nur bei der Erst- oder Basisinstallation zur Verfgung.
C
Chainer: Eine Anwendung zur Installation, Aktualisierung und Deinstallation mehrerer Produkte. Im
Vergleich zum Bootstrapper wird der Chainer whrend des gesamten Produktlebenszyklus verwendet.
Clientinstallation: Siehe Basisinstallation.
D
Deployment Tools Foundation [Abk. DTF]: Eine Programmierschnittstelle fr die .NET-Welt zum
Zugriff auf die Windows Installer-Funktionalitt. Die Deployment Tools Foundation ist Bestandteil der
Toolsammlung Windows Installer-XML.
Driver Installation Framework [Abk. DIFx]: Eine Toolsammlung, durch die eine Installation von
466
Glossar
Anhang A
E
ECMA: [Abk. fr European Computer Manufacturers Association]: Eine 1961 gegrndete
Industrievereinigung von europischen Computerherstellern, die Vorschlge fr die Normung und
Standardisierung von Informations- und Kommunikationssystemen erarbeitet.
Ereignisprotokoll: Diese Informationen knnen zur Diagnose von fehlerhaften Installationsablufen
verwendet werden.
Erstinstallation: Siehe Basisinstallation
F
Feature: Die kleinste installierbare Einheit eines Produktes aus Sicht des Benutzers. Ein Feature
enthlt immer ein oder mehrere Komponenten.
G
GUID (engl. globally unique identifier): Ein Identifikationsschema zur eindeutigen Bezeichnung von
Objekten.
K
Komponente: Die kleinste installierbare Einheit eines Produktes aus Sicht des Autors. Eine
Komponente fasst die zu installierenden Ressourcen zu logischen Gruppierungen zusammen.
M
Managed Installation: Siehe Verwaltete Installation
Managed Kontext: Bezeichnet den Per-User-Managed oder den Per-Machine Kontext.
Mergemodul (MSM-Datei): Bei einem Mergemodul handelt es sich um eine Datenbank, die in ein
Installationspaket integriert werden kann und somit neue Komponenten fr die Anwendung zur
Verfgung stellt. Mergemodule stehen nur im Entwicklungsprozess zur Verfgung und knnen daher
nicht separat installiert werden.
MSI: Kurzform der Microsoft Windows Installer-Technologie, die ursprnglich als Microsoft
Software Installer-Technologie bezeichnet werden sollte. Wird ebenfalls als Dateiendung fr ein
Windows Installer-Paket verwendet.
Multi Package Transaktion: Siehe paketbergreifende Transaktionen
N
Neustart-Manager (engl. Restart Manager): Eine Technologie in Windows Vista und Windows
Server 2008 zur Reduzierung der Computerneustarts.
O
Orca: Orca ist ein Tool zur direkten Bearbeitung von Windows Installer-Paketen, das im Windows
467
Anhang A
Glossar
P
Paketbergreifende Transaktion: Eine neue Funktionalitt im Windows Installer 4.5 zur Installation
mehrerer Produkte innerhalb einer Transaktion.
Patch 2.0: Ein Windows Installer-Patch, der nicht ber die Tabelle MsiPatchSequence verfgt.
Patch 3.0: Ein Windows Installer-Patch, der die Tabelle MsiPatchSequence enthlt.
Patching: Bezeichnet eine Methode, um Dateien zu aktualisieren. Hierbei werden nicht die
vollstndigen Dateien ausgetauscht, sondern auf physischer Ebene nur die tatschlich abweichenden
Bytes.
Privilegierte Installation: Bezeichnet Installationen, in denen die durchzufhrenden Aktionen
privilegiert, also unter Verwendung erhhter Rechte, ausgefhrt wurden.
Privilegierter Account: Ein Benutzerkonto mit administrativen Berechtigungen oder das lokale
Systemkonto.
Protokollierung: Der Windows Installer schreibt Fehlermeldungen und zustzliche Informationen in
ein eigenes Protokoll und einzelne Teile davon in das Windows-Ereignisprotokoll.
R
Rollback: Die automatische Wiederherstellung des ursprnglichen Systemzustandes im Falle einer
fehlgeschlagenen Installation.
Restart Manager: Siehe Neustart-Manager
S
Strukturierte Speicherung (engl. structured storage): Die strukturierte Speicherung realisiert die
permanente Speicherung von COM-Objekten, wobei jedes Objekt ber einen privaten Bereich
innerhalb der Datei verfgt, in dem es seine Daten ablegen kann. Es gibt Storage- und Stream-Objekte,
die bei einer Projektion auf das Dateisystem mit Ordnern und Dateien verglichen werden knnen. Die
auf diese Weise zusammengesetzte Datei wird als Verbunddokument bezeichnet.
Systemzugriffssteuerungsliste (engl. System Access Control List) [Abk. SACL]: Diese
Systemzugriffssteuerungsliste ist erforderlich, um alle erfolgreichen oder gescheiterten
Zugriffsversuche auf eine Ressource in ein spezielles Ereignisprotokoll zu schreiben
T
Transaktion: Eine feste Folge von Operationen, die als logische Einheit betrachtet werden.
Transformation (MST-Datei): Eine Transformation ist ein Dokument, das die Differenz zweier
Installationsdatenbanken enthlt und im Rahmen der Erstinstallation auf ein Produkt angewendet
werden kann.
U
User Account Control [Abk. UAC]: Siehe Benutzerkontensteuerung
468
Glossar
Anhang A
V
Validierung: Die Validierung prft die Inhalte eines Windows Installer-Paketes auf interne Konsistent
und fehlerfreie Daten.
Verbunddokument (engl. compound document): Bezeichnung eines Dokumentes, in der
unterschiedliche Objekte unter Verwendung der strukturierten Speicherung persistiert werden.
Verwaltete Installationen (engl. Managed Installation): Verwaltete Anwendungen sind Installationen
die unter der Kontrolle des Systemadministrators durchgefhrt wurden, also alle
Maschineninstallationen (per-machine) und bestimmte Benutzerinstallationen (per-user managed).
W
W3C: Siehe World Wide Web Consortium
Wartungsmodus (engl. maintenance mode): Der Windows Installer wechselt in diesen Modus, falls
der Installationsprozess fr ein Produkt gestartet wird, das bereits auf dem System vorhanden ist. Im
Wartungsmodus kann dieses Produkt erneut installiert oder zustzliche Komponenten nachinstalliert
werden.
Windows Installer-XML [Abk. WiX]: Eine Sammlung von Tools und Spezifikationen, mit denen die
Inhalte eines Windows Installer-Paketes oder eines Mergemoduls durch XML-Dokumente (Extensible
Markup Language) definiert und anschlieend in die entsprechende Windows Installer-Datei berfhrt
werden knnen.
World Wide Web Consortium [Abk. W3C]: Eine 1994 von Tim Berners-Lee, einem der Initiatoren des
World Wide Web, zusammen mit dem europischen Kernforschungszentrum CERN und anderen
Institutionen gegrndete, nicht staatliche und nicht kommerzielle Organisation. Das W3C hat sich die
Aufgabe gesetzt, offene Standards zu entwickeln und zu publizieren, durch die ein allgemeiner
Informationsaustausch im Internet mglich wird.
Z
Zugriffssteuerlisten [Abk. ACL]: Verzeichnis der Zugriffsberechtigungen fr Dateien und Ressourcen.
469
Anhang B
Hier wird automatisch ein Inhaltsverzeichnis generiert, bitte nicht manuell bearbeiten!
Der Markt fr Tools und Anwendungen fr den Windows Installer ist mittlerweise riesengro, so dass
eine Orientierung nur sehr schwer mglich ist. Um ein bisschen Licht in das Dunkel zu bringen, habe
ich meine persnlichen Lieblingstools angefgt.
Windows Installer-XML
Eine Toolsammlung zum Erzeugen von Installationspaketen auf Basis von XML-Dateien. Weitere
Infos und Downloads unter http://wix.sourceforge.net/.
Windows Installer-SDK
Eine Zusammenfassung von Tools und Spezifikationen, die bei der professionellen Arbeit mit dem
Windows
Installer
unerlsslich
sind.
Das
SDK
steht
als
Download
unter
http://www.microsoft.com/downloads/details.aspx?familyid=e96f8abc-62c3-4cc3-93adbfc98e3ae4a3&displaylang=en zur Verfgung.
Orca
Hierbei handelt es sich um den Tabelleneditor fr Windows Installer-Dateien. Orca ist Bestandteil des
Windows Installer-SDK.
InstEd
Dieses ist ebenfalls ein Tabelleneditor wie Orca, allerdings mit einem wesentlich erweiterten
Funktionsvorrat. Weitere Infos sind unter http://www.instedit.com/ zu finden.
Anhang B
SharpDevelop
Hierbei handelt es sich um eine Entwicklungsumgebung zur Erzeugung von C#, VB.NET und Boo
Projekten fr die Microsoft .NET Plattform. Die Entwicklungsumgebung enthlt ebenfalls eine
Implementierung zur komfortablen Erzeugung von Windows Installer-XML-Projekten. Weitere Infos
sind unter http://www.icsharpcode.net/OpenSource/SD/ zu finden.
Bootstrapper Manifest-Generator
Hierbei handelt es sich um ein Tool, mit dem auf einfache Weise die Strukturen und Elemente zur
Erzeugung eines Bootstrapper erstellt und implementiert werden knnen. Der Generator steht unter
http://www.codeplex.com/bmg zum Download zur Verfgung.
IExpress
Dieses ist ein Tool zur Erzeugung von selbstextrahierenden Archiven und ist Bestandteil des
Windows-Betriebssystems.
MSI LogfileAnalyzer
Wie der Name bereits vermuten lsst, handelt es sich hierbei um eine coole Anwendung zur Analyse
von Windows Installer-Protokollen. Die Anwendung steht auf http://www.hoschi.biz/ zum Download
bereit.
471
Anhang B
472
Limitierungen
Anhang C
Limitierungen
Hier wird automatisch ein Inhaltsverzeichnis generiert, bitte nicht manuell bearbeiten!
Bei der Erstellung von Installationspaketen und den entsprechenden Kabinettdateien sind bestimmte
Limitierungen zu beachten, die nicht berschritten werden drfen. Die Limitierungen beziehen sich auf
den Windows Installer 2.0 und hher bei der Verwendung auf dem Betriebssystem Windows 2000 und
hher. Unter Bercksichtigung der Limitierungen mssen Installationspakete die folgenden Vorgaben
bercksichtigen.
Die Namen von Tabellen und Binr-Streams sind auf 32 Zeichen beschrnkt. Diese Vorgabe
resultiert aus der Limitierung von Streams in Verbunddokumenten. Hier sind die Namen auf 32
Zeichen (31 Zeichen plus Null-Terminator) beschrnkt. Windows Installer verwendet zwar einen
Komprimier-Algorithmus zum Speichern der Namen, so dass theoretisch 62 Zeichen verwendet
werden knnten. Aber durch die Verwendung des DBCS-Zeichenformates (Double Byte Character
Set) wird diese mgliche Anzahl wieder auf die Hlfte reduziert.
Ein Windows Installer-Paket kann maximal 32.767 Dateien aufnehmen. Dieses liegt darin
begrndet, dass bestimmte Datenfelder vom Typ i2, also Int16 sind und somit eine entsprechende
Obergrenze aufweisen. Es besteht jedoch die Mglichkeit, das Schema der Datenbank zu
verndern, so dass weitaus mehr Dateien verwendet werden knnen.
Die maximale Anzahl von Komponenten darf 65.536 pro Installationspaket nicht bersteigen.
Ein Feature darf ber maximal 15 untergeordnete Features verfgen. Wird diese Tiefe von 16
Features berschritten wird die Installation mit Fehler 2701 abgebrochen.
Die Eigenschaft ProductName darf nicht mehr als 63 Zeichen enthalten.
Einem Feature drfen maximal 1600 Komponenten zugeordnet werden. Diese Limitierung wird
mit ICE47 geprft.
Kabinettdateien sind die einzigen Archive, die vom Windows Installer verwendet werden knnen. Die
Kabinettdateien unterliegen ebenfalls Limitierungen, die sich auf die Spezifikation des Headers
zurckfhren lassen, wie dieses Listing C.98 zeigt.
struct CFHEADER
{
u1 signature[4];
u4 reserved1;
u4 cbCabinet;
u4 reserved2;
u4 coffFiles;
u4 reserved3;
u1 versionMinor;
u1 versionMajor;
u2 cFolders;
/*
/*
/*
/*
/*
/*
/*
/*
/*
473
Anhang C
u2
u2
u2
u2
u2
u1
u1
u1
u1
u1
u1
u1
cFiles;
flags;
setID;
iCabinet;
cbCFHeader;
cbCFFolder;
cbCFData;
abReserve[];
szCabinetPrev[];
szDiskPrev[];
szCabinetNext[];
szDiskNext[];
Limitierungen
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
};
Bei den verwendeten Datentypen u1, u2 und u4 handelt es sich um vorzeichenlose 8-, 16-, und 32-Bit
Integer-Werte, worin die folgenden Limitierungen begrndet sind:
Die Gre einer komprimierten Kabinettdatei darf maximal 2 Gigabyte betragen.
Die maximale Gre aller Dateien eines Ordners darf im nicht komprimierten Zustand maximal 2
Gigabyte betragen.
Die maximale Gre aller Dateien eines Ordners darf im komprimierten Zustand maximal 2
Gigabyte betragen.
Die maximale Anzahl von Dateien innerhalb einer Kabinettdatei darf 65.535 nicht bersteigen.
474
Anhang D
Hier wird automatisch ein Inhaltsverzeichnis generiert, bitte nicht manuell bearbeiten!
Bei der Aktualisierung von Dateien des Global Assembly Cache sind einige zustzliche Faktoren zu
bercksichtigen, die im Aktualisierungsprozess normaler Dateien in der Form nicht vorhanden sind.
Entscheidend ist hierbei die richtige Versionierung der Assemblies, was auf den ersten Blick nicht
unbedingt abweichend erscheint. Bei nherer Betrachtung ist jedoch auffllig, dass zur Versionierung
unterschiedliche Attribute zur Verfgung stehen und somit unterschiedliche Versionsnummern erzeugt
werden knnen. Das ist etwas verwirrend, insbesondere weil nur eine dieser drei Nummern von der
Common Language Runtime ausgewertet und letztlich fr das Auffinden und Laden verwendet wird.
Die anderen Versionsnummern haben eigentlich nur informativen Charakter, werden aber von
Installationsroutinen und dem Explorer verwendet.
Attribut AssemblyFileVersion: Wird auf die Win32-Ressource FileVersion abgebildet und richtet
sich nach dem bersetzungszeitpunkt eines individuellen Assemblies. Ein Assembly das im dritten
Major-Release eines Programms erstmals enthalten ist, hat hier die Nummer 1.0.x.x, auch wenn das
Programm selbst bereits Version 3.0 trgt. Wird das Assembly weiterentwickelt, wird diese Nummer
unabhngig von anderen Assemblies erhht. Die Common Language Runtime ignoriert die FileVersion
beim Laden von Assemblies. Installations- und Aktualisierungsroutinen verwenden hingegen die
FileVersion zur Prfung welche Dateien aktualisiert werden mssen.
Attribut AssemblyInformationalVersion: Wird auf die Win32-Ressource ProductVersion
abgebildet und richtet sich nach dem Zeitpunkt, an dem das gesamte Programm mit allen Assemblies
neu bersetzt und ausgeliefert wird. Sie wird also immer dann erhht, wenn eine neue CD-ROM oder
eine Installations-Routine fr den Internet-Download produziert wurde. Bei Teilaktualisierungen wird
die ProductVersion nicht verndert. Die Common Language Runtime ignoriert beim Laden von
Assemblies auch die ProductVersion.
Attribut AssemblyVersion: Die einzige Versionsnummer die von der Common Language Runtime
beim Laden von Assemblies zur eindeutigen Identifikation genutzt wird. Aber auch nur dann, wenn
starke Namen vergeben wurden. Jede referenzierende Assembly trgt den starken Namen der
referenzierten Assembly in die eigene AssemblyRef-Tabelle ein. Das bedeutet, das referenzierende
Assembly wird an exakt diese Version gebunden. Wird die Funktionalitt eines referenzierten
Assemblies gendert oder erweitert, muss deren AssemblyVersion erhht werden. Das hat zur Folge,
dass dieses Assembly von der Common Language Runtime zunchst als inkompatibel erachtet wird
und die Common Language Runtime liefert eine FileLoadException.
Versionsnummern werden ber Attribute im Quelltext spezifiziert, wie das folgende Beispiel zeigt.
using System.Reflection;
[assembly: AssemblyVersion("1.0.719.2")]
[assembly: AssemblyFileVersion("1.0.719.2")]
[assembly: AssemblyInformationalVersion("3.0.719.2")]
475
Anhang D
class Foo
{
Bei der AssemblyVersion knnen Build und Revision alternativ durch den Platzhalter * spezifiziert
werden (z.B. 1.0.* oder 1.0.719.*), wobei der Compiler dann passende Werte einsetzt. Die in Tabelle
D.95 dargestellten Berechnungen werden hierbei angewendet. Bei den anderen beiden Attributen wird
die automatische Vergabe durch den Compiler nicht untersttzt.
Nummer
Erluterung
Build
Revision
Es gilt jedoch zu beachten, dass gerade bei der AssemblyVersion das automatische Inkrementieren
durch den Compiler nicht empfehlenswert ist, denn hierdurch wrden permanent Versionskonflikte bei
Assemblies mit starken Namen auftreten. Im Installationsprozess hingegen, wrde die Beibehaltung
der AssemblyVersion dazu fhren, dass das Assembly nicht ersetzt wird, worauf auch durch
entsprechende Eintrge des Installationsprotokolls hingewiesen wird.
MSI (s) (10:A8) [17:52:59:465]: skipping installation of assembly component:
{02A3FAF9-6D59-4553-887E-A5E5719AFD6A} since the assembly already exists
Um zwei Versionen der gleichen Datei dennoch zu unterscheiden ist das Attribut AssemblyFileVersion
zu verwenden, das sich letztlich in der FileVersion niederschlgt und somit auch durch die StandardVersionierungsregel des Windows Installers ausgewertet wird. Die grundlegende Problematik ist
jedoch an dieser Stelle zu finden, denn die Versionierungsregel wird in der Form nur bei Assemblies
angewendet, die sich nicht im Global Assembly Cache befinden oder in diesen installiert werden
sollen. Bei der Installation und der Aktualisierung von Assemblies des Global Assembly Cache, wird
hingegen der starke Name ausgewertet, der Installations-seitig aus den Elementen der Tabelle
MsiAssemblyName konstruiert wird. Es ist somit erforderlich, die Eigenschaft FileVersion dieser
Tabelle anzufgen, damit sie ebenfalls bercksichtigt werden kann. Ein Beispiel hierfr zeigt Tabelle
D.96.
Component_
Name
Value
C__Gac
name
AssemblyPatchDemo
C__Gac
fileVersion
1.0.5000.0
C__Gac
version
1.0.5000.0
C__Gac
culture
neutral
C__Gac
processorArchitecture
MSIL
C__Gac
publicKeyToken
443DEF79785F24A9
Bei der Verwendung von Windows Installer-XML zur Erstellung von Installationspaketen ist dieses
ebenfalls zu beachten, denn standardmig fgt Windows Installer-XML die Eigenschaft FileVersion
476
Anhang D
der Tabelle MsiAssemblyName nicht hinzu. Allerdings ist dieses Standardverhalten relativ einfach
umzundern, so dass alle erforderlichen Informationen angefgt werden. Die nderung des Verhaltens
ist abhngig von der Vorgehensweise bei der Erzeugung des Paketes. Wird hierzu die Windows
Installer-XML Integration von Visual Studio oder die Microsoft Build Engine (msbuild.exe)
verwendet, muss die WIXPROJ-Datei angepasst werden. Hierzu ist der Parameter
<SetMsiAssemblyNameFileVersion/> dieser Projektdatei anzufgen, wie auch der nachfolgende
Dateiauszug zeigt.
<PropertyGroup>
<SetMsiAssemblyNameFileVersion>True</SetMsiAssemblyNameFileVersion>
</PropertyGroup>
Wird das Installationspaket hingegen auf direkte Art erstellt, so ist das Argument -fv dem Aufruf des
Linkers light.exe anzufgen.
477
Anhang E
Hier wird automatisch ein Inhaltsverzeichnis generiert, bitte nicht manuell bearbeiten!
Dieser Anhang enthlt eine Auflistung aller Tabellen, die im Datenbankschema der Windows InstallerVersion 4.5 vorhanden sind. Hierbei ist ebenfalls die korrespondierende Bezeichnung des Elementes
im WXS-Dokument angegeben, falls ein solches existiert. Bei der Betrachtung der Tabellennamen ist
auffllig, dass einige Namen mit dem Prfix Msi beginnen. Dieses ist darauf zurck zufhren, dass
Tabellen, die seit dem Windows Installer 2.0 dem Datenbankschema hinzugefgt wurden, mit diesem
Prfix versehen werden. Von der Verwendung dieses Prfix fr benutzerdefinierte Tabellen wird
abgeraten, da es einen Versto gegen existierende Design-Richtlinien darstellt.
Tabelle
WIX-Element
Beschreibung
ActionText
<ProgressText/>
AdminExecuteSequence
<AdminExecuteSequence/>
AdminUISequence
<AdminUISequence/>
AdvtExecuteSequence
<AdvertiseExecuteSequence/>
AdvtUISequence
AppId
<AppId/>
AppSearch
<AppSearch/>
478
Anhang E
Eigenschaften, die whrend der gleichnamigen
Aktion verwendet werden.
BBControl
<Billboard/>,
<Control/>
Billboard
<Billboard/>
Binary
<Binary/>
BindImage
<BindImage/>
CCPSearch
<CCPSearch/>
CheckBox
<Control/>
Class
<Class/>
ComboBox
<ComboBox/>,
<Control/>
CompLocator
<ComponentSearch/>
Complus
<Component/>
Component
<Component/>
Condition
<Condition/>
479
Anhang E
Control
<Control/>
ControlCondition
<Condition/>
ControlEvent
<Publish/>
CreateFolder
<CreateFolder/>
CustomAction
<CustomAction/>
Dialog
<Dialog/>
Directory
<Directory/>
DrLocator
<DirectorySearch/>
DuplicateFile
<CopyFile/>
Environment
<Environment/>
Error
<Error/>
EventMapping
<Subscribe/>
480
Anhang E
Extension
<Extension/>
Feature
<Feature/>
FeatureComponents
File
<File/>
FileSFPCatalog
<SFPFile/>
Font
<File/>
Icon
<Icon/>
IniFile
<IniFile/>
IniLocator
<IniFileSearch/>
InstallExecuteSequence
<InstallExecuteSequence/>
InstallUISequence
<InstallUISequence/>
IsolatedComponent
<IsolateComponent/>
481
Anhang E
LaunchCondition
<Condition/>
ListBox
<ListBox/>,
<ListItem/>
ListView
<ListView/>,
<ListItem/>
LockPermissions
<Permission/>
Media
<Media/>
MIME
<MIME/>
MoveFile
<CopyFile/>
MsiAssembly
<File/>
MsiAssemblyName
<File/>
MsiDigitalCertificate
<DigitalCertificate/>
482
Anhang E
MsiDigitalSignature
<DigitalSignature/>
MsiEmbeddedChainer
<EmbeddedChainer/>
MsiEmbeddedUI
<EmbeddedUI/>
MsiFileHash
MsiPackageCertificate
< PackageCertificates/>
MsiPatchCertificate
<PatchCertificates/>
MsiPatchHeaders
MsiPatchMetadata
MsiPatchOldAssemblyFile
MsiPatchOldAssemblyName
483
Anhang E
MsiPatchSequence
<PatchSequence/>
MsiSFCBypass
ODBCAttribute
<ODBCDriver/>,
<Property/>
ODBCDataSource
<ODBCDataSource/>
ODBCDriver
<ODBCDriver/>
ODBCSourceAttribute
<ODBCDataSource/>,
<Property/>
ODBCTranslator
<ODBCTranslator/>
Patch
Die Tabelle Patch enthlt eine Liste von BinrPatches, die auf die Tabellen angewendet wurden.
PatchPackage
ProgId
<ProgId/>
Property
<Property/>
PublishComponent
<Category/>
RadioButton
<RadioButton/>
484
Anhang E
Registry
<RegistryValue/>
RegLocator
<RegistrySearch/>
RemoveFile
<RemoveFile/>
RemoveIniFile
<IniFile/>
RemoveRegistry
<RemoveRegistryKey/>,
<RemoveRegistryValue/>
ReserveCost
<ReserveCost/>
SelfReg
<File/>
ServiceControl
<ServiceControl/>
ServiceInstall
<ServiceInstall/>
SFPCatalog
<SFPCatalog/>
Shortcut
<Shortcut/>
Signature
<FileSearch/>
TextStyle
<TextStyle/>
TypeLib
<TypeLib/>
485
Anhang E
UIText
<UIText/>
Upgrade
<Upgrade/>,
<UpgradeVersion/>
Verb
<Verb/>
_Columns
_Storages
_Streams
_Tables
_TransformView
_Validation
486
Systemrichtlinien
Anhang F
Systemrichtlinien
Computerkonfiguration
Benutzerkonfiguration
487
490
Das Verhalten des Windows Installers kann unter Windows 2000 und hher durch Systemrichtlinien
konfiguriert werden. Sie knnen diese Anweisungen ber den Gruppenrichtlinien-Editor definieren
oder die Einstellungen direkt in der Systemregistrierung vornehmen.
Computerkonfiguration
Mit Hilfe der Computerkonfiguration knnen Richtlinien fr den Computer festgelegt werden. Diese
Richtlinien werden in jedem Fall angewendet, unabhngig davon, welcher Benutzer sich letztlich an
dem betreffenden Computer anmeldet. Die Einstellungen werden unter dem Registrierungsschlssel
HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\Installer gespeichert.
Richtlinie
Beschreibung
AllowLockdownBrowse
(Durchsuchen fr Benutzer mit erhhten
Rechten aktivieren)
AllowLockdownMedia
(Verwendung von Medienquellen fr
Benutzer mit erhhten Rechten
aktivieren)
AllowLockdownPatch
(Patch-Verwendung fr Programme mit
erhhter Sicherheit zulassen)
AlwaysInstallElevated
(Immer mit erhhten Rechten
installieren)
487
Anhang F
Systemrichtlinien
mssen die Einstellung in beiden Ordnern aktivieren.
Debug
(Einstellung kann nur direkt in der
Systemregistrierung vorgenommen
werden)
DisableAutomaticApplicationShutdown
(Verwenden des Neustart-Managers nicht
zulassen)
DisableBrowse
(Dialogfeld Durchsuchen fr die Suche
nach einer neuen Quelle, entfernen)
DisableFlyWeightPatching
(Flyweight Patching nicht zulassen)
Wenn diese Richtlinieneinstellung aktiviert wird, werden alle PatchOptimierungsoptionen whrend der Installation deaktiviert.
DisableLoggingFromPackage
(Protokollierung ber Paketeinstellungen
deaktivieren)
DisableLUAPatching
(Installation von Updates, die durch den
Hersteller signiert wurden, fr
Nichtadministratoren nicht zulassen)
DisableMSI
(Windows Installer deaktivieren)
DisablePatch
(Patchverwendung nicht zulassen)
DisablePatchUninstall
(Entfernen von Updates nicht zulassen)
488
Systemrichtlinien
Anhang F
DisableRollback
(Zurcksetzen nicht zulassen)
DisableSharedComponent
(Deaktivieren von gemeinsam genutzten
Komponenten)
DisableUserInstalls
(Benutzerinstallationen nicht zulassen)
EnableAdminTSRemote
(Administrator erlauben, Installationen
von Terminaldienstesitzungen
auszufhren )
EnableUserControl
(Benutzersteuerung bei Installationen
zulassen)
EnforceUpgradeComponentRules
(Upgradekomponentenregeln erzwingen)
LimitSystemRestoreCheckpointing
(Erstellung von Prfpunkten zur
Systemwiederherstellung deaktivieren)
Logging
(Protokollierung)
MaxPatchCacheSize
(Maximalgre fr den Basisdateicache)
MsiDisableEmbeddedUI
(Anzeige der integrierten externen
Benutzeroberflche deaktivieren)
489
Anhang F
Systemrichtlinien
Hinweis: Verfgbar ab Windows Installer 4.5.
SafeForScripting
(Internet Explorer Sicherheitshinweis fr
Windows Installer Skripts deaktivieren)
TransformsSecure
(Transformationen an einem sicheren Ort
auf der Arbeitsstation zwischenspeichern)
Benutzerkonfiguration
Mithilfe der Benutzerkonfiguration knnen Richtlinien fr Benutzer festgelegt werden, die in jedem
Fall angewendet werden, unabhngig davon, an welchem Computer sich die betreffenden Benutzer
anmelden.
Die
Richtlinien
werden
unter
dem
Registrierungsschlssel
HKEY_CURRENT_USER\Software\Policies\Microsoft\Windows\Installer abgelegt.
Richtlinie
Auswirkungen
AlwaysInstallElevated
(Immer mit erhhten Rechten installieren)
DisableMedia
(Wechselmedienquellen fr andere
Installationen verhindern)
DisableRollback
(Zurcksetzen nicht zulassen)
SearchOrder
(Suchreihenfolge)
490
Systemrichtlinien
Anhang F
wenn Sie die Suchreihenfolge ndern mchten:
n steht fr Netzwerk;
m steht fr Wechselmedien
u steht fr URL oder das Internet.
TransformsAtSource
(Transformationen vom
Stammverzeichnis anwenden)
491
Anhang G
Automatische Reparatur
Halbautomatische Vorgehensweise
492
493
Beim Microsoft Active Setup handelt es sich um keine direkte Implementierung oder Funktionalitt des
Windows Installers, sondern um eine Grundfunktionalitt des Betriebssystems die hervorragend in
Kombination mit dem Windows Installer verwendet werden kann. Dieses betrifft vornehmlich
Szenarien, in denen Anwendungsteile im Benutzerprofil abgelegt werden, die mitunter eine Reparatur
veranlassen um die Funktionsfhigkeit der Anwendung herzustellen.
Automatische Reparatur
Beim Starten einer Anwendung ber einen der drei mglichen Aktivierungspunkte des Windows
Installers, also ber die Advertised-Shortcuts, die Datei-Erweiterungen oder bei der Referenzierung
ber COM, findet eine berprfung der Schlsselressourcen statt. Die Aktivierungspunkte
referenzieren immer ein Feature, wodurch bei allen Komponenten, die mit diesem Feature verknpft
sind, die Existenz der Schlsselressource geprft wird. Bei der Schlsselressource handelt es sich um
den Bestandteil der Komponenten, die in der Spalte KeyPath der Tabelle Component referenziert
wurde. Ist eine solche Schlsselressource nicht vorhanden, wird die automatische Reparatur fr das
jeweilige Feature gestartet und die fehlende Ressource wird nachinstalliert. Ein gravierendes Problem
betrifft hierbei die Dateien, die sich im Benutzerprofil befinden. Benutzer A installiert die
Anwendung, wodurch Datei X in seinem Benutzerprofil abgelegt wird. Wird diese Datei nun als
Schlsselressource fr die Komponente definiert, wird der absolute Pfad zu dieser Datei in den
Windows Installer-Konfigurationsdaten abgelegt. Nun meldet sich Benutzer B am System an und
startet die Anwendung. Der Windows Installer prft die Existenz der Schlsselressourcen, also auch
die von Datei X, wobei er feststellt, dass sie existiert. Allerdings kann Benutzer B nicht
zwangslufig darauf zugreifen und sie verwenden, da sie im Benutzerprofil von A abgelegt ist und
die Privilegien fr den Zugriff nicht immer ausreichen. Relevant ist hierbei, dass die Datei physisch
immer vorhanden ist, unabhngig davon, welcher Benutzer angemeldet ist.
Die Problematik ist offensichtlich und es ist daher zwingend notwendig, dass bei einer Komponente,
die Dateien im Benutzerprofil ablegt, die Schlsselressource ein Eintrag in der Systemregistrierung
unter HKEY_CURRENT_USER sein muss. Bei der Verwendung eines solchen Eintrages kommt es
nicht zu diesem Problem. Denn der Schlsseleintrag wird in dem benutzerspezifischen Teil der
Systemregistrierung (ntuser.dat) von Benutzer A abgelegt. Meldet sich Benutzer B jedoch am
System an, wird nicht die ntuser.dat von Benutzer A geladen, sondern die von Benutzer B. Hier
492
Anhang G
ist aber der Schlsseleintrag nicht vorhanden, so dass Windows Installer die Komponente automatisch
nach installiert.
Hinweis Beginn
Da diese Vorgehensweise wirklich wichtig ist, wird sie auch durch die Validierungsart ICE38 geprft
Hinweis Ende
Halbautomatische Vorgehensweise
Der relevante Punkt in dem zuvor skizzierten Szenario sind die Aktivierungspunkte, da durch diese die
automatische Reparatur veranlasst wird. Problematisch ist hierbei, dass nicht immer
Aktivierungspunkte vorhanden sind oder tatschlich verwendet werden. Unter diesem Kontext kann
hervorragend ein Add-In fr Microsoft Outlook betrachtet werden. Ein solches Add-In bentigt in der
Regel Benutzer- und Maschinendaten. Bei der Installation werden beide Datenkategorien auf dem
System abgelegt, wobei die Benutzerdaten zwangslufig nur fr den aktuellen Benutzer geschrieben
werden. Meldet sich ein anderer Benutzer am System an, fehlen diese Benutzerdaten, so dass das AddIn nicht fehlerfrei ausgefhrt werden kann. Die Problematik liegt nun darin, dass ein solches Add-In
nicht ber Aktivierungspunkte gestartet, sondern durch Outlook geladen wird und somit der Windows
Installer nicht angewiesen wird, die fehlenden Elemente zu erstellen.
An dieser Stelle kommt nun das Microsoft Active Setup ins Spiel, denn hiermit ist es mglich,
Benutzerinformationen bereitzustellen, ohne dass Aktivierungspunkte im Installationspaket existieren.
Die Implementierung ist relativ einfach. Beim Anmelden eines Benutzers werden durch das
Betriebssystem die folgenden Eintragungen der Systemregistrierung berprft:
HKEY_LOCAL_MACHINE\Software\Microsoft\Active Setup\Installed Components\<ID>
HKEY_CURRENT_USER\Software\Microsoft\Active Setup\Installed Components\<ID>
Mit ID ist ein eindeutiges Identifizierungsmerkmal gemeint, dass diesen Eintrag definiert. In der Regel
wird hierfr eine GUID verwendet. Dem Eintrag sind noch einige Werte anzufgen, so dass sich
folgendes Bild ergibt:
[HKLM\SOFTWARE\Microsoft\Active Setup\Installed Components\{44CCA842-CC51-11CF-AAFA-00AA00B6015B}]
"Version"="1"
"StubPath"="Msiexec.exe /fpu {44CCA842-CC51-11CF-AAFA-00AA00B6015B}"
Relevant ist hierbei der Eintrag unter StubPath. Durch den Parameter fpu wird eine Reparatur aller
benutzerspezifischen Eintrge der Systemregistrierung durchgefhrt und es werden fehlende Dateien
wieder hergestellt. Beim Anmelden eines Benutzers an das Betriebssystem wird zunchst der Eintrag
unter HKEY_LOCAL_MACHINE ausgewertet. Hier wird nun geprft, ob ein identischer Eintrag auch
unter HKEY_CURRENT_USER existiert. Ist dieses nicht der Fall, wird die Befehlszeile aus StubPath
des Maschineneintrages ausgefhrt und der komplette Eintrag aus der Systemregistrierung nach
HKEY_CURRENT_USER kopiert. Ist der Eintrag unter HKEY_CURRENT_USER hingegen vorhanden
wird keine Aktivitt gestartet. Diese Aktivitten werden automatisch vom Betriebssystem veranlasst,
so dass keinerlei zustzliche Implementierungen erforderlich werden.
Hinweis Beginn
Die Funktionalitt ist nicht auf den Windows Installer beschrnkt. Unter dem Registrierungseintrag
493
Anhang G
494
Anhang H
Zustzliche Informationen zu den Beispielen und Voraussetzungen zur Nutzung sind im Abschnitt
Beispieldateien zu finden.
Hinweis Ende
In der folgenden Tabelle werden die Beispiele mit einer entsprechenden Kurzbeschreibung, sowie der
Angabe des Speicherorts aufgelistet.
Ordner
Beschreibung
\Kapitel 01 - Installer
\01 SubStorage
\Kapitel 02 - WIX
\01 WixLanguage
Verwenden von Sprach- und Includedateien mit Windows InstallerXML und Visual Studio.
\02 WixFragment
495
Anhang H
\04 WixCustomExtension
\Kapitel 04 - DTF
\01 Allgemein
\02 Immediate
\03 Deferred
\Kapitel 05 - UAC
\01 CheckToken
\04 PrivilegedCA
\Kapitel 06 - Restartmanager
\01 GUI
496
Anhang H
\02 Console
\04 RestartCustomAction
\Kapitel 07 - Troubleshooting
\01 WRP
\02 Logging
\03 MUI
\Kapitel 08 - Multi-Package-Transaction
\01 Bootstrapper
\02 Chainer
\Kapitel 09 - Embedded UI
\01 Simple
\02 Complex
\Kapitel 10 - Patches
\01 Upgrade
\03 Superseded
497
Stichwortverzeichnis Stichwortverzeichnis
Stichwortverzeichnis
.cub 107
.ddf 443
.ipi 362
.msi 101
.msm 101
.msp 101, 112, 427
.mst 101
.pcp 101, 112, 436
.sed 423
.sln 82
.wixlib 96
.wixmsp 96
.wixmst 96
.wixobj 95
.wixout 96
.wixpdb 96
.wixproj 82
.wxi 84, 95
.wxl 88, 95
.wxs 95
64-Bit-Architektur 132
AMD64 133
Benutzerdefinierte
Aktionen 144
Dateisystem 137
Fehlernummern 147
IA64 133
ICE80 148
Integrierte
Benutzeroberflche 404
Intel64 133
Kennzeichnungen 135
Mergemodule 133
ODBC Driver Manager 147
Registry Redirection 138
Registry Reflection 139,
142
Summary Information
Stream 133
Systemregistrierung 138
VersionNT64 143
Virtualisierung 199
498
WOW64-Subsystem 136,
147
x64 133
x86 133
A
Abschieen 253
Access Control Entry Siehe
Zugriffssteuerungseintrag
Accessibility options Siehe
Benutzeroberflche
ACE Siehe
Zugriffssteuerungseintrag
ACID 338
ACL Siehe Zugriffssteuerlisten
Acquisition-Phase Siehe
Installationsphasen
ActionState Siehe
Aktionsstatus
Active Directory 204
Add-In 493
Admin Approval Mode Siehe
Sicherheit
Administrative Installation
Siehe Installationsarten
Advertised Shortcuts Siehe
Dateiverknpfungen
Advertising 466
Aktionen
ADMIN 44, 46
ADVERTISE 44, 46
AppSearch 46
CostFinalize 45, 46
CostInitialize 45, 46
DisableRollback 351, 359
DoAction 65
ExecuteAction 46
FileCost 45, 46
FindRelatedProducts 425
ForceReboot 50, 246, 364
INSTALL 44, 46
InstallExecute 50
InstallExecuteAgain 50
InstallFiles 49
InstallFinalize 48, 50, 64,
65, 170, 353
InstallInitialize 47, 50, 64,
170
InstallValidate 47, 247, 252,
279, 302, 321
LaunchCondition 46
MigrateFeatureStates 425
RemoveExistingProducts
48, 425
ScheduleReboot 50, 247,
364
StartServices 280
StopServices 280
WriteRegistryValues 49
Aktionsstatus Siehe
Installationsprozess
Aktivierungspunkte 492, Siehe
Windows Installer-Paket
Aktualisierungsprozess 475
Aktualisierungsarten 419
Dateien 56
Komplexe Aktualisierungen
424
Kopieren und Entfernen von
Dateien 56
Metadaten 53
Minimale Aktualisierungen
420
Modifikation des
Zielsystems 125
Patchen von Dateien 56
Recache-Flag 421
Selbstextrahierende Archive
423
Skriptdateien 52
Softwareaktualisierungen
416
Stichwortverzeichnis
Systemregistrierung 55
Anforderungsstatus Siehe
Installationsprozess
Angekndigte Installation
Siehe Installationsarten
Anwenderprivilegien 41
Anwendungsreihenfolge 43
Anwendungsstrategie 9, 323
Application Information
Service Siehe Sicherheit
asInvoker 189
Atomaritt 338
Atomicity Siehe Atomaritt
Attribute
ApplicationFile 329
AssemblyDefaultWixExtensi
on() 120
AssemblyFileVersion 475
AssemblyInformationalVersi
on 475
AssemblyVersion 475
CustomActionAttribute
163, 169
FileVersion 475
INSTALLMESSAGE_
INSTALLEND 386
INSTALLMESSAGE_ACTIOND
ATA 383
INSTALLMESSAGE_ACTIONS
TART 383
INSTALLMESSAGE_COMMO
NDATA 386
INSTALLMESSAGE_FILESINU
SE 384
INSTALLMESSAGE_INITIALIZ
E 382
INSTALLMESSAGE_INSTALLS
TART 385
INSTALLMESSAGE_PROGRE
SS 388
INSTALLMESSAGE_RESOLVE
SOURCE 382
INSTALLMESSAGE_RMFILESI
NUSE 384
INSTALLMESSAGE_SHOWDI
ALOG 382
INSTALLMESSAGE_TERMIN
ATE 382
InstallPrivileges 214
INSTALLUILEVEL_BASIC 373
INSTALLUILEVEL_NONE 374
msidbComponentAttributes
64bit 140, 146
msidbComponentAttributes
DisableRegistryReflection
142, 177
msidbComponentAttributes
Shared 461
msidbComponentAttributes
UninstallOnSupersedenc
e 455
msidbControlAttributesElev
ationShield 234
msidbCustomActionType64
BitScript 146
msidbCustomActionTypeCo
mmit 68
msidbCustomActionTypeEx
e 58
msidbCustomActionTypeHid
eTarget 171
msidbCustomActionTypeInS
cript 58, 65, 232
msidbCustomActionTypeNo
Impersonate 57, 206,
213
msidbCustomActionTypePat
chUninstall 322, 464
msidbCustomActionTypeRol
lback 67
msidbEmbeddedHandlesBas
ic 406
msidbEmbeddedUI 394
msidbFileAttributesCompre
ssed 26
msidbFileAttributesNoncom
pressed 26
msidbFileAttributesVital
380
msidbLocatorType64bit
143, 147
msidbPatchSequenceSupers
edeEarlier 447
MSITRANSACTION_CHAIN_
EMBEDDEDUI 346, 349,
410
MSITRANSACTION_JOIN_EX
ISTING_EMBEDDEDUI
349, 411
MSITRANSACTIONSTATE_C
OMMIT 347
MSITRANSACTIONSTATE_R
OLLBACK 347, 353
ProductVersion 475
UninstallWhenSuperseded
456
Aufgabenplanung 250
Automatische Reparatur 492
Automatisierungsmodell 63
B
Basisinstallation Siehe
Installationsarten
Benutzerdefinierte Aktion 466
Benutzerdefinierte Aktionen
58, 144, 161, 230, 282, 462
Architektur 59
Bedingungen 70
Commit-Ausfhrung 68
Custom Action-Server 42,
58, 144, 231, 404
CustomActionAttribute 169
CustomActionData 66, 171
Debuggen 168
Deinstallation 70
Elevated 58, 231
Erstellung 163
Host-Prozess 144
Impersoniert 58, 231
Installationssession 65
Inverse Platform Invocation
Service 162
jscript.dll 63
Kompiliervorgang 167
Komplexe
Erweiterungsbibliotheke
n 122
Konfigurationsdatei 164
Objektbibliothek 62
Patch Uninstall Custom
Action 463
Projektvorlagen 166
Proxy 167
Remote-API 63
Rollback Ausfhrung 173
Rollback-Ausfhrung 67
499
Stichwortverzeichnis
Rckgabewerte 68
scrrun.dll 63
Sofortige Ausfhrung 64
Systemvoraussetzungen
163
vbscript.dll 63
Verzgerte Ausfhrung 65,
171
Benutzerkonfiguration Siehe
Systemrichtlinien
Benutzerkontensteuerung
179, 466
Ausfhrungsprivilegien 188
Besttigungsdialog 193,
205
ICE57 213
Installation 208
Installer-Erkennung 211
Interaktion 208
Kennzeichnung 191, 233
Paketbergreifende
Transaktionen 366
Patch 216
Problemquellen 238
Prompt for Consent 193
Prompt for Credentials 194
Richtlinien 241
Schild 233
Standardbenutzerinstallatio
nen 212
Standardbenutzerrechte
190
Virtualisierung 197
VirtualStore 197, 198
Zertifikat 210
Benutzeroberflche 34
Anwendungsszenarien 411
Basisdarstellung 277
Darstellung 381, 402
Darstellungsformen 34
Debuggen 403
Eingabehilfen 370
Externe Benutzeroberflche
371
FilesInUse 247, 252
Fortschrittsanzeige 388
Gestaltung 369
HyperLink-Steuerelement
370
500
Integrierte externe
Benutzeroberflche 392
Interne Ablufe 405
Interne Benutzeroberflche
375
MsiRMFilesInUse 247, 274
Nachrichten-Handler 373
Paketbergreifende
Transaktionen 409
Unbeaufsichtigter Modus
34
Windows Installer-Patches
407
Windows InstallerTransformationen 407
BinariesRoot 83
Binr-Patch Siehe Patch
Bootstrapper 211, 290, 327,
466
Bootstrapper ManifestGenerator 333
Einschrnkungen 333
Visual Studio 2008 332
Bootstrapper ManifestGenerator 471
Build-Systeme 82
Byte-Level-Patch Siehe BinrPatch
C
Chainer 333, 466
Abhngigkeiten 337
Benutzeroberflche 337
Beziehungen 337
Definition 333
Eingebetteter Chainer 353
Funktionalitt 334
Individualitt 335
Interaktion 337
Mehrere Chainer 361
Clientinstallation Siehe
Installationsarten
Client-Prozess Siehe
Installationsprozess
Codepage 23
Commit 339
Commit-Ausfhrung Siehe
Benutzerdefinierte
Aktionen
Commit-Phase 361, Siehe
Installationsphasen
Common Language Runtime
475
Common Public License 72
Compound Document Siehe
Windows Installer-Paket
Computerkonfiguration Siehe
Systemrichtlinien
Computerneustart Siehe
Neustart-Manager
config.msi 56
Consistency Siehe Konsistenz
Cost-Linking 48
Credential Provider 257
Custom Action-Server Siehe
Benutzerdefinierte
Aktionen
D
DACL Siehe Freigegebene
Zugriffssteuerungsliste
Dateinamenerweiterungen
Siehe Windows InstallerPaket
Dateiverknpfungen 29
Angekndigte
Verknpfungen 235
DISABLEADVTSHORTCUTS
235
Lokalisierte
Dateiverknpfungen 310
Manifest 236
Shortcut 315
Sicherheitsschildsymbol
236
Datenbank
Codepage 23
KeyPath 420
Schema 478
Storage-Objekt 23
Stream-Objekte 23
Stringpool 23
Tabellenformat 23
Datenbanktabellen 478
_Property 44
_Streams 157
Stichwortverzeichnis
_StringData 23
_StringPool 23
ActionText 383
AdminExecuteSequence 46,
445
AdminUISequence 44
AdvtExecuteSequence 46
AdvtUISequence 44
AppSearch 147
Binary 355
Codepage 23
Component 146, 177, 322,
492
Components 456, 462
Control 120, 234
CustomAction 62, 163, 170,
232, 287, 322, 355, 463
Dialog 120
Directory 45, 73
DuplicateFile 48
Features 420
File 282, 355, 444
Group 128
ImageFamilies 429
IniFile 48
InstallExecuteSequence 46,
60, 170, 229, 426, 445
InstallUISequence 44
LaunchCondition 229, 260,
325, 342
LockPermissions 56, 128
Media 156, 444
MoveFile 48
MsiDigitalCertificate 218
MsiDigitalSignature 218
MsiEmbeddedChainer 322,
353, 355
MsiEmbeddedUI 322, 393
MsiPackageCertificate 322,
366
MsiPatchCertificate 218,
367
MsiPatchMetadata 431
MsiPatchSequence 430
Patch 430, 445
PatchMetadata 447
PatchPackage 444
PatchSequence 447
Properties 443
E
ECMA 467
EEUI Siehe Embedded
External UI
Eigenschaften
ACTION 34
AdminProperties 44
AdminToolsFolder 225, 226
AdminUser 227
ADVERTISE 44
AFTERREBOOT 247
AllowRemoval 431, 458
ALLUSERS 207, 224
AMD64 133
AppDataFolder 225, 226
ARPNOREPAIR 37
ARPSYSTEMCOMPONENT
352
Build Action 167
Classification 431
CommonAppDataFolder
225, 226
CommonFiles64Folder 140
CommonFilesFolder 141,
225, 226
Copy Local 167
CostingComplete 48
CreationTimeUTC 431
CustomActionData 66
Description 431
DesktopFolder 225, 226
DISABLEADVTSHORTCUTS
235
DisableRollback 68
DISABLEROLLBACK 52, 57,
342, 351, 359
DisplayName 431
EnableUserControl 44
FavoritesFolder 225, 226
FontsFolder 225, 226
IncludeWholeFilesOnly 430,
443
Installed 37, 421
Intel 133, 143
Intel64 133, 143
IsAdminPackage 34
KeyPath 29
LocalAppDataFolder 212,
226
ManufacturerName 431
MinimumRequiredMsiVersi
on 447
MinorUpdateTargetRTM
431
MoreInfoURL 431
MsiAMD64 143
MSIARPSETTINGSIDENTIFIE
R 177
MSIDISABLEEEUI 322, 405
501
Stichwortverzeichnis
MSIDISABLELUAPATCHING
220
MSIDISABLERMRESTART
177, 247, 278
MSIENFORCEUPGRADECOM
PONENTRULES 421
MsiLogFileLocation 177,
299
MsiLogging 177, 298, 488
MsiNetAssemblySupport
125
MsiPatchRemovalList 463
MSIPATCHREMOVE 464
MSIRESTARTMANAGERCON
TROL 177, 247, 273
MsiRestartManagerSession
Key 177, 279
MsiRestartManangerSessio
nKey 283
MSIRMSHUTDOWN 177,
247, 278
MsiRunningElevated 177,
229
MsiSystemRebootPending
177, 247, 260
MSIUNINSTALLSUPERSEDED
COMPONENTS 322, 456
MSIUSEREALADMINDETECTI
ON 177, 229
Msix64 143
MyPicturesFolder 226, 227
OptimizeCA 431
OptimizedInstallMode 431
PackageCode 78, 421
ParentOriginalDatabase
324
ParentProductCode 324
PatchOutputPath 439
PersonalFolder 225, 226
PID_CHARCOUNT 429
PID_LASTAUTHOR 429
PID_PAGECOUNT 140, 146
PID_REVNUMBER 429
PID_TEMPLATE 133, 146,
429
PID_WORDCOUNT 25, 155,
177, 213, 431
Privileged 227
PrivilegedPatchingAuthorize
502
d 220
ProcessorArchitecture 136
ProductCode 46, 78, 161
ProductName 78
ProductVersion 419
ProgramFiles64Folder 141
ProgramFilesFolder 141,
225, 226
ProgramMenuFolder 225,
226
PROMPTROLLBACKCOST
351, 359
REBOOT 52, 247
REBOOTPROMPT 247
REINSTALL 36, 422
REINSTALLMODE 36, 421,
456
REMOVE 37
ReplacedInUseFiles 247,
254, 260
RollbackDisabled 342, 359
SecureCustomProperties
40, 44, 302
SendToFolder 225, 226
StartMenuFolder 225, 226
StartUpFolder 225, 226
System64Folder 141
SystemFolder 141, 226
TargetProductName 432
TemplateFolder 225, 226
TRANSFORMS 43
TrustMsi 443
UILevel 209
Upgradecode 161
VersionNT 143
VersionNT64 143, 147
WindowsFolder 226
x64 133
Eingeschrnkter Token Siehe
Gefilterter Token
Elevated Installation Siehe
Privilegierte Installation
EM64T Siehe Intel64
Embedded External UI Siehe
Benutzeroberflche
-Embedding 145
Ereignisprotokoll 467
Erweiterungsbibliotheken
Siehe Windows Installer-
XML
Execution Engine Siehe
Ausfhrungsmodul
Execution-Phase Siehe
Installationsphasen
Extended Memory 64
Technology Siehe EM64T
Extension Siehe
Erweiterungsbibliotheken
F
Features Siehe Windows
Installer-Paket
FIFO 341, 348
ForceReboot Siehe Aktionen
Fragment Siehe Windows
Installer-XML
Freigegebene
Zugriffssteuerungsliste 181
Full-File-Patch Siehe Patch
Funktionen
AdvertiseProduct() 178
AdvertiseScript() 178
CoCreateInstance() 63
Commit() 351
ConfigureProduct() 161
CreateAdvertiseScript() 178
CreatePatchFileEx() 443
CreateProcessAsUser() 61,
183
CreateRestrictedToken()
187
DetermineApplicablePatche
s() 434
DLLRegisterServer() 245
EmbeddedUIHandler() 322
EnableLog() 153, 298
ExitWindowsEx() 271
ExternalUIHandler() 372
ExternalUIRecordHandler()
372
ExtractFiles() 157
GetApplicationRestartSettin
gs() 271
GetInteger() 383
GetMode() 173
GetPatches() 454
GetPatchFileList() 291
Stichwortverzeichnis
GetProcAdresss() 63
GetRelatedProducts() 161
GetStream() 157
GetString() 383
GetTargetProductCodes()
449
GetTokenInformation()
196, 200
GetTransforms() 449
GetTransformsInfo() 449
GetValidTransforms() 449
Initialize() 398
InitializeEmbeddedUI() 322,
398
InitiateShutdown() 271
InstallProduct() 152, 249
IsWow64Process() 137
Join() 351
MoveFileEx() 255, 363
MsiAdvertiseProduct() 38,
350
MsiAdvertiseProductEx()
39, 350
MsiAdvertiseScript() 206
MsiApplyMultiplePatches()
337, 350
MsiApplyPatch() 337, 350
MsiBeginTransaction() 321,
344, 346
MsiConfigureFeature() 350
MsiConfigureProduct() 37,
350
MsiConfigureProductEx()
37, 337, 350
MsiDatabaseGenerateTrans
form() 443
MsiDetermineApplicablePat
ches() 434
MsiDeterminePatchSequen
ce() 434
MsiDoAction() 65
MsiEnableLog() 298
MsiEndTransaction() 321,
345, 347
MsiFormatRecord() 66
MsiGetLanguage() 66
MsiGetMode() 66
MsiGetPatchFileList() 177,
291
MsiGetProperty() 66
MsiInstallMissingComponen
t() 350
MsiInstallMissingFile() 350
MsiInstallProduct() 35, 37,
248, 337, 350
MsiJoinTransaction() 321,
348
MsiProcessMessage() 66,
383
MsiProvideAssembly() 350
MsiProvideComponent()
350
MsiProvideQualifiedCompo
nent() 350
MsiProvideQualifiedCompo
nentEx() 350
MsiQueryProductState()
332
MsiReinstallFeature() 350,
423
MsiReinstallProduct() 36,
350, 423
MsiRemovePatches() 350
MsiSetExternalUI() 337,
371
MsiSetExternalUIRecord()
337, 371
MsiSetInternalUI() 35, 337
MsiSetMode() 245
NtQueryInformationFile()
263
OpenPackage() 157
OpenProduct() 157
OutputDebugString() 488
ProcessMessage() 402
ProvideAssembly() 178
RegisterApplicationRestart()
270
ReinstallFeature() 423
ReinstallProduct() 423
RemovePatches() 460
RmAddFilter() 263
RmCancelCurrentTask() 263
RmEndSession() 263
RMEndSession() 283
RmGetFilterList() 263
RmGetList() 263
RmJoinSession() 263
RMJoinSession() 283
RmRegisterResources()
263, 283
RmRemoveFilter() 263
RmRestart() 263
RmShutdown() 263
RmStartSession() 264
Rollback() 352
SetConsoleCtrlHandler()
272
SetExternalUI() 377
SetInternalUI() 152, 377
SfcGetFiles() 296
SfcGetNextProtectedFile()
296
SfcIsFileProtected() 296
SfcIsKeyProtected() 297
Shutdown() 401
ShutdownEmbeddedUI()
322, 401
UiCreatePatchPackage()
438
UiCreatePatchPackageEx()
438
Unpack() 156
UnregisterApplicationRestar
t() 271
WinVerifyTrust() 218
G
Gefilterter Token Siehe
Zugriffstoken
Gemeinsame Komponenten
460
Gesperrte Umgebungen 17
GINA 257
Global Assembly Cache 137,
475
GUID 78, 467
H
Hierarchische Strukturen 73
highestAvailable 189
I
Identittswechsel 41, 202
503
Stichwortverzeichnis
IExpress 471
Immediate Execution Siehe
Benutzerdefinierte
Aktionen
Includedateien Siehe
Windows Installer-XML
Installation bei Bedarf 17
Installationsarten 32
Administrative Installation
37, 466
Angekndigte Installation
38
Automatische Reparatur
492
Basisinstallation 34, 466
Basisinstallationen 417
Clientinstallation 33, 466
Deinstallation 37
Erstinstallation 467
Maintenance Installation
35
Post-Admin-Install 34
Reparaturoptionen 35
ScriptType 53
Wartungsinstallation 421
Installationslogik 16
Installationspaket Siehe
Windows Installer-Paket
Installationsphasen 39
Acquisition-Phase 39, 340
Commit-Phase 341
Execution-Phase 41, 340
Rollback-Phase 341
Installationsprozess 41
Aktionsstatus 47
Anforderungsstatus 47
Ausfhrungsmodul 39, 51
Berechnung des
Speicherbedarfs 46
Client-Prozess 42, 301
Computerneustart 52, 245
Cost-Linking 48
DirectoryManager 47
Execution-Phase 51
Initialisierungsphase 43
Installationsmodul 46
Installationsskript 49
Installationsstatus 47
IPI-Datei 49
504
Konfigurationsmanager 41,
46
Modifikation des
Zielsystems 51
msiexec.exe 41
Operationsanweisung 49
Rollback-Skript 52, 67
SelectionManager 47
Sequenztabellen 44
Server-Prozess 46, 301
Skriptdateien 52
Systemvoraussetzungen 46
Terminierung 52
Top-Level-Aktionen 44
Unbeaufsichtigte
Installation 46
Wiederherstellungspunkt
49
Windows Installer-Service
16
Installationsstatus Siehe
Installationsprozess
Installationsttigkeiten 16
InstallExecute Siehe Aktionen
InstallExecuteAgain Siehe
Aktionen
InstallState Siehe
Installationsstatus
InstEd 470
Intel Architecture 64-Bit Siehe
IA64
IntelliSense Siehe Windows
Installer-XML
Internal Consistency
Evaluators (ICE) Siehe
Validierung
Inventarisierung 158, 453
IPI-Datei Siehe
Installationsprozess
Isolation 338, 351
Itanium Siehe IA64
K
Kabinettdateien Siehe
Windows Installer-Paket
Komplexe Aktualisierungen
424
Komponenten Siehe Windows
Installer-Paket
Konfigurationsdatei 97
Konkurrierende Installationen
323
Aktualisierung 324
Deinstallation 324
Installationsfortschritt 324
Problematik 324
Konsistenz 338
L
Language INtegrated Query
150
Least User Access Siehe
Benutzerkontensteuerung
Least-privileged User Account
Siehe
Benutzerkontensteuerung
LIFO 341, 348
Limited User Account Siehe
Benutzerkontensteuerung
Limitierungen 473
LINQ Siehe Language
INtegrated Query
Logo Testing Tools for
Windows 471
Lokalisierte
Benutzeroberflche Siehe
Mehrsprachige
Benutzeroberflchen
Lokalisierte Installationspakete
Siehe Windows InstallerXML
LUA Siehe
Benutzerkontensteuerung
LUA-Patches Siehe Patch
M
Maintenance Installation
Siehe Installationsarten
Major-Upgrade 419, 424
Managed Installation Siehe
Verwaltete Installationen
Managed Kontext 467
Managed Libraries for
Windows Installer Siehe
Deployment Tools
Stichwortverzeichnis
Foundation
Mehrsprachige
Benutzeroberflchen 307
Checksumme 314
Installationspaket 314
Lokalisierte
Dateiverknpfungen 310
Mehrsprachige Anwendung
308
Resource Configuration
Data 312
Ressource-Bibliotheken
309, 310
Ressourcenskript 311
Mergemodul 467
Mergemodule 325, 467
Problematik 326
Microsoft Active Setup 492
Microsoft Build Engine 76, 82,
83, 328, 477
Microsoft Cabinet Software
Development Kit 471
Microsoft Intermediate
Language 136
Microsoft Outlook 493
Microsoft Silverlight 368
Mikro-Pakete 323
Minimale Aktualisierungen
420
Minor-Upgrade 419
MMsiBreak 169
MSBuildBinPath 83
MSBuildExtensionsPath 83
MSI LogfileAnalyzer 471
MsiBreak 168, 404
msiexec.exe 61, 145, Siehe
Installationsprozess
MSIL Siehe Microsoft
Intermediate Language
MUI Siehe Mehrsprachige
Benutzeroberflchen
Multi-Lingual User Interface
Siehe Mehrsprachige
Benutzeroberflchen
Multi-Package-Transaktion
Siehe Transaktionen
Mutex 46
N
Nested Installations Siehe
Konkurrierende
Installationen
Neustart-Manager 467
Benutzerdefinierte
Aktionen 282
Darstellungsmodus 277
Dateien in Verwendung
251
Dienststeuerungs-Manager
272
Funktionsweise 260
Installationsprozess 245
Klassifizierungen 267
Kommunikationsproblem
244
Legacy-Mechanismus 276
Prozessauflistung 267
RegisterApplicationRestart()
270
O
Object Linking and Embedding
17
One-Package-One-Product 9,
323
Operationsanweisung Siehe
Installationsprozess
Orca 467
Ordnerstruktur 73
P
Patch
Aktualisierungsarten 419
Anatomie 427
Anwenden 425
Anwendungsmodelle 426
Anwendungsreihenfolge
432
Baseline-Caches 48
Befehlszeilenargumente
426
Benutzerdefinierte
Aktionen 462
Benutzerkontensteuerung
216
Binr-Patches 430
Datenbank-Transformation
429
Deinstallation 456
Erstellen 434
Gemeinsame Komponenten
460
Kabinettdateien 429
LUA-Patching 217
Major-Upgrade-Patch 425
MsiPatchMetadata 431
MsiPatchSequence 430
Multi-SKU-Patch 428
Multi-Target-Patch 428
Obsolescence 451
Patch 2.0 468
Patch 3.0 431, 468
Patch Creation Property File
112
Patch Uninstall Custom
Action 463
Patch-Transformation 429
patchwiz.dll 437
Pseudoinstallierte Patches
451
Pseudoinstallierter Zustand
432
Servicemodell 416
Supersedence 432, 451
Transformationspaar 429
UAC-Patches 216
Validierungsbedingungen
433
Verbundene Ansicht 427
Verwaiste Komponenten
455
patchwiz.dll 437
Datenverluste 440
Interne Ablufe 441
Per-Machine 53, 206
Per-User-Managed 53, 206
Per-User-Unmanaged 53, 207
Portable Executable File
Format 144
PE-Dateien 253
Prprozessor-Variablen Siehe
Windows Installer-XML
Privilegierte Installation 204,
505
Stichwortverzeichnis
206, 468
Privilegierter Account 468
Produkt Siehe Windows
Installer-Paket
Produktankndigung Siehe
Installationsarten
Produkte entfernen 48
Programmierschnittstelle
ComponentInstallation 160
CustomActionData 171
Database 153, 449
IDisposable 163
IEmbeddedUI 398
Microsoft.Deployment.Com
pression.Cab.dll 153
Microsoft.Deployment.Com
pression.dll 153
Microsoft.Deployment.Win
dowsInstaller.dll 152
Microsoft.Deployment.Win
dowsInstaller.Package.dll
157
PatchInstallation 160, 453
PatchPackage 448
ProductInstallation 160,
220
Record 157, 383
Rckgabewerte 69
Session 65, 157
Session.FormatRecord 66
Session.Language 66
Session.Mode 66
Session.ProcessMessage 66
Session.Property 66
SourceList 161
SQL-Funktionsvorrat 156
SummaryInfo 153
System.Configuration.Install
.Installer 162
Transaktionsklasse 351
TransformInfo 448
View 157
ProjectAggregator2 74
Prozedursprache 78
Pseudoinstallierte Patches
451
506
Q
Q929467 210
Quellcodefrbung Siehe
Windows Installer-XML
R
Registrierung
AuthorizedLUAApp 220
COM-Komponenten 54
InProgress 49
Installed Components 493
LastKnownGood 258
PendingFileRenameOperati
ons 256, 365
Produktverffentlichung 54
RunOnce 51
RunOnceEntries 51
RUNONCEENTRY 51
ServiceDllUnloadOnStop
272
WOW6432node 138
Reparaturoptionen Siehe
Installationsarten
RequestState Siehe
Anforderungsstatus
requireAdministrator 189, 229
Resource Configuration Data
312
Ressource-Bibliotheken Siehe
Mehrsprachige
Benutzeroberflchen
Ressourcenskript 311
Restart Manager Siehe
Neustart-Manager
Richtlinien fr
Softwareeinschrnkungen
43
RID Siehe Sicherheit
Rollback 339
Rollback-Ausfhrung Siehe
Benutzerdefinierte
Aktionen
Rollback-Phase Siehe
Installationsphasen
Rckgabewerte Siehe
Benutzerdefinierte
Aktionen
S
SACL Siehe
Systemzugriffssteuerungslis
te
SAM Siehe
Sicherheitskontenverwaltun
g
ScheduleReboot Siehe
Aktionen
Scripting-Engine 63
Security Account Manager
Siehe
Sicherheitskontenverwaltun
g
Security Descriptor Siehe
Sicherheitsbeschreibung
Selbstextrahierende Archive
423
Selbstheilung 16
Self Extraction Directive File
423
Server-Prozess Siehe
Installationsprozess
Servicemodell Siehe Patch
Session Manager Siehe
Sitzungs-Manager
Setup- und
Bereitstellungsprojekte 328
Shared Components Siehe
Gemeinsame Komponenten
SharpDevelop 471
Sicherheit 178
Administratorbesttigungs
modus 188
Administratorenkonto 179
Anwendungsinformationsdi
enst 192
Authentifizierungspakete
182
Gltigkeitsdauer der
Zertifikate 218
Kerberos 182
NTLM 182
Privilegien 184, 185
Relative ID 183
ScriptAttributes 54
SeBackupPrivilege 321
Sicherheitskontext 179
Stichwortverzeichnis
TrustedInstaller 294
Virtualisierung 197
Vollstndiger Token 187
Vollstndiger Zugriffstoken
208
Windows-Ressourcenschutz
293
Zugriffstoken 182, 184
Sicherheitsbeschreibung 181
Sicherheitskennung 181, 183
Sicherheitskontenverwaltung
182, 258
Sicherheitsschildsymbol 234
SID Siehe Sicherheitskennung,
Siehe Sicherheitskennung
Sitzungs-Manager 257
Skriptbasierte
Installationssysteme 15
Skripterzeugung 64
Small-Update 419
Sofortige Ausfhrung Siehe
Benutzerdefinierte
Aktionen
Softwareaktualisierungen 416
Softwareerstellungsprozess 76
Speicherbedarf Siehe
Installationsprozess
Sprachneutrale Dateien 312
Sprachspezifische Dateien 312
Standardbenutzerinstallatione
n 212
Startvorgang 256
Status-Management 17
Sticky Elevation 205
Strukturierte Speicherung 468
Summary Information Stream
Siehe Windows InstallerPaket
System Access Control List
Siehe
Systemzugriffssteuerungslis
te
Systemordner 141
Systemrichtlinien
AllowLockdownBrowse 487
AllowLockdownMedia 230,
487
AllowLockdownPatch 487
AlwaysInstallElevated 48,
Systemzugriffssteuerungsliste
182, 468
T
Temporre Komponente 48
Tools
bmg.exe 333
candle.exe 85, 94, 103
dark.exe 94, 100
dfview.exe 427
heat.exe 94, 97
iexpress.exe 423
light.exe 85, 94, 104, 477
link.exe 237, 311
lit.exe 94, 108
makecab.exe 26, 446
MakeSfxCA.exe 165
melt.exe 94, 101
movefile.exe 256
msbuild.exe 76, 328, 477
msidb.exe 24
msiexec.exe 33
msiinfo.exe 24, 213
msimsp.exe 112, 434, 437
msitran.exe 110
mt.exe 190
muirct.exe 312
patchwiz.dll 112, 437
pendmoves.exe 256
psexec.exe 203
pyro.exe 94, 112
rc.exe 237
reg.exe 198
regsvr32.exe 245
rmtool.exe 265
schtasks.exe 250
SfxCA.dll 165
sigcheck.exe 191
signcode.exe 218
signtool.exe 218
smoke.exe 94, 107
torch.exe 94, 109
whoami.exe 187
wilogutl.exe 307
wixcop.exe 94, 96
Top-Level-Aktionen Siehe
Installationsprozess
Transaktion 468
507
Stichwortverzeichnis
Transaktionalitt 16
Transaktionen 338
ACID 338
Algorithmus 350
Anwendungsszenarien 411
Commit 339
Computerneustart 362
Installationsprozesse 339
Integrierte
Benutzeroberflche 409
MsiBeginTransaction() 346
MsiEndTransaction() 347
MsiJoinTransaction() 348
Paketbergreifende
Transaktion 468
Paketbergreifenden
Transaktionen 344
Paketbergreifender
Rollback 344
Programmierung 346
Rollback 339
Rollbackskript 342
Windows Installer 4.5 343
Transformation 468
Transformationen
Instanztransformationen 43
Kompatibilittstransformati
onen 43
Patchtransformationen 43
Sprachtransformationen 43
Troubleshooting
ActionState 47
Debugging-Informationen
301
EEUI 405
End 51
ERROR_PATCH_TARGET_NO
T_FOUND 429
ERROR_ROLLBACK_DISABLE
D 359
Fehlersuche 305
Installationsprotokoll 298,
373
InstallState 47
Operationsanweisungen
303
Property(N) 324
Protokollargumente 298
Protokollerstellung 301
508
Protokollierung 468
RegOpenKey 142
RequestState 47
Rckgabewerte 69, 303
Running Script 51
Selbstregistrierung 245
Skriptausfhrung 303
Skripterstellung 303
Statusinformationen 48
Switching to server 40, 302
WIN64DUALFOLDERS 141
Windows-Ressourcenschutz
297
XML-Format 250
U
UAC-Token Siehe Gefilterter
Token
Umgebungsvariable 61
User Account Control Siehe
Benutzerkontensteuerung
V
Validierung 469
ICE100 322
ICE38 493
ICE39 322
ICE57 213
ICE72 353
ICE86 228
ICE92 322
ICE-Validierung 105
Internal Consistency
Evaluators 107
Interne Konsistenz 107
Stringpool 24
Verbunddokument 469, Siehe
Windows Installer-Paket
Versionierungsregel 476
Verwaiste Komponenten 455
Verwaltete Installationen 204,
469
Verzeichnisstruktur 80
Verzgerte Ausfhrung Siehe
Benutzerdefinierte
Aktionen
Virtualisierung 197
Virtuelle Komponente 48
Visual Studio 2008 472
Visual Studio Team Foundation
Server 76, 83
W
Wartungsinstallation Siehe
Installationsarten
Wartungsmodus Siehe
Installationsarten
Wiederherstellungspunktes
52
Windows 7 210
Windows File Protection Siehe
Windows-Dateischutz
Windows Installer
AKID-Eigenschaften 339
Transaktionalitt 339
Windows Installer 4.0 176
Kompatibilitt 224
Versionen 177
Windows Installer 4.5 320
Optimierungen 450
Transaktionen 343
Versionen 321
Windows Installer-Datenbank
Siehe Datenbank
Windows Installer-Debugger
2008 471
Windows Installer-Paket 17
64-Bit-Paket 135
Aktivierungspunkte 29, 492
Autorisierung 202
Codepage 23
Dateinamenerweiterungen
29
Feature 467
Features 30
Kabinettdateien 26, 429,
473
Komponente 467
Komponenten 29, 473
Limitierungen 473
Logische Betrachtung 28
Logischer Zusammenhang
422
Mikro-Pakete 323
Physische Betrachtung 17
Stichwortverzeichnis
Produkt 31
Ressourcen 25, 29
Schlsselressourcen 492
Streams 157
Summary Information
Stream 20, 78, 132, 153
UAC-Konformitt 212
Verbunddokument 17
Windows InstallerDatenbank 21
Windows Installer-SDK 470
Windows Installer-Service
Siehe Installationsprozess
Windows Installer-Suite 2008
471
Windows Installer-Technologie
16
Windows Installer-XML 469,
470, 476
Bedingung 85
Benutzerdefinierte
Variablen 84
Benutzeroberflche 121
Deklarationssprache 78
Dekompilieren 100
Dokumentenstruktur 77
Erweiterungsbibliotheken
117
Fragment 91
Includedateien 84
Installation 74
IntelliSense 75
Iteration 85
Kompilieren 103
Konvertierung 96, 102
Linken 103
Lizenz 72
Lokalisierte
Installationspakete 88
Modularitt 93
Prprozessor-Elemente 83
Prprozessor-Variablen 87
Projekteinstellungen 85
Quellcodefrbung 75
Sprachmerkmale 77
Systemvariablen 84
Tabellennamen 478
Umgebungsvariablen 84
Verweise 86
Visual Studio 75
WiXVariable 85
Windows Management
Instrumentation 203
Windows NT DocFile Viewer
470
Windows Presentation
Foundation 368
Windows Ressource
Protection Siehe WindowsRessourcenschutz
Windows Scripting Host 63
Windows Server 2003 318,
320
Windows Server 2008 176,
233, 260, 293, 310, 320
Windows Vista 176, 233, 260,
293, 310, 320
Windows XP 318, 320
Windows-Dateischutz 293
Windows-On-Windows 64-Bit
Siehe WOW64-Subsystem
Windows-Ressourcenschutz
293
Funktionsweise 294
TrustedInstaller 294
WIXPROJ-Datei 477
WIX-Sprachmerkmale
BinaryRef 92
Component 80
ComponentGroupRef 81,
92
ComponentRef 81, 92
Control 120
CustomAction 146, 464
CustomActionRef 92
define 84
Dialog 120
DialogRef 92
DirectoryRef 92
DirectorySearchRef 92
DisableRegistryReflection
142
EmbeddedChainer 356
EmbeddedChainerRef 92
EmbeddedUI 396
FeatureGroupRef 92
FeatureRef 92
File 80
FileSearchRef 92
FileShare 129
FileSharePermission 129
Fragment 78, 92
Group 127
GroupRef 127
IconRef 92
InstallPrivileges 78
Media 80, 115
MergeRef 92
Module 78
Package 134, 214
Patch 78
PatchBaseline 115
PatchCreation 78, 436
PatchFamily 114
PatchFamilyRef 92
PatchSequence 436
Platform 134
Product 78, 418
PropertyRef 92
RegistrySearchRef 92
UI 120
UIRef 92, 121
User 126
Win64 140
WixLocalization 88
WixUI_Advanced 121
WixUI_ErrorProgressText
121
WIXUI_EXITDIALOGOPTION
ALCHECKBOXTEXT 300
WixUI_FeatureTree 121
WixUI_InstallDir 121
WixUI_Minimal 121
WixUI_Mondo 121
WixUIBannerBmp 122
WixUIDialogBmp 122
WixUIExclamationIco 122
WixUIInfoIco 122
WixUILicenseRtf 122
WixUINewIco 122
WixUIUpIco 122
WOW64-Subsystem Siehe 64Bit-Architektur
X
XAML 368
509
Stichwortverzeichnis
XML-Dokument 73
Z
Zertifizierungsrichtlinien 298,
325
Zugriffssteuerlisten 56, 469
Zugriffssteuerungseintrag 181
Zugriffstoken Siehe Sicherheit
Zuverlssigkeits- und
Leistungsberwachung 252
510
Stichwortverzeichnis
Der Autor
Andreas Kerl
Andreas Kerl ist Senior Consultant im Premier Support for
Developers der Microsoft Deutschland GmbH. Zu seinem
Verantwortungsbereich gehrt die Konzeptionierung, Beratung
und Portierung von kommerziellen Kundenanwendungen auf
die Microsoft .NET Plattform. Er ist Spezialist fr die Windows
Installer-Technologie seit der Version 1.0 und betreut Kunden
im gesamten deutschsprachigen Raum zu diesem Thema.
Auerdem fhrt Andreas Kerl technische Trainings fr
Systemadministratoren und Softwareentwickler durch und
spricht auf fachspezifischen Konferenzen. Als Autor ist er durch
Inside Windows Installer und Windows Installer 3.1, sowie
mehreren verffentlichten Artikeln in Fachzeitschriften bekannt.
511