Jump to content


This is a ready-only archive of the InstallSite Forum. You cannot post any new content here. / Dies ist ein Archiv des InstallSite Forums. Hier können keine neuen Beiträge veröffentlicht werden.
Photo

msiGetProperty funktioniert nicht bei Skript-CA!


15 replies to this topic

herrbecht

herrbecht
  • Full Members
  • 59 posts

Posted 15 September 2005 - 16:38

Hallo

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.


ali

ali
  • Full Members
  • 1,008 posts

Posted 16 September 2005 - 08:32

was mir auffällt, ist das du für den String die selben Namen verwendest wie für die öffentliche Property in die du den Reg Wert einliest. So sieht es jedenfalls aus. Weiß nicht ob das funktioniert, ich mache es anders. Versuche mal die Werte klein zu schreiben, also:

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);


herrbecht

herrbecht
  • Full Members
  • 59 posts

Posted 16 September 2005 - 14:25

Vielen Dank für die Antwort !!!

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.


ali

ali
  • Full Members
  • 1,008 posts

Posted 16 September 2005 - 14:43

hm, welcher VErsion der 3.1 hast du den drauf, v1 oder v2 oder die die jetzt gerade neu eingestellt wurde?

herrbecht

herrbecht
  • Full Members
  • 59 posts

Posted 19 September 2005 - 10:31

Ich hab mal in der Log-Datei nachgeschaut:

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.


ali

ali
  • Full Members
  • 1,008 posts

Posted 19 September 2005 - 10:59

kann schon sein. Da du die 2er Engine auf dem Rechner hast, gehe ich mal davon aus, da du ME hast. Das Verteilsystem könnte 2000 oder XP sein. Jetzt könnte es sein das du die Scripte evtl an einer falschen Stelle ausführts, zu früh zb. hast du schon mal versucht etwas in den Sequenzen zu machen?
Habe sonst auch keine Idee. Hast du keine Testrechner wo du mal unter 2000 mit MSI 3.1 testen kannst?

Stefan Krueger

Stefan Krueger

    InstallSite.org

  • Administrators
  • 13,269 posts

Posted 19 September 2005 - 12:38

Da es eine Unicode-Version ist denke ich nicht, dass er Win98 hat, sondern ein Mitglied der NT Familie.
Allerdings sollte beim Deployment via Active Directory der Verteilungsrechner und der Zielrechner möglichst die gleiche Version verwenden.

ali

ali
  • Full Members
  • 1,008 posts

Posted 19 September 2005 - 15:22

ups, hab ich ned gesehen. ja, dann kannst du doch den Rechner mal auf MSI3.1 hochziehen, testen und staunen.

Edited by ali, 19 September 2005 - 15:24.


herrbecht

herrbecht
  • Full Members
  • 59 posts

Posted 19 September 2005 - 15:52

Vielen Dank für die Antwort!

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...




ali

ali
  • Full Members
  • 1,008 posts

Posted 20 September 2005 - 07:41

unter Verwaltung -> Dienste dem Windows Instellerdienst einen Admin Account Zuteilen. Das muss nicht unbedingt der Benutzer Administrator sein, sondern ein Benutzer mit Admin Rechten, der speziell dafür angelegt wurde.

herrbecht

herrbecht
  • Full Members
  • 59 posts

Posted 20 September 2005 - 09:43

Danke für die Antwort!!

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.


ali

ali
  • Full Members
  • 1,008 posts

Posted 20 September 2005 - 10:12

sorry, da fällt mir jetzt auch nix zu ein. Hast du auch mal ins Microsoft Forum unter "Windows Installer" gepostet, vielleicht weiss da jemand rat. Evtl.haben da andere welche auch das Problem.

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.


herrbecht

herrbecht
  • Full Members
  • 59 posts

Posted 20 September 2005 - 14:01

Hmmm...

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.


Stefan Krueger

Stefan Krueger

    InstallSite.org

  • Administrators
  • 13,269 posts

Posted 20 September 2005 - 18:45

Funktioniert das Ganze denn in einem VBScript?
Sind diese Properties unter SecureCustomProperties aufgelistet? D.h. hast du ein Property angelegt mit Namen SecureCustomProperties und Wert DATADIR ?

herrbecht

herrbecht
  • Full Members
  • 59 posts

Posted 05 October 2005 - 15:52

Vielen Dank für die Antwort!!!

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.


Stefan Krueger

Stefan Krueger

    InstallSite.org

  • Administrators
  • 13,269 posts

Posted 06 October 2005 - 11:57

Schau dir noch mal genau die Log-Datei (mit MSI 3.1 erzeugt) an. Dort eingetragen, wann immer sich der Wert eiens Properties ändert (bei MSI 2 steht nur drin, welchen Wert das Property am Ende der Instalaltion hat). Vielleicht kommst du der Sache so auf die Spur.