Im Unattended Modus keine Registry Einträge
Posted 28 August 2008 - 15:42
Ich habe ein ganz normales Basic MSI Projekt und mache über diverse Components auch Registryeinträge.
Beim normalen Installieren funktioniert das Ganze auch. Wenn ich jedoch das Setup unattended* ausführe, werden die Dateien zwar kopiert jedoch keine Registry Einträge geschrieben. Wieso ? Was mache ich falsch ?
Danke für eure tipps
Phil_b
* = Benutze folgendes Command
msiexec /i "[Pfad zum MSI]" /qn[B]
Posted 28 August 2008 - 16:25
Posted 01 September 2008 - 13:43
QUOTE (UNeverNo @ 2008-08-28 16:25) |
Beim silent install werden afaik Aktionen im User Interface nicht ausgeführt. Kann es daran liegen? |
Hallo
Danke für deinen Input. Was meinst du genau mit afaik Aktionen ? Die Registrykeys sind einer Component zugewiesen, diese Component ist wieder um einem Feature zugewiesen.
Im normalen Modus werden diese Registry korrekt geschrieben. Liegt es an einer Feature Einstellung (siehe Printscreen).
Gruss
Phil_B
Posted 03 September 2008 - 11:35
QUOTE (Phil_b @ 2008-09-01 13:43) |
Danke für deinen Input. Was meinst du genau mit afaik Aktionen ? Die Registrykeys sind einer Component zugewiesen, diese Component ist wieder um einem Feature zugewiesen. |
afaik = as far as i know
Ich hatte vermutet, dass Du die Registryeinträge evtl. über eine Scriptsprache und eine benutzerdefinierte Aktion schreiben würdest (was man eigentlich nicht machen soll) und diese Aktion halt im User Interface ausführst. Die Aktionen im UserInterface selbst werden aber im silent mode nicht ausgeführt soweit ich weiß.
Aber wie gesagt das sollte bei Dir nicht der Fall sein...
Posted 09 September 2008 - 07:38
Bei der Silent Installation solltest du evtl. mit ADDLOCAL angeben, welche Feature lokal installiert werden sollen.
Posted 10 September 2008 - 08:50
QUOTE (ali @ 2008-09-09 07:38) |
du solltest mal ein Log mit /L*V erstellen und schauen, ob das Feature in dem die RegKomponenten hängen für die lokale installation ausgewählt wurden! Bei der Silent Installation solltest du evtl. mit ADDLOCAL angeben, welche Feature lokal installiert werden sollen. |
Die Registry Einträge werden jetzt zwar geschrieben, teilweise aber nicht alle und nicht mit allen Werten.
Mache ich evt. den Aufruf falsch ?
CODE |
msiexec /i "Name.msi" /qn ADDLOCAL=NameFeature |
Was ich noch vergessen habe zu erwähnen ist, dass die CustomAction, die die Werte aus dem INI File ausliesst folgende Eigenschaften hat (siehe Attachment).
Posted 10 September 2008 - 09:00
Posted 10 September 2008 - 09:40
QUOTE (ali @ 2008-09-10 09:00) |
wie ich dir schon geschrieben habe, solltest du mal ein Log anfertigen, und schauen ob deine Propertys mit entsprechenden Werten gefüllt sind, oder vielleicht während der Silent installation inhaltlich geändert bzw. gelöscht werden. |
Ok, aber wie erstellt man ein LOG File ?
Posted 10 September 2008 - 09:48
QUOTE (Phil_b @ 2008-09-10 10:40) | ||
Ok, aber wie erstellt man ein LOG File ? |
msiexec /i "Name.msi" ADDLOCAL=NameFeature /L*V c:\inst.log /qn
Posted 29 September 2008 - 10:45
Ich wollte vorhin ein Logfile für das Setup im unattended Modus erstellen. Dein Aufruf ging leider nicht.
Was habe ich falsch eingegeben ?
CODE |
msiexec /i "Name.msi" /L *V c:\test.log /qn |
Der Aufruf mache ich aus dem gleichen Verzeichnis in welchem sich das MSI befindet.
Posted 29 September 2008 - 10:59
es muss heißen /L*V nicht /L *V
der installer ist da ein wenig empfindlich.
Posted 29 September 2008 - 12:36
QUOTE (ali @ 2008-09-29 10:59) |
msiexec /i "Name.msi" /L*V c:\test.log /qn es muss heißen /L*V nicht /L *V der installer ist da ein wenig empfindlich. |
achso, ok danke
das Erstellen des Logfiles hat nun funktioniert. Die Registry Einträge werden zwar korrekt erstellt, jedoch wird die Funktion (Installscript) "ReadConfig", welches Werte aus einem INI File ausliest und Properties überschreibt nicht korrekt ausgeführt. Einige Properties Werte werden danach in der Registry gebraucht u. sind jedesmal leer.
Hier der Installscript Code
CODE |
function ReadConfig(hMSI) //Declaration STRING m_strSourceDir,svSourcePath; STRING m_strResult; STRING m_strINIFile; STRING m_strSection; INT m_intSize,nvSize; begin m_intSize = 255; MsiGetProperty(hMSI,"CONFIGPATH",m_strResult, m_intSize); if (StrLength(m_strResult) <= 0) then MsiGetProperty(hMSI,"SourceDir",svSourcePath,nvSize); m_strResult = svSourcePath; endif; //Build Path for INI File m_strINIFile = m_strResult ^ "Name.ini"; // Wird kein INI File gefunden, wird muss auch nichts gesetzt werden. if (FindFile(m_strResult,"Name.ini",m_strResult) >= 0) then //Read General Setup Config Entries m_strSection = "Main"; ReadConfigEntry(hMSI, m_strINIFile, m_strSection, "InstallPath", "INSTALLDIR"); endif; end; |
CODE |
function ReadConfigEntry(hMSI, INIFile, Section, Key, Property) //Declaration STRING m_strResult; begin //Read INI String GetProfString(INIFile, Section, Key, m_strResult); m_strResult = ReplaceString(hMSI, m_strResult, "%ProgramFolder%"); //Write Value to Property // Darf nur geschrieben werden, wenn auch ein Wert vorhanden ist. //MessageBox(m_strResult + " - " + Property,INFORMATION); //if (m_strResult != "") then MsiSetProperty(hMSI,Property,m_strResult); //endif; end; |
Edited by Phil_b, 29 September 2008 - 15:42.
Posted 29 September 2008 - 13:47
QUOTE (ali @ 2008-09-29 12:58) |
wann/wo führst du das script aus? |
Die Custom Action wird nach der Funktion AppSearch.
Hier die Properties dieser Custom Action
Posted 29 September 2008 - 14:15
Schau mal dein log durch, wann Propertys Werte erhalten, und wann nicht.
Du kannst auch mit SprintfMsiLog eigene Einträge aus ISScript dem log hinzufügen.
Du führst die Aktion auch für InstallInitalize aus? Sonst könntest du auch Probleme mit dem CustomActionData haben.
Posted 29 September 2008 - 15:52
QUOTE (ali @ 2008-09-29 14:15) |
hast du im log mal geschaut ob deine Propertys auch werte haben so wie CONFIGPATH und so. Evtl. must du Propertys dem SecureCustomProperty hinzufügen. Schau mal dein log durch, wann Propertys Werte erhalten, und wann nicht. Du kannst auch mit SprintfMsiLog eigene Einträge aus ISScript dem log hinzufügen. Du führst die Aktion auch für InstallInitalize aus? Sonst könntest du auch Probleme mit dem CustomActionData haben. |
Komischerweise finde ich CONFIGPATH nirgends im Log, aber das Propertie SourceDir finde ich u. hat auch den korrekten Wert.
Das eine Propertie welches in der Registry nicht gesetzt wird, ist auch im Log unter SecureCustomProperties aufgelistet aber sonst nirgends.
Die Installscript Funktion "ReadConfig" wird laut des Logs auch ausgeführt
CODE |
Action start 16:35:17: ReadConfig. InstallShield 16:35:18: Running InstallScript function f2 InstallShield 16:35:18: Using temp folder C:\DOKUME~1\xxx\LOKALE~1\Temp\{E12F2663-E0B9-4B66-883F-27E1FA6CF23F} InstallShield 16:35:18: Installing engine... InstallShield 16:35:18: Using product language 1033 InstallShield 16:35:18: Extracting support file setup.inx to C:\DOKUME~1\xxx\LOKALE~1\Temp\{E12F2663-E0B9-4B66-883F-27E1FA6CF23F}\setup.inx InstallShield 16:35:18: Opening stream of file C:\WINDOWS\Installer\MSI1857.tmp InstallShield 16:35:18: Extracting support file ISRT.dll to C:\DOKUME~1\xxx\LOKALE~1\Temp\{E12F2663-E0B9-4B66-883F-27E1FA6CF23F}\ISRT.dll InstallShield 16:35:18: Extracting support file IsConfig.ini to C:\DOKUME~1\xxx\LOKALE~1\Temp\{E12F2663-E0B9-4B66-883F-27E1FA6CF23F}\IsConfig.ini InstallShield 16:35:18: Extracting support file _isres1033.dll to C:\DOKUME~1\xxx\LOKALE~1\Temp\{E12F2663-E0B9-4B66-883F-27E1FA6CF23F}\_isres.dll InstallShield 16:35:18: Extracting support file String1033.txt to C:\DOKUME~1\xxx\LOKALE~1\Temp\{E12F2663-E0B9-4B66-883F-27E1FA6CF23F}\String1033.txt InstallShield 16:35:18: Skipping optional support file _isuser1033.dll InstallShield 16:35:18: Setting script cmdline... InstallShield 16:35:18: ProductCode is {8984BEC8-8C20-4A1A-B59D-B74BAD22ACEA} InstallShield 16:35:18: Initializing Engine InstallShield 16:35:19: Done Initializing... MSI (s) (2C!30) [16:35:19:001]: Note: 1: 2732 2: 0 MSI (s) (2C!30) [16:35:19:001]: Note: 1: 2732 2: 0 MSI (s) (2C!30) [16:35:19:010]: Note: 1: 2732 2: 0 InstallShield 16:35:19: Registering Msi Server... InstallShield 16:35:19: Invoking script function ReadConfig InstallShield 16:35:19: CallScriptFunctionFromMsiCA() ends MSI (s) (2C:C4) [16:35:19:050]: Doing action: IsLaunchConditions.6FC97963_2511_11D4_BB8A_00C04F20D375 Action ended 16:35:19: ReadConfig. Return value 1. |
Die Installscript Funktion wird als Custom Action mit der Sequence Number 405 ausgeführt mit der Condition NOT Installed.
Posted 30 September 2008 - 07:42
Welche anderen Property meinst du, im Script wird nur INSTALLDIR gesetzt. Wenn INSTALLDIR also nach deinem Scriptaufruf den Richtigen wert hat, ist doch alles ok, wenn nicht, würde ich mir mal ein paar MsgBoxen einbauen und während der Installation Werte ausgeben lassen.
Posted 30 September 2008 - 09:43
QUOTE (ali @ 2008-09-30 07:42) |
dein Script ist ja nur dafür da um INSTALLDIR zu setzen, abhängig davon ob es in einem Property (welches du wahrscheinlich über AppSearch ausliest), SourceDir, oder IniFile gefunden wird. Gewinnen tut immer das IniFile. Welche anderen Property meinst du, im Script wird nur INSTALLDIR gesetzt. Wenn INSTALLDIR also nach deinem Scriptaufruf den Richtigen wert hat, ist doch alles ok, wenn nicht, würde ich mir mal ein paar MsgBoxen einbauen und während der Installation Werte ausgeben lassen. |
Mein Script verwende ich nicht 1:1 genau so wie ich gepostet habe, dies war nur ein Beispiel. Ich arbeite noch mit anderen, selbst definierten Properties.
Ich habe nun ein paar Messageboxen im Script platziert und festgestellt das einige Properties leer sind. Dies sind u.a. CONFIGPATH, SourceDir, SETUPEXEDir, etc. Ich brauche aber diese Werte, da ich ja sonst nicht auf das INI File zugreifen kann um die Properties zu setzen.
Gibt es sonst noch ein Propertie das ich über MsiGetProperty auslesen kann, das mir den aktuellen Pfad, des ausführenden MSI File (oder Setup.exe) gibt ?
Oder kann ich allenfalls beim msiexec Aufruf das Propertie setzen, dann wäre das Problem auch gelöst.
Posted 30 September 2008 - 10:17
also SourceDir sollte bei der Erstinstallation gesetzt sein, ich würde aber evtl SOURCEDIR auslesen.
SETUPEXEDIR ist nur gesetzt, wenn die Installation über eine Setup.exe gestartet wurde.
CONFIGPATH wirst du ja selbst setzen, daher musst du schaun wieso das nicht gesetzt ist.
Du kannst Propertys aber auch über eine Benutzerdefinierte Aktion setzen.
Ansonsten kannst du ja mal am Ende deines log schaun, dort sind fast alle Propertys gelistet, die während der Installation gesetzt wurden.
Edited by ali, 30 September 2008 - 10:19.
Posted 30 September 2008 - 10:54
Im LOG ist seltsamerweise ersichtlich das dieses SOURCEDIR Propertie korrekt gesetzt wurde.
Posted 30 September 2008 - 11:28
QUOTE (ali @ 2008-09-30 11:05) |
versuch mal wenn du sie nach CostFinalize setzt. |
Perfekt jetzt funktioniert's.
Besten Dank