123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230 |
- !include nsDialogs.nsh
- Var HasTwoAvailableOptions
- Var RadioButtonLabel1
- Var isForceMachineInstall
- Var isForceCurrentInstall
- !macro PAGE_INSTALL_MODE
- !insertmacro MUI_PAGE_INIT
- !insertmacro MUI_SET MULTIUSER_${MUI_PAGE_UNINSTALLER_PREFIX}INSTALLMODEPAGE ""
- Var MultiUser.InstallModePage
- Var MultiUser.InstallModePage.Text
- Var MultiUser.InstallModePage.AllUsers
- Var MultiUser.InstallModePage.CurrentUser
- Var MultiUser.InstallModePage.ReturnValue
- !ifndef BUILD_UNINSTALLER
- !insertmacro FUNCTION_INSTALL_MODE_PAGE_FUNCTION MultiUser.InstallModePre_${MUI_UNIQUEID} MultiUser.InstallModeLeave_${MUI_UNIQUEID} ""
- PageEx custom
- PageCallbacks MultiUser.InstallModePre_${MUI_UNIQUEID} MultiUser.InstallModeLeave_${MUI_UNIQUEID}
- Caption " "
- PageExEnd
- !else
- !insertmacro FUNCTION_INSTALL_MODE_PAGE_FUNCTION MultiUser.InstallModePre_${MUI_UNIQUEID} MultiUser.InstallModeLeave_${MUI_UNIQUEID} un.
- UninstPage custom un.multiUser.InstallModePre_${MUI_UNIQUEID} un.MultiUser.InstallModeLeave_${MUI_UNIQUEID}
- !endif
- !macroend
- !macro FUNCTION_INSTALL_MODE_PAGE_FUNCTION PRE LEAVE UNINSTALLER_FUNCPREFIX
- Function "${UNINSTALLER_FUNCPREFIX}${PRE}"
- ${if} ${UAC_IsInnerInstance}
- ${andIf} ${UAC_IsAdmin}
- # inner Process (and Admin) - skip selection, inner process is always used for elevation (machine-wide)
- !insertmacro setInstallModePerAllUsers
- Abort
- ${endIf}
- StrCpy $isForceMachineInstall "0"
- StrCpy $isForceCurrentInstall "0"
- !ifmacrodef customInstallmode
- !insertmacro customInstallMode
- !endif
- ${if} $isForceMachineInstall == "1"
- ${OrIf} ${isForAllUsers}
- StrCpy $hasPerMachineInstallation "1"
- StrCpy $hasPerUserInstallation "0"
- ${ifNot} ${UAC_IsAdmin}
- ShowWindow $HWNDPARENT ${SW_HIDE}
- !insertmacro UAC_RunElevated
- Quit
- ${endIf}
- !insertmacro setInstallModePerAllUsers
- Abort
- ${endIf}
- ${if} $isForceCurrentInstall == "1"
- ${OrIf} ${isForCurrentUser}
- StrCpy $hasPerMachineInstallation "0"
- StrCpy $hasPerUserInstallation "1"
- !insertmacro setInstallModePerUser
- Abort
- ${endIf}
- # If uninstalling, will check if there is both a per-user and per-machine installation. If there is only one, will skip the form.
- # If uninstallation was invoked from the "add/remove programs" Windows will automatically requests elevation (depending if uninstall keys are in HKLM or HKCU)
- # so (for uninstallation) just checking UAC_IsAdmin would probably be enought to determine if it's a per-user or per-machine. However, user can run the uninstall.exe from the folder itself
- !ifdef BUILD_UNINSTALLER
- ${if} $hasPerUserInstallation == "1"
- ${andif} $hasPerMachineInstallation == "0"
- !insertmacro setInstallModePerUser
- Abort
- ${elseIf} $hasPerUserInstallation == "0"
- ${andIf} $hasPerMachineInstallation == "1"
- ${IfNot} ${UAC_IsAdmin}
- ShowWindow $HWNDPARENT ${SW_HIDE}
- !insertmacro UAC_RunElevated
- Quit
- ${endIf}
- !insertmacro setInstallModePerAllUsers
- Abort
- ${endIf}
- !insertmacro MUI_HEADER_TEXT "$(chooseUninstallationOptions)" "$(whichInstallationShouldBeRemoved)"
- !else
- !insertmacro MUI_HEADER_TEXT "$(chooseInstallationOptions)" "$(whoShouldThisApplicationBeInstalledFor)"
- !endif
- !insertmacro MUI_PAGE_FUNCTION_CUSTOM PRE
- nsDialogs::Create 1018
- Pop $MultiUser.InstallModePage
- !ifndef BUILD_UNINSTALLER
- ${NSD_CreateLabel} 0u 0u 300u 20u "$(selectUserMode)"
- StrCpy $8 "$(forAll)"
- StrCpy $9 "$(onlyForMe)"
- !else
- ${NSD_CreateLabel} 0u 0u 300u 20u "$(whichInstallationRemove)"
- StrCpy $8 "$(forAll)"
- StrCpy $9 "$(onlyForMe)"
- !endif
- Pop $MultiUser.InstallModePage.Text
- ${NSD_CreateRadioButton} 10u 30u 280u 20u "$8"
- Pop $MultiUser.InstallModePage.AllUsers
- ${IfNot} ${UAC_IsAdmin}
- !ifdef MULTIUSER_INSTALLMODE_ALLOW_ELEVATION
- StrCpy $HasTwoAvailableOptions 1
- !else
- # since radio button is disabled, we add that comment to the disabled control itself
- SendMessage $MultiUser.InstallModePage.AllUsers ${WM_SETTEXT} 0 "STR:$8 (must run as admin)"
- EnableWindow $MultiUser.InstallModePage.AllUsers 0 # start out disabled
- StrCpy $HasTwoAvailableOptions 0
- !endif
- ${else}
- StrCpy $HasTwoAvailableOptions 1
- ${endif}
- System::Call "advapi32::GetUserName(t.r0,*i${NSIS_MAX_STRLEN})i"
- ${NSD_CreateRadioButton} 10u 50u 280u 20u "$9 ($0)"
- Pop $MultiUser.InstallModePage.CurrentUser
- nsDialogs::SetUserData $MultiUser.InstallModePage.AllUsers 1 ; Install for All Users (1, pra exibir o icone SHIELD de elevation)
- nsDialogs::SetUserData $MultiUser.InstallModePage.CurrentUser 0 ; Install for Single User (0 pra não exibir)
- ${if} $HasTwoAvailableOptions == "1" ; if there are 2 available options, bind to radiobutton change
- ${NSD_OnClick} $MultiUser.InstallModePage.CurrentUser ${UNINSTALLER_FUNCPREFIX}InstModeChange
- ${NSD_OnClick} $MultiUser.InstallModePage.AllUsers ${UNINSTALLER_FUNCPREFIX}InstModeChange
- ${endif}
- ${NSD_CreateLabel} 0u 110u 280u 50u ""
- Pop $RadioButtonLabel1
- ${if} $installMode == "all"
- SendMessage $MultiUser.InstallModePage.AllUsers ${BM_SETCHECK} ${BST_CHECKED} 0 ; set as default
- SendMessage $MultiUser.InstallModePage.AllUsers ${BM_CLICK} 0 0 ; trigger click event
- ${else}
- SendMessage $MultiUser.InstallModePage.CurrentUser ${BM_SETCHECK} ${BST_CHECKED} 0 ; set as default
- SendMessage $MultiUser.InstallModePage.CurrentUser ${BM_CLICK} 0 0 ; trigger click event
- ${endif}
- !insertmacro MUI_PAGE_FUNCTION_CUSTOM SHOW
- nsDialogs::Show
- FunctionEnd
- Function "${UNINSTALLER_FUNCPREFIX}${LEAVE}"
- SendMessage $MultiUser.InstallModePage.AllUsers ${BM_GETCHECK} 0 0 $MultiUser.InstallModePage.ReturnValue
- ${if} $MultiUser.InstallModePage.ReturnValue = ${BST_CHECKED}
- ${IfNot} ${UAC_IsAdmin}
- ShowWindow $HWNDPARENT ${SW_HIDE}
- !insertmacro UAC_RunElevated
- ${Switch} $0
- ${Case} 0
- ${If} $1 = 1
- Quit ;we are the outer process, the inner process has done its work (ExitCode is $2), we are done
- ${EndIf}
- ${If} $1 = 3 ;RunAs completed successfully, but with a non-admin user
- ${OrIf} $2 = 0x666666 ;our special return, the new process was not admin after all
- MessageBox mb_IconStop|mb_TopMost|mb_SetForeground "$(loginWithAdminAccount)"
- ${EndIf}
- ${Break}
- ${Case} 1223 ;user aborted
- ;MessageBox mb_IconStop|mb_TopMost|mb_SetForeground "This option requires admin privileges, aborting!"
- ;Quit ; instead of quit just abort going to the next page, and stay in the radiobuttons
- ${Break}
- ${Case} 1062
- MessageBox mb_IconStop|mb_TopMost|mb_SetForeground "Logon service not running, aborting!" ; "Unable to elevate, Secondary Logon service not running!"
- ;Quit ; instead of quit just abort going to the next page, and stay in the radiobuttons
- ${Break}
- ${Default}
- MessageBox mb_IconStop|mb_TopMost|mb_SetForeground "Unable to elevate, error $0"
- ;Quit ; instead of quit just abort going to the next page, and stay in the radiobuttons
- ${Break}
- ${EndSwitch}
- ShowWindow $HWNDPARENT ${SW_SHOW}
- BringToFront
- Abort
- ${else}
- !insertmacro setInstallModePerAllUsers
- ${endif}
- ${else}
- !insertmacro setInstallModePerUser
- ${endif}
- !insertmacro MUI_PAGE_FUNCTION_CUSTOM LEAVE
- FunctionEnd
- Function "${UNINSTALLER_FUNCPREFIX}InstModeChange"
- pop $1
- nsDialogs::GetUserData $1
- pop $1
- GetDlgItem $0 $hwndParent 1 ; get item 1 (next button) at parent window, store in $0 - (0 is back, 1 is next .. what about CANCEL? http://nsis.sourceforge.net/Buttons_Header )
- StrCpy $7 ""
- ${if} "$1" == "0" ; current user
- ${if} $hasPerUserInstallation == "1"
- !ifndef BUILD_UNINSTALLER
- StrCpy $7 "$(perUserInstallExists)($perUserInstallationFolder)$\r$\n$(reinstallUpgrade)"
- !else
- StrCpy $7 "$(perUserInstall)($perUserInstallationFolder)$\r$\n$(uninstall)"
- !endif
- ${else}
- StrCpy $7 "$(freshInstallForCurrent)"
- ${endif}
- SendMessage $0 ${BCM_SETSHIELD} 0 0 ; hide SHIELD
- ${else} ; all users
- ${if} $hasPerMachineInstallation == "1"
- !ifndef BUILD_UNINSTALLER
- StrCpy $7 "$(perMachineInstallExists)($perMachineInstallationFolder)$\r$\n$(reinstallUpgrade)"
- !else
- StrCpy $7 "$(perMachineInstall)($perMachineInstallationFolder)$\r$\n$(uninstall)"
- !endif
- ${else}
- StrCpy $7 "$(freshInstallForAll)"
- ${endif}
- ${ifNot} ${UAC_IsAdmin}
- StrCpy $7 "$7"
- SendMessage $0 ${BCM_SETSHIELD} 0 1 ; display SHIELD
- ${else}
- SendMessage $0 ${BCM_SETSHIELD} 0 0 ; hide SHIELD
- ${endif}
- ${endif}
- SendMessage $RadioButtonLabel1 ${WM_SETTEXT} 0 "STR:$7"
- FunctionEnd
- !macroend
|