<?xml version="1.0" encoding="UTF-8"?><!-- generator="wordpress.com" -->
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	>

<channel>
	<title>directory_parent &amp;laquo; WordPress.com Tag Feed</title>
	<link>http://wordpress.com/tag/directory_parent/</link>
	<description>Feed of posts on WordPress.com tagged "directory_parent"</description>
	<pubDate>Sun, 07 Sep 2008 22:27:50 +0000</pubDate>

	<generator>http://wordpress.com/tags/</generator>
	<language>en</language>

<item>
<title><![CDATA[Inside Directories in Windows Installer - Teil 2/2]]></title>
<link>http://windowsinstaller.wordpress.com/2007/12/03/inside-directories-in-windows-installer-teil-22/</link>
<pubDate>Mon, 03 Dec 2007 11:52:51 +0000</pubDate>
<dc:creator>Dominik Oberlin</dc:creator>
<guid>http://windowsinstaller.wordpress.com/2007/12/03/inside-directories-in-windows-installer-teil-22/</guid>
<description><![CDATA[Hier finden wir nun den zweiten und abschliessenden Teil mit Informationen über die Directory Tab]]></description>
<content:encoded><![CDATA[<p><em>Hier finden wir nun den zweiten und abschliessenden Teil mit Informationen über die Directory Tabelle und das Handling mit Directorybezeichnern im Windows Installer.<br />
Wer den ersten Teil nicht gelesen hat, dem empfehle ich folgenden Link zur Durchsicht: <a href="http://windowsinstaller.wordpress.com/2007/11/18/inside-directories-in-windows-installer-teil-12/">Inside Directories in Windows Installer - Teil 1</a></em></p>
<p><a href="http://windowsinstaller.wordpress.com/files/2007/11/directories.jpg" title="directories.jpg"><img src="http://windowsinstaller.wordpress.com/files/2007/11/directories.jpg" alt="directories.jpg" /></a> </p>
<p><!--more-->Im ersten Teil haben wir gesehen, wie die Verzeichnisstruktur innerhalb der Directory Tabelle aufgebaut ist. In diesem Teil werden wir auf spezielle Charakter in der <em>DefaultDir </em>Spalte eingehen und kurz die Handhabung von Verzeichnisbezeichnern innerhalb von anderen Windows Installer Tabellen oder innerhalb von Scripts besprechen.<!--more--></p>
<h3>Spezielle Charakter in der <em>DefaultDir</em> Spalte<br />
Der Punkt „.“</h3>
<p>Mit einem Punkt in der Spalte <em>DefaultDir</em> wird kein neues Verzeichnis definiert, sondern die Operation mit der Gleichsetzung auf <em>Directory_Parent</em> abgeschlossen.  In dieser Spalte wird also keine Operation angewendet, daher spricht man hier auch von einem <em>NoopFolder</em> (stammend aus  "no operation", bzw. "no-op"). Ein <em>NoopFolder</em> ist mit <em>Directory_Parent</em> identisch und die Angabe kann beispielsweise dann Sinn machen, wenn nur für das Quell- oder Zielverzeichnis eine Verzeichnisänderung erreicht werden soll (siehe nächster Absatz) und jeweils für das andere Verzeichnis nicht. Zum Teil werden <em>NoopFolder</em>-Einträge  auch verwendet, weil es sich bei dem Verzeichnis um einen Top Level Bezeichner handelt, welcher automatisch aufgelöst (Standardverzeichnis) oder anderweitig deklariert (<em>public Property</em>) wird. Oft werden aber auch nur „Redirections“ von  bestehenden Verzeichnissen auf einen neuen Key damit bewerkstelligt, weil  leere Einträge in der <em>DefaultDir</em> Spalte nicht erlaubt wären.</p>
<p><a href="http://windowsinstaller.wordpress.com/files/2007/11/dir5.jpg" title="dir5.jpg"><img src="http://windowsinstaller.wordpress.com/files/2007/11/dir5.jpg" alt="dir5.jpg" /></a></p>
<h3>Der Doppelpunkt „:“</h3>
<p>Mit dem Doppelpunkt werden Quell- und Zielverzeichnisse voneinander getrennt, wenn diese unterschiedlich sind. Enthält die Zeichenkette keinen Doppelpunkt, so sind Quell- und Zielverzeichnis gleich und entsprechen der in <em>DefaultDir</em> angegebenen Zeichenkette. Wird hingegen ein Doppelpunkt verwendet „:“, dann zielt der linke Teil vom Doppelpunkt auf das Zielverzeichnis und der rechte Teil auf das Quellverzeichnis. Somit wird auch obiges Beispiel besser verständlich, wo das Quellverzeichnis von „ZweitesDir“ einen anderen Wert ausgibt, als das entsprechende Zielverzeichnis. Es ist nämlich mit dem <em>NoopFolder</em> identisch, da nach dem Doppelpunkt „:“ in der Deklaration ein Punkt angewendet wurde. Im Beispiel unten werden dagegen  echte unterschiedliche Verzeichnisse definiert:</p>
<p><a href="http://windowsinstaller.wordpress.com/files/2007/11/dir6.jpg" title="dir6.jpg"><img src="http://windowsinstaller.wordpress.com/files/2007/11/dir6.jpg" alt="dir6.jpg" /></a></p>
<h3>Das Pipe Zeichen „&#124;“</h3>
<p>Mit dem Pipe Zeichen trennt man <em>short names</em> (8.3) von langen Dateipfadnamen. Verwendet man short names, dann dürfen diese auch  keine Leerzeichen enthalten. Zudem sollten sie nicht den Standardregeln vom Dateisystem abgeleitet sein (PROGRA~1, MICROS~1,MYDIRE~2), sondern auf anderer Logik beruhen. Als <em>short name</em> deklarierte Pfade werden beispielsweise verwendet, wenn die <em>Property SHORTFILENAMES</em> gesetzt ist. Bei der Verwendung des Pipe Zeichens befindet sich links  davon der <em>short name</em>, rechts davon der lange Name.</p>
<p><a href="http://windowsinstaller.wordpress.com/files/2007/11/dir7.jpg" title="dir7.jpg"><img src="http://windowsinstaller.wordpress.com/files/2007/11/dir7.jpg" alt="dir7.jpg" /></a></p>
<h3>Verwendung von Verzeichnissen in anderen Tabellen</h3>
<p>Alle Verzeichnisbezeichner aus der Directory Tabelle können gleich verwendet werden wie jede andere Property auch. Wenn also in einer Condition eine Prüfung auf ein Verzeichnisbezeichner erfolgt, so unterscheidet sich die Verwendung nicht von der Verwendung von Windows Installer Properties. Auch Verweise in Registrykeys mittels der Brackets „[<em>ProgramFilesFolder</em>]“, werden durch Windows Installer anstandslos aufgelöst und mit dem richtigen Pfad ersetzt.</p>
<h3>Der Formatted Datentyp</h3>
<p>Directorybezeichner entsprechen dem <a href="http://msdn2.microsoft.com/en-us/library/aa368609.aspx"><em>Formatted</em></a>  Datentyp. Diese <em>Properties</em> können innerhalb der Klammernpaare „[]“ ausgewertet werden. Wenn Windows Installer eine Zeichenfolge in der Form <em>[property]</em> oder <em>[directory]</em> ermittelt, wird der Ausdruck mit dem Inhalt der Property/des Verzeichnisses ersetzt. Verzeichnisse werden folgendermassen aufgelöst:</p>
<p><strong>[directory]<br />
</strong>Der Directorybezeichner wird vollständig aufgelöst. Beispielsweise auf „C:\Program Files\MeinDir\“.</p>
<p><strong>[#filekey]</strong> <br />
Das komplette Verzeichnis inkl. Dateinamen der Datei, welche dem <em>Filekey</em> aus der <a href="http://msdn2.microsoft.com/en-US/library/aa368596.aspx"><em>File</em></a> Tabelle entspricht, wird aufgelöst.  Beispielsweise auf "C:\Program Files\MyDir\Datei.TXT"<br />
Achtung: Die Auflösung erfolgt nur, wenn <a href="http://msdn2.microsoft.com/en-us/library/aa368050.aspx"><em>CostInitialize</em></a>, (<a href="http://msdn2.microsoft.com/en-US/library/aa368589.aspx"><em>FileCost</em></a>) und <a href="http://msdn2.microsoft.com/en-US/library/aa368048.aspx"><em>CostFinalize</em></a> durch Windows Installer ausgeführt wurden. Sollte vorher auf <em>[#filekey]</em> zugegriffen werden, wird eine leere Zeichenfolge  "" aufgelöst.</p>
<p><strong>Interessant:</strong> Sollte die Komponente als „<em>run from Source</em>“ markiert sein, liefert <em>[#filekey]</em> den Sourcepfad der Datei, ansonsten wird das Zielverzeichnis aufgelöst. Wenn die Komponente einen <em>Aktionsstatus</em> auf „<em>absent</em>“ enthält, bestimmt der <em>Installationsstatus</em> den Inhalt von <em>[#filekey]</em>. Sollte dieser auch <em>absent</em> oder <em>NULL</em> sein, so wird <em>[#filekey]</em> eine leere Zeichenfolge zugewiesen. Mit anderen Worten, sollte die Komponente durch die Installation nicht installiert werden (beispielsweise aufgrund dessen, weil der <em>Level</em>  Eintrags des Features &#62; <a href="http://msdn2.microsoft.com/en-us/library/Aa369536.aspx"><em>INSTALLLEVEL</em></a> Property ist  - <em>feature will be not installed</em>) und fehlt diese Komponente lokal auf dem System so ergibt <em>[#filekey]</em> einen Leerstring "".</p>
<p><strong>[$componentkey]</strong><br />
Diese Verwendung weist Windows Installer an, das komplette Verzeichnis der angegebenen Komponente aufzulösen. Auch hier erfolgt eine Auflösung nur nach den entsprechenden Actions <a href="http://msdn2.microsoft.com/en-us/library/aa368050.aspx"><em>CostInitialize</em></a>, (<a href="http://msdn2.microsoft.com/en-US/library/aa368589.aspx"><em>FileCost</em></a>) und <a href="http://msdn2.microsoft.com/en-US/library/aa368048.aspx"><em>CostFinalize</em></a>. Sollte die Komponente als „<em>run from Source</em>“ markiert sein, liefert <em>[$componentkey]</em> den Sourcepfad der Datei, ansonsten wird das Zielverzeichnis aufgelöst.<br />
Die Auswertung bezieht sich auf den <em><strong>Aktionsstatus</strong> </em>der angegebenen Komponente.  Steht dieser auf<em> Local</em> oder S<em>ource</em>, wird entsprechend das Quell- oder Zielverzeichnis aufgelöst. Befindet sich die Zeichenfolge <em>[$componentkey]</em> in der <em>Value</em> Spalte der <a href="http://msdn2.microsoft.com/en-us/library/aa371168.aspx"><em>Registry</em></a> Tabelle, wird zusätzlich der <em>Anforderungsstatus</em> überprüft.</p>
<p><strong>[!filekey]<br />
</strong>Windows Installer löst das komplette Verzeichnis inkl. Dateinamen eines <em>Filekeys</em> als <em>short name</em> auf. Diese Verwendung ist nur in der <em>Value</em> Spalte der <a href="http://msdn2.microsoft.com/en-us/library/aa371168.aspx"><em>Registry</em></a> - und <a href="http://msdn2.microsoft.com/en-us/library/aa369282.aspx"><em>IniFile</em></a> Tabelle gültig. Ausserhalb dieser Tabellen ersetzt Windows Installer diese Zeichenfolge mit der <em>[#filekey]</em> Repräsentation.</p>
<p><strong>Folgende Beispiele verdeutlichen die Verwendung von <em>[$component]</em> und <em>[#filekey]</em>:<br />
</strong>(die Stati beziehen sich auf die auszulesende Komponente, bzw. auf die dem <em>filekey</em> zugewiesenen Komponente)</p>
<p><a href="http://windowsinstaller.wordpress.com/files/2007/11/dir8.jpg" title="dir8.jpg"></a></p>
<h3>  <a href="http://windowsinstaller.wordpress.com/files/2007/11/dir8b.jpg" title="dir8b.jpg"><img src="http://windowsinstaller.wordpress.com/files/2007/11/dir8b.jpg" alt="dir8b.jpg" /></a></h3>
<h3>Verwendung und Ermittlung von Verzeichnissen innerhalb von Programmen und Scripts</h3>
<p>Bevor der eine oder andere schon an die Umsetzung einer rekursiven Funktion zum Ermitteln eines Zielverzeichnisses einer Komponente geht, möchte ich eine andere, weit einfachere Möglichkeit aufzeigen, um auf den kompletten Verzeichnisnamen in externen MSI Dateien mittels dem Windows Installer Automationsmodell zugreifen zu können. Über dass Session Objekt können mittels<br />
<a href="http://msdn2.microsoft.com/en-us/library/aa371685.aspx"><em>Session.TargetPath</em></a> oder <a href="http://msdn2.microsoft.com/en-us/library/aa371684.aspx"><em>Session.SourcePath</em></a> (Achtung: <em>oSession.DoAction("ResolveSource")</em> zuerst ausführen)  Quell- oder Zielverzeichnisse von Directory-Bezeichnern ermittelt werden. Noch einfacher und globaler einsetzbar, geht es mit der <a href="http://msdn2.microsoft.com/en-us/library/aa371665.aspx"><em>Session.FormatRecord</em></a> Methode, welche  einfach den <a href="http://msdn2.microsoft.com/en-us/library/aa368609.aspx"><em>Formatted</em></a> Datentyp auswertet. Im unten dokumentierten Beispiel gehen wir bei den Vorbereitungen noch einen Schritt weiter, als im letzten Kapitel, indem wir neben den <em>FileCosting</em> Actions zusätzlich <a href="http://msdn2.microsoft.com/en-us/library/aa367578.aspx"><em>AppSearch</em></a> ausführen. Dies hat den Vorteil, dass über  <a href="http://msdn2.microsoft.com/en-us/library/aa367578.aspx"><em>AppSearch</em></a>  zu ermittelnde Verzeichnisse ebenfalls ausgewertet werden.</p>
<p><strong>Hier ein einfaches Beispiel mittels dem Windows Installer Automationsmodell:</strong><br />
<font size="1"><br />
Dim sDir, oSession, oInstaller, oRecord<br />
Set oInstaller = Wscript.CreateObject("WindowsInstaller.Installer")<br />
Set oSession = oInstaller.OpenPackage("C:\meineMsi.MSI", 1)<br />
oSession.DoAction("AppSearch")<br />
oSession.DoAction("CostInitialize")<br />
oSession.DoAction("CostFinalize<br />
Set oRecord = oSession.Installer.CreateRecord(1)<br />
oRecord.StringData(0)="[ProgramFilesFolder]"<br />
msgbox( "FormatRecord: " &#38; oSession.FormatRecord(oRecord))<br />
msgbox( "TargetPath: " &#38; oSession.TargetPath("ProgramFilesFolder"))</font></p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Inside Directories in Windows Installer - Teil 1/2]]></title>
<link>http://windowsinstaller.wordpress.com/2007/11/18/inside-directories-in-windows-installer-teil-12/</link>
<pubDate>Sun, 18 Nov 2007 01:27:53 +0000</pubDate>
<dc:creator>Dominik Oberlin</dc:creator>
<guid>http://windowsinstaller.wordpress.com/2007/11/18/inside-directories-in-windows-installer-teil-12/</guid>
<description><![CDATA[Inspiriert von Rob Menschings historischer Blogserie  &#8221;Deciphering the MSI Directory table]]></description>
<content:encoded><![CDATA[<p><em>Inspiriert von Rob Menschings historischer Blogserie  "Deciphering the MSI Directory table" und von Programmiertätigkeiten, wo ich auch auf Directoryinformationen angewiesen war, erlauben folgende Ausführungen einen kurzen Einblick in die Directory Tabelle und das Handling mit Directorybezeichnern in zwei Teilen.</em>  </p>
<p><!--more--></p>
<p>Viele, die schon einmal einen Blick in die <a href="http://msdn2.microsoft.com/en-us/library/aa368295.aspx"><em>Directory</em></a> Tabelle geworfen haben, werden sich über deren Aufbau gewundert haben. Meistens scheut man es, Verzeichnisse zur Kontrolle  in Orca „per Hand“ aufzulösen und schaut daher lieber mal in den Editoren der Auringtools nach, wie ein entsprechendes Verzeichnis nun ausgeschrieben aussehen mag. Es gibt aber Situationen, wo wir uns über den Aufbau im Klaren sein müssen oder wo wir per Script den vollständigen Verzeichnisnamen benötigen. Für diese  Zwecke und für das allgemeine Verständnis sind nachfolgende Zeilen gedacht:</p>
<p>In einer Windows Installer Datenbank finden wir Verzeichnisangaben in der <a href="http://msdn2.microsoft.com/en-us/library/aa368295.aspx"><em>Directory</em></a> Tabelle. Alle Verzeichnisreferenzen aller Komponenten verweisen auf  den Primary Key dieser <a href="http://msdn2.microsoft.com/en-us/library/aa368295.aspx"><em>Directory</em></a> Tabelle und sind an sich Windows Installer Properties. Diese Tabelle wird schliesslich während des <a href="http://msdn2.microsoft.com/en-us/library/aa368593.aspx"><em>File Costing </em></a>Prozesses durch Windows Installer ausgewertet.</p>
<h3>Der Aufbau der Directory Tabelle</h3>
<p>Die <em>Directory</em> Tabelle enthält drei Spalten,  <em>Directory, Directory_Parent</em> und <em>DefaultDir</em>. Die Spalte <em>Directory</em> ist zugleich der Primary Key der Tabelle, d.h auch, dass dieser einen eindeutigen und einmalig vorkommenden Namen enthalten muss. Man sieht es bereits am Namen der Spalte <em>Directory </em>an, dass diese Spalte der Primary Key der Tabelle ist, da die Namen der Tabelle (<em>Directory</em>) und der Spalte (<em>Directory</em>) identisch sind.  Bei Windows Installer Standard Tabellen, wo nur ein Primary Key vorkommt, wird oft in der Schlüsselspalte der selbe Name verwendet.<br />
Eine Verzeichnisstruktur setzt sich aus dem Verweis auf einen Key in <em>Directory_Parent</em> und dem Unterverzeichnis (<em>DefaultDir</em>) zusammen. Das Auflösen der <em>Directory_Parent</em> erfolgt hierbei in mehreren Schritten maximal bis zu einem der <a href="http://msdn2.microsoft.com/en-us/library/aa372057.aspx"><em>Standardverzeichnisse</em></a>, bis zu <a href="http://msdn2.microsoft.com/en-us/library/aa372064.aspx"><em>TARGETDIR</em></a>  (bzw. <em>SourceDir</em>) oder bis zu einem als <a href="//msdn2.microsoft.com/en-us/library/aa370912.aspx"><em>public Property</em></a> deklarierten Directory, welches durch <em>AppSearch</em>, <em>CustomAction</em> Typ 35 oder 51, durch die Commandline  oder in der Property Tabelle definiert wurde.  Abgeschlossen wird jede Verzeichnisangabe schliesslich durch ein Backslash „\“ am Ende der Zeichenkette.</p>
<p>Beispiel:</p>
<p><a href="http://windowsinstaller.wordpress.com/files/2007/11/dir1b.jpg" title="dir1b.jpg"><img src="http://windowsinstaller.wordpress.com/files/2007/11/dir1b.jpg" alt="dir1b.jpg" /></a></p>
<h3>Top Level Verzeichnisse</h3>
<p>Als Top Level Verzeichnisse werden hier Verzeichnisse benannt, die nicht weiter durch die Standardmechanismen aufgelöst werden müssen, da sie selbst durch Windows Installer während der Installation bestimmt werden. Diese Verzeichnisse bilden die "Root", aber müssen sich aber nicht auf ein Root-Verzeichnis beschränken. Das Verzeichnis <a href="http://msdn2.microsoft.com/en-us/library/aa370881.aspx"><em>ProgramFilesFolder</em></a>, welches auf "C:\Program Files" zeigen könnte, ist demnach beispielsweise ein Top Level Verzeichnis.</p>
<p>Die Auflösung der Top Level Verzeichnisse  erfolgt durch Windows Installer auf verschiedene Art und Weise. Standardverzeichnisse werden wie die komplette  Auswertung der <em>Directory </em>Tabelle auch innerhalb der <em>Action CostFinalize</em> aufgelöst. Diese werden dort aber durch die API Funktion <a href="http://msdn2.microsoft.com/en-us/library/ms647764.aspx"><em>SHGetFolderPath()</em></a> ermittelt. Das Top Level Standardverzeichnis <a href="http://msdn2.microsoft.com/en-us/library/aa370881.aspx"><em>ProgramFilesFolder</em></a> wird dabei beispielsweise mit der Zeichenkette “C:\Program Files\” gleichgesetzt und das <a href="http://msdn2.microsoft.com/en-us/library/aa369768.aspx"><em>LocalAppData</em></a> Verzeichnis bekäme unter Windows Vista für eine Installation in meinem Kontext beispielsweise den Wert „C:\Users\oberlind\AppData\Local“.<br />
In der <em>Directory </em>Tabelle verwendete <em><a href="//msdn2.microsoft.com/en-us/library/aa370912.aspx"><em>public Properties</em></a> </em>werden hingegen durch die <em>Action AppSearch</em>, durch die Deklaration in der <em>Property</em> Tabelle, durch <em>CustomActions</em> Typ 35 oder 51, durch die Commandline oder durch das <a href="http://msdn2.microsoft.com/en-us/library/aa371697.aspx"><em>SetTargetPath()</em></a> <em>ControlEvent</em> (bei <em>full UI</em>) deklariert. Für jedes  verwendete  Top Level Verzeichnis muss sich ein gültiger Eintrag in der <em>Directory</em> Tabelle befinden. Diese Deklaration wird aber während der Ausführung der MSI mit den „echten“ Werten überschrieben.</p>
<p>Beispiel mit Top Level Verzeichnissen <em>TARGETDIR</em>, <em>ProgramFilesFolder</em> und MYDATS:</p>
<p><a href="http://windowsinstaller.wordpress.com/files/2007/11/dir2.jpg" title="dir2.jpg"><img src="http://windowsinstaller.wordpress.com/files/2007/11/dir2.jpg" alt="dir2.jpg" /></a></p>
<p>Zielverzeichnisse nach dem FileCosting beim Installieren via<br />
„msiexec.exe  /i msi.msi MYDATS=C:\ProgramDat\Root“:</p>
<p><a href="http://windowsinstaller.wordpress.com/files/2007/11/dir3.jpg" title="dir3.jpg"></a><a href="http://windowsinstaller.wordpress.com/files/2007/11/dir3.jpg" title="dir3.jpg"><img src="http://windowsinstaller.wordpress.com/files/2007/11/dir3.jpg" alt="dir3.jpg" /></a></p>
<p>Man beachte, dass MYDATS automatisch ein Backslash angehängt wurde. Hätte man im Beispiel auf ein Verzeichnis mit Leerzeichen verweisen wollen, bspl. MYDAT=C:\Program Files\ProgramDat\Root, so wäre die Angabe von Anführungszeichen in der Commandline erforderlich gewesen:<span style="font-size:10pt;">MYDATS=“C:\Program Files\ProgramDat\Root“.</span></p>
<h3>TARGETDIR, SourceDir und ROOTDRIVE</h3>
<p>Das Top Level Verzeichnis <em>TARGETDIR</em> bestimmt das Rootverzeichnis der Installation. <em>TARGETDIR</em> <strong>muss</strong> sich in der <em>Directory</em> Tabelle befinden, ansonsten erhält man Fehlermeldungen wie diese: „Root directory property undefined“. Die Deklaration muss hierbei folgenden Aufbau haben:</p>
<p><a href="http://windowsinstaller.wordpress.com/files/2007/11/dir4.jpg" title="dir4.jpg"><img src="http://windowsinstaller.wordpress.com/files/2007/11/dir4.jpg" alt="dir4.jpg" /></a></p>
<p>Falls der Inhalt von <em>TARGETDIR</em> bei der Installation nicht definiert wurde (beispielsweise über die Commandline), wird die Property <em>ROOTDRIVE</em> aufgelöst, um den Pfad zu ermitteln. Sollte auch <em>ROOTDRIVE</em> weder in der <em>Property</em> Tabelle noch über die Commandline angegeben worden sein, setzt Windows Installer bei einer Administrativinstallation diese <em>Property</em> auf das erste verfügbare und beschreibbare Netzwerklaufwerk. Bei einer Installation wird diese <em>Property</em> hingegen auf das Laufwerk mit dem grössten verfügbaren Speicherplatz gesetzt. Das sind die Gründe, warum im Deployment die Verwendung auf <em>ROOTDRIVE=C:\</em> in der <em>Property</em> Tabelle empfohlen ist. Nichtbeachten dieser Regel kann dazu führen, dass eine Installation auf dem einen PC auf das lokale Laufwerk C:\ erfolgt, bei einem benachbarten  Gerät hingegen auf Laufwerk D:\, wenn dort beispielsweise eine zweite Disk mit mehr Platz verfügbar ist.<br />
Bei einer Administrativinstallation wird die Angabe von <em>TARGETDIR in</em> der Commandline empfohlen, da dadurch das <strong>Zielverzeichnis</strong> angegeben wird, wohin die Administrativinstallation erfolgen soll:</p>
<p>Msiexec.exe /a mymsi.msi TARGETDIR=H:\AdminP</p>
<p>Bei der <em>Property</em> <em>SourceDir</em> müssen keine expliziten Deklarationen in der <em>Directory</em> Tabelle erfolgen. <em>SourceDir</em> repräsentiert denn auch das Quellverzeichnis. Externe Cabinettdateien oder extern und unkomprimiert vorliegende Sourcedaten werden bei einer Installation oder Reparatur in diesem Verzeichnis gesucht. Auch <em>CustomActions</em> können aus diesem Verzeichnis ausgeführt werden oder auf dieses Verzeichnis über <a href="http://msdn2.microsoft.com/en-us/library/aa370134.aspx"><em>MsiGetProperty</em></a> zugreifen. Die <em>SourceDir</em> Property wird über die <em>Action</em> <a href="http://msdn2.microsoft.com/en-us/library/aa371232.aspx"><em>ResolveSource</em></a>, welche nach <a href="http://msdn2.microsoft.com/en-us/library/aa368050.aspx"><em>CostInitialize</em></a> einzuordnen ist, initialisiert.</p>
<p>Tip: Möchten Sie alle Zugriffe bei einer Deinstallation auf das Installationsverzeichnis und allfällige <a href="http://msdn2.microsoft.com/en-us/library/aa371858.aspx"><em>SOURCELIST</em></a> Verzeichnisse unterbinden, können Sie dies mit der Condition <em>NOT REMOVE=“ALL“</em> bei <a href="http://msdn2.microsoft.com/en-us/library/aa371232.aspx"><em>ResolveSource</em></a> in der <em>InstallExecuteSequence</em> Tabelle steuern.</p>
<h3>Betrachtungen im Installationsprozess</h3>
<p>Die Verzeichniseinträge werden während des Installationsprozesses in der Regel sowohl im Client-, als auch im Serverprozess ermittelt. Dabei werden die Verzeichniseinträge der <a href="http://msdn2.microsoft.com/en-us/library/aa368295.aspx"><em>Directory</em></a> Tabelle während des <a href="http://msdn2.microsoft.com/en-us/library/aa368593.aspx"><em>File Costing</em></a><em> </em>Prozesses durch den <em>DirectoryManager</em> über das <em>Installationsmodul</em> des entsprechenden Prozesses ausgewertet.<br />
Während dieser Phase werden die Directorybezeichner entsprechenden <em>Properties</em> zugewiesen. In einer Protokolldatei mit Verboseinformationen findet man daher nach der Ausführung von <a href="http://msdn2.microsoft.com/en-us/library/aa368048.aspx"><em>CostFinalize</em></a> auch ein Dump dieser ermittelten Verzeichnisse.</p>
<p>Fortsetzung folgt...<br />
<a href="http://windowsinstaller.wordpress.com/2007/12/03/inside-directories-in-windows-installer-teil-22/">Inside Directories in Windows Installer Teil 2/2</a></p>
]]></content:encoded>
</item>

</channel>
</rss>
