NASMMultiUser.nsh 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479
  1. /*
  2. MultiUser.nsh
  3. Installer configuration for multi-user Windows environments
  4. Copyright 2008-2009 Joost Verburg
  5. Updated 2016 by H. Peter Anvin to handle 64-bit Windows
  6. */
  7. !ifndef MULTIUSER_INCLUDED
  8. !define MULTIUSER_INCLUDED
  9. !verbose push
  10. !verbose 3
  11. ;Standard NSIS header files
  12. !ifdef MULTIUSER_MUI
  13. !include MUI2.nsh
  14. !endif
  15. !include nsDialogs.nsh
  16. !include LogicLib.nsh
  17. !include WinVer.nsh
  18. !include FileFunc.nsh
  19. ;Variables
  20. Var MultiUser.Privileges
  21. Var MultiUser.InstallMode
  22. ;Command line installation mode setting
  23. !ifdef MULTIUSER_INSTALLMODE_COMMANDLINE
  24. !include StrFunc.nsh
  25. !ifndef StrStr_INCLUDED
  26. ${StrStr}
  27. !endif
  28. !ifndef MULTIUSER_NOUNINSTALL
  29. !ifndef UnStrStr_INCLUDED
  30. ${UnStrStr}
  31. !endif
  32. !endif
  33. Var MultiUser.Parameters
  34. Var MultiUser.Result
  35. !endif
  36. ;Installation folder stored in registry
  37. !ifdef MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_KEY & MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_VALUENAME
  38. Var MultiUser.InstDir
  39. !endif
  40. !ifdef MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_KEY & MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_VALUENAME
  41. Var MultiUser.DefaultKeyValue
  42. !endif
  43. ;Windows Vista UAC setting
  44. !if "${MULTIUSER_EXECUTIONLEVEL}" == Admin
  45. RequestExecutionLevel admin
  46. !define MULTIUSER_EXECUTIONLEVEL_ALLUSERS
  47. !else if "${MULTIUSER_EXECUTIONLEVEL}" == Power
  48. RequestExecutionLevel admin
  49. !define MULTIUSER_EXECUTIONLEVEL_ALLUSERS
  50. !else if "${MULTIUSER_EXECUTIONLEVEL}" == Highest
  51. RequestExecutionLevel highest
  52. !define MULTIUSER_EXECUTIONLEVEL_ALLUSERS
  53. !else
  54. RequestExecutionLevel user
  55. !endif
  56. /*
  57. Install modes
  58. */
  59. !macro MULTIUSER_INSTALLMODE_ALLUSERS UNINSTALLER_PREFIX UNINSTALLER_FUNCPREFIX
  60. ;Install mode initialization - per-machine
  61. ${ifnot} ${IsNT}
  62. ${orif} $MultiUser.Privileges == "Admin"
  63. ${orif} $MultiUser.Privileges == "Power"
  64. StrCpy $MultiUser.InstallMode AllUsers
  65. SetShellVarContext all
  66. !if "${UNINSTALLER_PREFIX}" != UN
  67. ;Set default installation location for installer
  68. !ifdef MULTIUSER_INSTALLMODE_INSTDIR
  69. StrCpy $INSTDIR "${GLOBALINSTDIR}\${MULTIUSER_INSTALLMODE_INSTDIR}"
  70. !endif
  71. !endif
  72. !ifdef MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_KEY & MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_VALUENAME
  73. ReadRegStr $MultiUser.InstDir HKLM "${MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_KEY}" "${MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_VALUENAME}"
  74. ${if} $MultiUser.InstDir != ""
  75. StrCpy $INSTDIR $MultiUser.InstDir
  76. ${endif}
  77. !endif
  78. !ifdef MULTIUSER_INSTALLMODE_${UNINSTALLER_PREFIX}FUNCTION
  79. Call "${MULTIUSER_INSTALLMODE_${UNINSTALLER_PREFIX}FUNCTION}"
  80. !endif
  81. ${endif}
  82. !macroend
  83. !macro MULTIUSER_INSTALLMODE_CURRENTUSER UNINSTALLER_PREFIX UNINSTALLER_FUNCPREFIX
  84. ;Install mode initialization - per-user
  85. ${if} ${IsNT}
  86. StrCpy $MultiUser.InstallMode CurrentUser
  87. SetShellVarContext current
  88. !if "${UNINSTALLER_PREFIX}" != UN
  89. ;Set default installation location for installer
  90. !ifdef MULTIUSER_INSTALLMODE_INSTDIR
  91. ${if} ${AtLeastWin2000}
  92. StrCpy $INSTDIR "$LOCALAPPDATA\bin\${MULTIUSER_INSTALLMODE_INSTDIR}"
  93. ${else}
  94. StrCpy $INSTDIR "${GLOBALINSTDIR}\${MULTIUSER_INSTALLMODE_INSTDIR}"
  95. ${endif}
  96. !endif
  97. !endif
  98. !ifdef MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_KEY & MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_VALUENAME
  99. ReadRegStr $MultiUser.InstDir HKCU "${MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_KEY}" "${MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_VALUENAME}"
  100. ${if} $MultiUser.InstDir != ""
  101. StrCpy $INSTDIR $MultiUser.InstDir
  102. ${endif}
  103. !endif
  104. !ifdef MULTIUSER_INSTALLMODE_${UNINSTALLER_PREFIX}FUNCTION
  105. Call "${MULTIUSER_INSTALLMODE_${UNINSTALLER_PREFIX}FUNCTION}"
  106. !endif
  107. ${endif}
  108. !macroend
  109. Function MultiUser.InstallMode.AllUsers
  110. !insertmacro MULTIUSER_INSTALLMODE_ALLUSERS "" ""
  111. FunctionEnd
  112. Function MultiUser.InstallMode.CurrentUser
  113. !insertmacro MULTIUSER_INSTALLMODE_CURRENTUSER "" ""
  114. FunctionEnd
  115. !ifndef MULTIUSER_NOUNINSTALL
  116. Function un.MultiUser.InstallMode.AllUsers
  117. !insertmacro MULTIUSER_INSTALLMODE_ALLUSERS UN .un
  118. FunctionEnd
  119. Function un.MultiUser.InstallMode.CurrentUser
  120. !insertmacro MULTIUSER_INSTALLMODE_CURRENTUSER UN .un
  121. FunctionEnd
  122. !endif
  123. /*
  124. Installer/uninstaller initialization
  125. */
  126. !macro MULTIUSER_INIT_QUIT UNINSTALLER_FUNCPREFIX
  127. !ifdef MULTIUSER_INIT_${UNINSTALLER_FUNCPREFIX}FUNCTIONQUIT
  128. Call "${MULTIUSER_INIT_${UNINSTALLER_FUNCPREFIX}FUCTIONQUIT}
  129. !else
  130. Quit
  131. !endif
  132. !macroend
  133. !macro MULTIUSER_INIT_TEXTS
  134. !ifndef MULTIUSER_INIT_TEXT_ADMINREQUIRED
  135. !define MULTIUSER_INIT_TEXT_ADMINREQUIRED "$(^Caption) requires Administrator priviledges."
  136. !endif
  137. !ifndef MULTIUSER_INIT_TEXT_POWERREQUIRED
  138. !define MULTIUSER_INIT_TEXT_POWERREQUIRED "$(^Caption) requires at least Power User priviledges."
  139. !endif
  140. !ifndef MULTIUSER_INIT_TEXT_ALLUSERSNOTPOSSIBLE
  141. !define MULTIUSER_INIT_TEXT_ALLUSERSNOTPOSSIBLE "Your user account does not have sufficient privileges to install $(^Name) for all users of this compuetr."
  142. !endif
  143. !macroend
  144. !macro MULTIUSER_INIT_CHECKS UNINSTALLER_PREFIX UNINSTALLER_FUNCPREFIX
  145. ;Installer initialization - check privileges and set install mode
  146. !insertmacro MULTIUSER_INIT_TEXTS
  147. UserInfo::GetAccountType
  148. Pop $MultiUser.Privileges
  149. ${if} ${IsNT}
  150. ;Check privileges
  151. !if "${MULTIUSER_EXECUTIONLEVEL}" == Admin
  152. ${if} $MultiUser.Privileges != "Admin"
  153. MessageBox MB_OK|MB_ICONSTOP "${MULTIUSER_INIT_TEXT_ADMINREQUIRED}"
  154. !insertmacro MULTIUSER_INIT_QUIT "${UNINSTALLER_FUNCPREFIX}"
  155. ${endif}
  156. !else if "${MULTIUSER_EXECUTIONLEVEL}" == Power
  157. ${if} $MultiUser.Privileges != "Power"
  158. ${andif} $MultiUser.Privileges != "Admin"
  159. ${if} ${AtMostWinXP}
  160. MessageBox MB_OK|MB_ICONSTOP "${MULTIUSER_INIT_TEXT_POWERREQUIRED}"
  161. ${else}
  162. MessageBox MB_OK|MB_ICONSTOP "${MULTIUSER_INIT_TEXT_ADMINREQUIRED}"
  163. ${endif}
  164. !insertmacro MULTIUSER_INIT_QUIT "${UNINSTALLER_FUNCPREFIX}"
  165. ${endif}
  166. !endif
  167. !ifdef MULTIUSER_EXECUTIONLEVEL_ALLUSERS
  168. ;Default to per-machine installation if possible
  169. ${if} $MultiUser.Privileges == "Admin"
  170. ${orif} $MultiUser.Privileges == "Power"
  171. !ifndef MULTIUSER_INSTALLMODE_DEFAULT_CURRENTUSER
  172. Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.AllUsers
  173. !else
  174. Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.CurrentUser
  175. !endif
  176. !ifdef MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_KEY & MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_VALUENAME
  177. ;Set installation mode to setting from a previous installation
  178. !ifndef MULTIUSER_INSTALLMODE_DEFAULT_CURRENTUSER
  179. ReadRegStr $MultiUser.DefaultKeyValue HKLM "${MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_KEY}" "${MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_VALUENAME}"
  180. ${if} $MultiUser.DefaultKeyValue == ""
  181. ReadRegStr $MultiUser.DefaultKeyValue HKCU "${MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_KEY}" "${MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_VALUENAME}"
  182. ${if} $MultiUser.DefaultKeyValue != ""
  183. Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.CurrentUser
  184. ${endif}
  185. ${endif}
  186. !else
  187. ReadRegStr $MultiUser.DefaultKeyValue HKCU "${MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_KEY}" "${MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_VALUENAME}"
  188. ${if} $MultiUser.DefaultKeyValue == ""
  189. ReadRegStr $MultiUser.DefaultKeyValue HKLM "${MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_KEY}" "${MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_VALUENAME}"
  190. ${if} $MultiUser.DefaultKeyValue != ""
  191. Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.AllUsers
  192. ${endif}
  193. ${endif}
  194. !endif
  195. !endif
  196. ${else}
  197. Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.CurrentUser
  198. ${endif}
  199. !else
  200. Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.CurrentUser
  201. !endif
  202. !ifdef MULTIUSER_INSTALLMODE_COMMANDLINE
  203. ;Check for install mode setting on command line
  204. ${${UNINSTALLER_FUNCPREFIX}GetParameters} $MultiUser.Parameters
  205. ${${UNINSTALLER_PREFIX}StrStr} $MultiUser.Result $MultiUser.Parameters "/CurrentUser"
  206. ${if} $MultiUser.Result != ""
  207. Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.CurrentUser
  208. ${endif}
  209. ${${UNINSTALLER_PREFIX}StrStr} $MultiUser.Result $MultiUser.Parameters "/AllUsers"
  210. ${if} $MultiUser.Result != ""
  211. ${if} $MultiUser.Privileges == "Admin"
  212. ${orif} $MultiUser.Privileges == "Power"
  213. Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.AllUsers
  214. ${else}
  215. MessageBox MB_OK|MB_ICONSTOP "${MULTIUSER_INIT_TEXT_ALLUSERSNOTPOSSIBLE}"
  216. ${endif}
  217. ${endif}
  218. !endif
  219. ${else}
  220. ;Not running Windows NT, per-user installation not supported
  221. Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.AllUsers
  222. ${endif}
  223. !macroend
  224. !macro MULTIUSER_INIT
  225. !verbose push
  226. !verbose 3
  227. !insertmacro MULTIUSER_INIT_CHECKS "" ""
  228. !verbose pop
  229. !macroend
  230. !ifndef MULTIUSER_NOUNINSTALL
  231. !macro MULTIUSER_UNINIT
  232. !verbose push
  233. !verbose 3
  234. !insertmacro MULTIUSER_INIT_CHECKS Un un.
  235. !verbose pop
  236. !macroend
  237. !endif
  238. /*
  239. Modern UI 2 page
  240. */
  241. !ifdef MULTIUSER_MUI
  242. !macro MULTIUSER_INSTALLMODEPAGE_INTERFACE
  243. !ifndef MULTIUSER_INSTALLMODEPAGE_INTERFACE
  244. !define MULTIUSER_INSTALLMODEPAGE_INTERFACE
  245. Var MultiUser.InstallModePage
  246. Var MultiUser.InstallModePage.Text
  247. Var MultiUser.InstallModePage.AllUsers
  248. Var MultiUser.InstallModePage.CurrentUser
  249. Var MultiUser.InstallModePage.ReturnValue
  250. !endif
  251. !macroend
  252. !macro MULTIUSER_PAGEDECLARATION_INSTALLMODE
  253. !insertmacro MUI_SET MULTIUSER_${MUI_PAGE_UNINSTALLER_PREFIX}INSTALLMODEPAGE ""
  254. !insertmacro MULTIUSER_INSTALLMODEPAGE_INTERFACE
  255. !insertmacro MUI_DEFAULT MULTIUSER_INSTALLMODEPAGE_TEXT_TOP "$(MULTIUSER_INNERTEXT_INSTALLMODE_TOP)"
  256. !insertmacro MUI_DEFAULT MULTIUSER_INSTALLMODEPAGE_TEXT_ALLUSERS "$(MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS)"
  257. !insertmacro MUI_DEFAULT MULTIUSER_INSTALLMODEPAGE_TEXT_CURRENTUSER "$(MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER)"
  258. PageEx custom
  259. PageCallbacks MultiUser.InstallModePre_${MUI_UNIQUEID} MultiUser.InstallModeLeave_${MUI_UNIQUEID}
  260. Caption " "
  261. PageExEnd
  262. !insertmacro MULTIUSER_FUNCTION_INSTALLMODEPAGE MultiUser.InstallModePre_${MUI_UNIQUEID} MultiUser.InstallModeLeave_${MUI_UNIQUEID}
  263. !undef MULTIUSER_INSTALLMODEPAGE_TEXT_TOP
  264. !undef MULTIUSER_INSTALLMODEPAGE_TEXT_ALLUSERS
  265. !undef MULTIUSER_INSTALLMODEPAGE_TEXT_CURRENTUSER
  266. !macroend
  267. !macro MULTIUSER_PAGE_INSTALLMODE
  268. ;Modern UI page for install mode
  269. !verbose push
  270. !verbose 3
  271. !ifndef MULTIUSER_EXECUTIONLEVEL_ALLUSERS
  272. !error "A mixed-mode installation requires MULTIUSER_EXECUTIONLEVEL to be set to Admin, Power or Highest."
  273. !endif
  274. !insertmacro MUI_PAGE_INIT
  275. !insertmacro MULTIUSER_PAGEDECLARATION_INSTALLMODE
  276. !verbose pop
  277. !macroend
  278. !macro MULTIUSER_FUNCTION_INSTALLMODEPAGE PRE LEAVE
  279. !ifndef MULTIUSER_TEXT_NOTADMIN
  280. !define MULTIUSER_TEXT_NOTADMIN "The installer is currently running as an unprivileged user. It will not be possible to install this software for all users on the system. Cancel and re-run the installer as Administrator to install system-wide."
  281. !endif
  282. ;Page functions of Modern UI page
  283. Function "${PRE}"
  284. ${ifnot} ${IsNT}
  285. Abort
  286. ${endif}
  287. ${if} $MultiUser.Privileges != "Power"
  288. ${andif} $MultiUser.Privileges != "Admin"
  289. MessageBox MB_OKCANCEL "${MULTIUSER_TEXT_NOTADMIN}" /SD IDOK IDABORT nofun
  290. Abort
  291. nofun:
  292. Quit
  293. ${endif}
  294. !insertmacro MUI_PAGE_FUNCTION_CUSTOM PRE
  295. !insertmacro MUI_HEADER_TEXT_PAGE $(MULTIUSER_TEXT_INSTALLMODE_TITLE) $(MULTIUSER_TEXT_INSTALLMODE_SUBTITLE)
  296. nsDialogs::Create 1018
  297. Pop $MultiUser.InstallModePage
  298. ${NSD_CreateLabel} 0u 0u 300u 20u "${MULTIUSER_INSTALLMODEPAGE_TEXT_TOP}"
  299. Pop $MultiUser.InstallModePage.Text
  300. ${NSD_CreateRadioButton} 20u 50u 280u 10u "${MULTIUSER_INSTALLMODEPAGE_TEXT_ALLUSERS}"
  301. Pop $MultiUser.InstallModePage.AllUsers
  302. ${NSD_CreateRadioButton} 20u 70u 280u 10u "${MULTIUSER_INSTALLMODEPAGE_TEXT_CURRENTUSER}"
  303. Pop $MultiUser.InstallModePage.CurrentUser
  304. ${if} $MultiUser.InstallMode == "AllUsers"
  305. SendMessage $MultiUser.InstallModePage.AllUsers ${BM_SETCHECK} ${BST_CHECKED} 0
  306. ${else}
  307. SendMessage $MultiUser.InstallModePage.CurrentUser ${BM_SETCHECK} ${BST_CHECKED} 0
  308. ${endif}
  309. !insertmacro MUI_PAGE_FUNCTION_CUSTOM SHOW
  310. nsDialogs::Show
  311. FunctionEnd
  312. Function "${LEAVE}"
  313. SendMessage $MultiUser.InstallModePage.AllUsers ${BM_GETCHECK} 0 0 $MultiUser.InstallModePage.ReturnValue
  314. ${if} $MultiUser.InstallModePage.ReturnValue = ${BST_CHECKED}
  315. Call MultiUser.InstallMode.AllUsers
  316. ${else}
  317. Call MultiUser.InstallMode.CurrentUser
  318. ${endif}
  319. !insertmacro MUI_PAGE_FUNCTION_CUSTOM LEAVE
  320. FunctionEnd
  321. !macroend
  322. !endif
  323. !verbose pop
  324. !endif