2016-05-04 6 views
0

Hallo Ich Refactoring ein altes Installationsskript und laufen auf das Problem, dass das UAC-Plugin erstellt. Wegen der !insertmacro Init "installer" läuft die .onInit zweimal. Das gleiche gilt für !insertmacro Init "uninstaller" und die un.onInit Funktion.NSIS-Installer .onInit und un.onInit zweimal wegen UAC ausgeführt

Aus diesem Grund werden das Installationsprogramm und das Deinstallationsprogramm zweimal ausgeführt, was nicht das gewünschte Verhalten ist. I have read that the UAC creates an inner process with elevated permissions, die erforderlich ist, da es das Laufwerk C:/ zum Beispiel berührt, aber der äußere Prozess führt auch das Installationsprogramm.

Da das Installationsskript ziemlich lang ist, füge ich nur die .onInit Funktion ein. Das ganze .nsi Skript kann here gefunden werden.

Das Auskommentieren der Zeile mit der !insertmacro stellt sicher, dass die .onInit-Funktion einmal ausgeführt wird, das Installationsprogramm jedoch nicht mehr ausgeführt wird. Wie kann ich also das Installationsprogramm und das Deinstallationsprogramm nur einmal ausführen, mit den richtigen (Admin-) Berechtigungen?

schätze ich jeden Vorschlag oder Antwort :)

Function .onInit 
MessageBox MB_OK "In .onInit" 
    SetShellVarContext all 

    !insertmacro Init "installer" 

    System::Call 'kernel32::CreateMutexA(i 0, i 0, t "Tribler") i .r1 ?e' 

    Pop $R0 
    StrCmp $R0 0 checkinst 

    MessageBox MB_OK "The installer is already running." 
    Abort 

    checkinst: 
    ReadRegStr $R0 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT}" "UninstallString" 
    StrCmp $R0 "" done 
    IfFileExists $R0 showuninstdialog done 

    showuninstdialog: 
    MessageBox MB_OKCANCEL|MB_ICONEXCLAMATION "${PRODUCT} is already installed. $\n$\nClick `OK` to remove the previous version or `Cancel` to cancel this upgrade." /SD IDCANCEL IDOK uninst 
    Abort 

    uninst: 
    ClearErrors 
    ; Laurens (2016-03-29): Retrieve the uninstallString stored in the register. Do NOT use $INSTDIR as this points to the current $INSTDIR var of the INSTALLER, 
    ; which is the default location at this point. 
    ReadRegStr $R0 HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT}" "UninstallString" 
MessageBox MB_OK "$R0" 
    ExecWait '"$R0"' ;Do not copy the uninstaller to a temp file 
    ReadRegStr $R0 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT}" "UninstallString" 
    StrCmp $R0 "" done 
    Abort 
    done: 

FunctionEnd 
+0

Der hier eingegebene .onInit-Code stimmt nicht mit dem Code überein, mit dem Sie verknüpft sind! Der Code, den Sie verlinkt haben, hat ein klares Problem, kann nicht wirklich sagen, ob der hier eingefügte Code ein Problem hat, ohne mich zu testen, aber ich mache das erst, wenn Sie geklärt haben, welchen Code ich testen soll. Einige Informationen über die verwendeten NSIS/UAC-Plug-Ins/Windows-Versionen wären auch nett ... – Anders

+0

@Anders Ich dränge und versuche verschiedene Dinge, während ich das schreibe. Sorry wenn es jetzt anders ist. Betrachten Sie den Code in dem Link den aktuellen Code, den ich ausführe. Außerdem baue ich es auf einem Windows 2008 64 Bit Server und teste den Installationsvorgang auf einem Windows 10 Rechner, ebenfalls 64 Bit. – Gooey

+0

@Anders Ich habe einige meiner experimentellen Änderungen rückgängig gemacht und sie gedrängt. Ich werde es für jetzt nicht tun, da es in der Tat verwirrend ist, wenn Leute es betrachten. – Gooey

Antwort

2

Der Code, den Sie in Verbindung mit (zumindest wenn ich es anschaute) rief sowohl !insertmacro UAC_RunElevated als auch !insertmacro Init "installer" in .onInit an, also kein Wunder, dass es mehrfach lief. Nach dem Anruf !insertmacro UAC_RunElevated müssen Sie immer überprüfen $0, weil Sie je nach Wert aufrufen müssen!

Ich gehe davon aus, dass Init Makro ist etwas, das ich schrieb so sollte es korrekt funktionieren (?);)

Ich persönlich würde empfehlen, dass Sie den Lauf Checkbox auf der Abschlussseite zu opfern und dann haben Sie wahrscheinlich nicht zu Verwenden Sie das UAC-Plug-in überhaupt ...

+0

Vielen Dank für Ihre Antwort Anders, ich hatte den UAC_RunElevated als Test eingefügt, um zu sehen, ob das erste, was ich tue, zusätzliche Berechtigungen erhält, vielleicht könnte ich einen Check hinzufügen, um nach Parametern zu suchen, wie ich @idleberg erwähnt habe . Unglücklicherweise macht es nur das! Insertmakro Init "installer" dort auch zweimal laufen. – Gooey

+0

Ich werde überprüfen, ob ich es ohne das UAC-Plugin tun kann, wie Sie vorgeschlagen, danke bis jetzt für Ihre Hilfe und Beratung :) – Gooey

+0

Ich entfernte es, refaktorierte die Datei hier und da und es läuft prächtig. Vielen Dank! – Gooey

1

Soweit ich mich erinnere, die UAC-Plugin das Installationsprogramm mit einem speziellen Parameter neu gestartet. Sie können für die Check-in Ihrem .onInit mit GetParameters und GetOptions, zeigen dann eine Meldung bedingt:

# get all commandline parameters 
${GetParameters} $0 

# parse specific option 
${GetOptions} $0 "/UAC:" $1 

# do stuff 
IfErrors 0 +2 
MessageBox MB_OK "No admint" IDOK +2 
MessageBox MB_OK "Admin" 

Ich persönlich LogicLib für den letzten Teil verwenden würde:

# do stuff 
${If} $1 == "" 
    MessageBox MB_OK "Not admin" 
${Else} 
MessageBox MB_OK "Admin" 
${Endif} 
+0

Danke für Ihren Vorschlag. Ich habe Ihre vorgeschlagenen Zeilen hinzugefügt und es zeigt mir einen leeren Dialog auf dem ersten Lauf und '/ UAC: /NCRC' auf dem zweiten Lauf nach dem erhöhten Erlaubnisdialog. Es klingt also so, als ob ich den letzteren Fall haben möchte, gibt es eine Möglichkeit dies zu überprüfen? – Gooey

+0

Suche nach/UAC: ist nicht die richtige Option. – Anders

Verwandte Themen