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