MultiUser.nsh 13 KB

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