msiGetProperty funktioniert nicht bei Skript-CA!
Posted 15 September 2005 - 16:38
Ich habe folgendes großes Problem:
Ich habe in meiner Installation (Basic-MSI-Projekt) eine Custom Action die eine InstallSkript-Funktion aufruft. In dieser Funktion benutze ich die Funktion "MsiGetProperty" um auf Eigenschaften der MSI-Installation zuzugreifen. Das klappt auch an meinem PC ohne Probleme (Admin-Rechte). Bei der Softwareverteilung hingegen funktioniert die Funktion "MsiGetProperty" nicht!!! Ich habe nachgefragt und man hat mir gesagt, daß die Installationen mit den Rechten "SYSTEM" ausgeführt würden - daß sei ungefähr sowas wie admin, nur daß man kein Netzwerk hätte und hkcu nicht erreichbar sei. Aber warum funktioniert dann msiGetProperty nicht?????
Hier ist die Funktion meines Skriptes:
CODE |
function MyFunction(hMSI) STRING DATADIR[256]; STRING SERVERDIR[256]; STRING CurrentINSTALLDIR[256]; NUMBER nBuffer; // Gehen Sie wie folgt vor: Lokale Variablen deklarieren. begin nBuffer = 256; MsiGetProperty(hMSI,"DATADIR",DATADIR,nBuffer); MessageBox("RemoveSlash - MsiGetProperty: DATADIR = " + DATADIR ,INFORMATION); StrRemoveLastSlash(DATADIR); MsiSetProperty( hMSI,"REGDATADIR",DATADIR); MsiGetProperty(hMSI,"SERVERDIR",SERVERDIR,nBuffer); MessageBox("RemoveSlash - MsiGetProperty: SERVERDIR = " + SERVERDIR ,INFORMATION); StrRemoveLastSlash(SERVERDIR); MsiSetProperty( hMSI,"REGSERVERDIR",SERVERDIR); MsiGetProperty(hMSI,"INSTALLDIR",CurrentINSTALLDIR,nBuffer); MessageBox("RemoveSlash - MsiGetProperty: CurrentINSTALLDIR = " + CurrentINSTALLDIR ,INFORMATION); StrRemoveLastSlash(CurrentINSTALLDIR); MsiSetProperty( hMSI,"REGINSTALLDIR",CurrentINSTALLDIR); end; |
Wenn ich das ganze auf meinem Rechner ausführe funktionieren die Funktionen msiGetProperty und msiSetProperty - bei der Softwareverteilung funktionieren sie NICHT und die Werte sind leer!
Woran liegt das??? Ich muß doch auch mit "SYSTEM"-Rechten auf die msi-Eigenschaften zugreifen können???
Bin für jede Hilfe dankbar!!
Edited by herrbecht, 15 September 2005 - 16:39.
Posted 16 September 2005 - 08:32
function MyFunction(hMSI)
STRING DataDir[256];
STRING ServerDir[256];
STRING CurrentINSTALLDIR[256];
NUMBER nBuffer;
// Gehen Sie wie folgt vor: Lokale Variablen deklarieren.
begin
nBuffer = 256;
MsiGetProperty(hMSI,"DATADIR",DataDir,nBuffer);
MessageBox("RemoveSlash - MsiGetProperty: DATADIR = " + DataDir ,INFORMATION);
StrRemoveLastSlash(DataDir);
MsiSetProperty( hMSI,"REGDATADIR",DataDir);
Posted 16 September 2005 - 14:25
Ichn habe die Variablennamen jetzt mal klein geschrieben - leider funktioniert es immer noch nicht. Ich habe mir jetztmal den return-Wert der MsiGetProperty-Funktion ausgeben lassen. Jetzt sieht die Funktion folgerdermaßen aus (Ausschnitt)
CODE |
function MyFunction(hMSI) STRING DataDir, CurrentSERVERDIR, CurrentINSTALLDIR, result,szMsg; NUMBER nBuffer, nvResult; // Gehen Sie wie folgt vor: Lokale Variablen deklarieren. begin nBuffer = 256; nvResult = MsiGetProperty(hMSI,"DATADIR",DataDir,nBuffer); switch (nvResult) case ERROR_INVALID_HANDLE: szMsg = "ERROR_INVALID_HANDLE"; case ERROR_INVALID_PARAMETER: szMsg = "ERROR_INVALID_PARAMETER "; case ERROR_MORE_DATA: szMsg = "ERROR_MORE_DATA"; case ERROR_SUCCESS: szMsg = "ERROR_SUCCESS"; default: Sprintf(szMsg,"Sonstig %ld" ,nvResult); endswitch; MessageBox (szMsg, INFORMATION); MessageBox("RemoveSlash - MsiGetProperty: " + result + " DataDir = " + DataDir ,INFORMATION); StrRemoveLastSlash(DataDir); MsiSetProperty( hMSI,"REGDATADIR",DataDir); [..] |
Laut MSDN kann die Funktion folgende Rückgabewerte haben: ERROR_INVALID_HANDLE, ERROR_INVALID_PARAMETER, ERROR_MORE_DATA oder ERROR_SUCCESS.
Wenn ich die Installation auf meinem Rechner ausführe funktioniert die Funktion korrekt und liefert "ERROR_SUCCESS" .
Bei der Softwareverteilung hat die MsiGetProperty-Funktion der Rückgabewert: "Sonstig 196613"
Was hat das zu bedeuten???? ich hatte erwartet, dass die Funktion eine der vier angegebenen Werte zurückgibt...???
Mir ist noch etwas anderes aufgefallen, womit es eventuell auch zusammenhägen könnte: Auf meinem Rechner (Rechte: Admin) läuft die msi-Version 2.0. Auf dem Rechner auf dem ich die Installation über die Softwareverteilung installiere (Rechte: SYSTEM) läuft msi in der Version 3.1. Kann es vllt. daran liegen???
Oder wie behebe ich dieses mysteriöse Problem...???? Irgendwie muss das doch funktionieren, oder ist das ein Bug????
Bin wirklich für jede Hilfe dankbar... !!!
Edited by herrbecht, 16 September 2005 - 14:26.
Posted 16 September 2005 - 14:43
Posted 19 September 2005 - 10:31
mein Rechner
CODE |
Build type: SHIP UNICODE 2.00.2600.1106 |
Rechner mit Softwareverteilung:
CODE |
Build type: SHIP UNICODE 3.01.4000.2435 |
Liegt das an den unterschiedlichen MSI-Versionen oder woran???
Ich mit meinem Latein irgendwie am Ende....
Bin für jede Hilfe dankbar!!!
Edited by herrbecht, 19 September 2005 - 10:40.
Posted 19 September 2005 - 10:59
Habe sonst auch keine Idee. Hast du keine Testrechner wo du mal unter 2000 mit MSI 3.1 testen kannst?
Posted 19 September 2005 - 12:38
Allerdings sollte beim Deployment via Active Directory der Verteilungsrechner und der Zielrechner möglichst die gleiche Version verwenden.
Stefan Krüger
InstallSite.org twitter facebook
Posted 19 September 2005 - 15:22
Edited by ali, 19 September 2005 - 15:24.
Posted 19 September 2005 - 15:52
Das Problem liegt bei den unterschiedlichen Rechten! Ich habe mich jetzt mal an dem Software-Verteilungs-PC als Administrator angemeldet (nachdem ich das Admin-PAsswort in Erfahrung gebracht habe;-) ) und die Installation durchfgeführt und alles hat funktioniert!
Wenn ich das Paket aber mit den Rechten SYSTEM ausführe, wie es bei der Softwareverteilung passiert, dann treten die oben beschriebenen Probleme auf und msiGetproperty funktioniert nicht.
als ich bei den Sofware-Verteilern nachgefragt habe was das "SYSTEM" bedeutet sagten sie mir daß sei im Prinzip wie "admin" nur daß man auf hkcu kein Zugriff hätte und die Netzlaufwerke nicht zur Verfügung stehen würde... aber es scheint ja auch noch andere Unterschiede zu geben...
Was kann man da machen??? Kann man dieses Problem irgendwie umgehen???
vielen Dank schonmal...
Posted 20 September 2005 - 07:41
Posted 20 September 2005 - 09:43
leider ist das glaube ich nicht möglich, da die Pakete über Softwareverteilung unattended und im Silent-Modus ablaufen... und ich glaube nicht das die, die das verteilen nur wegen meinem Paket auf allen Rechnern den msiexec-Service ändern - das wäre doch nötig (oder habe ich da was falsch verstanden?)...
Gibts da nicht irgendetwas was ich tun kann?? Das muß doch ein allgemeines Problem sein?
Vielen Dank schonmal!
Edited by herrbecht, 20 September 2005 - 09:44.
Posted 20 September 2005 - 10:12
Also es gibt da ja noch diese Möglichkeit mit dem RegEintrag, soll aber auch nicht gerade die Lobenswerte alternative sein.
Edited by ali, 20 September 2005 - 10:13.
Posted 20 September 2005 - 14:01
Ich habe etwas im InstallShield-Forum gestöbert und bin auf dieses Topic gestoßen...
Ist zwar nicht genau mein Problem, dort funktioniert das Skript nicht bei SYSTEM-Rechten aber bei Admin.... -> bei mir funktioniert das Skript zwar (keine Fehlermeldung im Log) aber msiGetProperty/msisetProperty funktionieren NICHT.
Leider ist ohne diese Befehle der Einsatz von Skript in den meisten Fällen sinnlos...oder gibt es noch einen anderen Methode im InstallShield-Script auf MSI-Properties zuzugreifen...
Das ist doch ein Bug oder???? irgendwie muß das doch funktionieren... :
Bin für jede Hilfe dankbar...
Edited by herrbecht, 20 September 2005 - 14:54.
Posted 20 September 2005 - 18:45
Sind diese Properties unter SecureCustomProperties aufgelistet? D.h. hast du ein Property angelegt mit Namen SecureCustomProperties und Wert DATADIR ?
Stefan Krüger
InstallSite.org twitter facebook
Posted 05 October 2005 - 15:52
VB-Script habe ich noch nicht ausprobiert, weil es eigentlich keine Option für mich ist, weil ich kein vb kann.
Die Properties waren bislang nicht unter SecureCustomProperties aufgelistet! Ich habe jetzt mal die Variablen, die ich benutzen will bei der Eigenschaft SecureCustomProperties eingetragen (INSTALLDIR,REGINSTALLDIR,DATADIR,REGDATADIR). Hat leider auch nicht funktioniert die Werte waren wieder leer!! Allerdings waren jetzt die Variablen sowohl in der Property-Tabelle definiert als auch unter der Eigenschaft SecureCustomProperties aufgelistet, also ungefähr so (Beispiel):
CODE |
Name Wert ------------------------------+------------------------------------------ DATADIR | D:\Daten\Asw32 REGDATADIR | SecureCustomProperties | NEWPRODUCTFOUND,DATADIR,REGDATADIR |
ist das richtig so?
hmm ich weiß echt nicht weiter... leider muß ich das Problem aber irgendwie lösen...
Bitte helft mir!
Edited by herrbecht, 05 October 2005 - 15:55.
Posted 06 October 2005 - 11:57
Stefan Krüger
InstallSite.org twitter facebook