home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 March / PCWMAR09.iso / Software / Freeware / NSIS 2.41 / nsis-2.41-setup.exe / Include / MultiUser.nsh < prev    next >
Encoding:
Text File  |  2008-05-28  |  13.2 KB  |  474 lines

  1. /*
  2.  
  3. MultiUser.nsh
  4.  
  5. Installer configuration for multi-user Windows environments
  6.  
  7. Copyright ⌐ 2008 Joost Verburg
  8.  
  9. */
  10.  
  11. !ifndef MULTIUSER_INCLUDED
  12. !define MULTIUSER_INCLUDED
  13. !verbose push
  14. !verbose 3
  15.  
  16. ;Standard NSIS header files
  17.  
  18. !ifdef MULTIUSER_MUI
  19.   !include MUI2.nsh
  20. !endif
  21. !include nsDialogs.nsh
  22. !include LogicLib.nsh
  23. !include WinVer.nsh
  24. !include FileFunc.nsh
  25.  
  26. ;Variables
  27.  
  28. Var MultiUser.Privileges
  29. Var MultiUser.InstallMode
  30.  
  31. ;Command line installation mode setting
  32.  
  33. !ifdef MULTIUSER_INSTALLMODE_COMMANDLINE
  34.   !insertmacro GetParameters
  35.   !ifndef MULTIUSER_NOUNINSTALL
  36.     !insertmacro un.GetParameters
  37.   !endif
  38.   !include StrFunc.nsh
  39.   !ifndef StrStr_INCLUDED
  40.     ${StrStr}
  41.   !endif
  42.   !ifndef MULTIUSER_NOUNINSTALL
  43.     !ifndef UnStrStr_INCLUDED
  44.       ${UnStrStr}
  45.     !endif
  46.   !endif
  47.   
  48.   Var MultiUser.Parameters
  49.   Var MultiUser.Result
  50. !endif
  51.  
  52. ;Installation folder stored in registry
  53.  
  54. !ifdef MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_KEY & MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_VALUENAME
  55.   Var MultiUser.InstDir
  56. !endif
  57.  
  58. !ifdef MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_KEY & MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_VALUENAME
  59.   Var MultiUser.DefaultKeyValue
  60. !endif
  61.  
  62. ;Windows Vista UAC setting
  63.  
  64. !if "${MULTIUSER_EXECUTIONLEVEL}" == Admin
  65.   RequestExecutionLevel admin
  66.   !define MULTIUSER_EXECUTIONLEVEL_ALLUSERS
  67. !else if "${MULTIUSER_EXECUTIONLEVEL}" == Power
  68.   RequestExecutionLevel admin
  69.   !define MULTIUSER_EXECUTIONLEVEL_ALLUSERS
  70. !else if "${MULTIUSER_EXECUTIONLEVEL}" == Highest
  71.   RequestExecutionLevel highest
  72.   !define MULTIUSER_EXECUTIONLEVEL_ALLUSERS
  73. !else
  74.   RequestExecutionLevel user
  75. !endif
  76.  
  77. /*
  78.  
  79. Install modes
  80.  
  81. */
  82.  
  83. !macro MULTIUSER_INSTALLMODE_ALLUSERS UNINSTALLER_PREFIX UNINSTALLER_FUNCPREFIX
  84.  
  85.   ;Install mode initialization - per-machine
  86.  
  87.   ${ifnot} ${IsNT}
  88.     ${orif} $MultiUser.Privileges == "Admin"
  89.     ${orif} $MultiUser.Privileges == "Power"
  90.   
  91.     StrCpy $MultiUser.InstallMode AllUsers
  92.   
  93.     SetShellVarContext all
  94.   
  95.     !if "${UNINSTALLER_PREFIX}" != UN
  96.       ;Set default installation location for installer
  97.       !ifdef MULTIUSER_INSTALLMODE_INSTDIR
  98.         StrCpy $INSTDIR "$PROGRAMFILES\${MULTIUSER_INSTALLMODE_INSTDIR}"
  99.       !endif
  100.     !endif
  101.   
  102.     !ifdef MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_KEY & MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_VALUENAME
  103.   
  104.       ReadRegStr $MultiUser.InstDir HKLM "${MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_KEY}" "${MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_VALUENAME}"
  105.   
  106.       ${if} $MultiUser.InstDir != ""
  107.         StrCpy $INSTDIR $MultiUser.InstDir
  108.       ${endif}
  109.   
  110.     !endif
  111.   
  112.     !ifdef MULTIUSER_INSTALLMODE_${UNINSTALLER_PREFIX}FUNCTION
  113.       Call "${MULTIUSER_INSTALLMODE_${UNINSTALLER_PREFIX}FUNCTION}"
  114.     !endif
  115.     
  116.   ${endif}
  117.  
  118. !macroend
  119.  
  120. !macro MULTIUSER_INSTALLMODE_CURRENTUSER UNINSTALLER_PREFIX UNINSTALLER_FUNCPREFIX
  121.  
  122.   ;Install mode initialization - per-user
  123.   
  124.   ${if} ${IsNT}  
  125.   
  126.     StrCpy $MultiUser.InstallMode CurrentUser
  127.     
  128.     SetShellVarContext current
  129.   
  130.     !if "${UNINSTALLER_PREFIX}" != UN
  131.       ;Set default installation location for installer  
  132.       !ifdef MULTIUSER_INSTALLMODE_INSTDIR
  133.         ${if} ${AtLeastWin2000}
  134.           StrCpy $INSTDIR "$LOCALAPPDATA\${MULTIUSER_INSTALLMODE_INSTDIR}"
  135.         ${else}
  136.           StrCpy $INSTDIR "$PROGRAMFILES\${MULTIUSER_INSTALLMODE_INSTDIR}"
  137.         ${endif}
  138.       !endif
  139.     !endif
  140.   
  141.     !ifdef MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_KEY & MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_VALUENAME
  142.   
  143.       ReadRegStr $MultiUser.InstDir HKCU "${MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_KEY}" "${MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_VALUENAME}"
  144.   
  145.       ${if} $MultiUser.InstDir != ""
  146.         StrCpy $INSTDIR $MultiUser.InstDir
  147.       ${endif}
  148.   
  149.     !endif
  150.   
  151.     !ifdef MULTIUSER_INSTALLMODE_${UNINSTALLER_PREFIX}FUNCTION
  152.       Call "${MULTIUSER_INSTALLMODE_${UNINSTALLER_PREFIX}FUNCTION}"
  153.     !endif
  154.   
  155.   ${endif}
  156.  
  157. !macroend
  158.  
  159. Function MultiUser.InstallMode.AllUsers
  160.   !insertmacro MULTIUSER_INSTALLMODE_ALLUSERS "" ""
  161. FunctionEnd
  162.  
  163. Function MultiUser.InstallMode.CurrentUser
  164.   !insertmacro MULTIUSER_INSTALLMODE_CURRENTUSER "" ""
  165. FunctionEnd
  166.  
  167. !ifndef MULTIUSER_NOUNINSTALL
  168.  
  169. Function un.MultiUser.InstallMode.AllUsers
  170.   !insertmacro MULTIUSER_INSTALLMODE_ALLUSERS UN .un
  171. FunctionEnd
  172.  
  173. Function un.MultiUser.InstallMode.CurrentUser
  174.   !insertmacro MULTIUSER_INSTALLMODE_CURRENTUSER UN .un
  175. FunctionEnd
  176.  
  177. !endif
  178.  
  179. /*
  180.  
  181. Installer/uninstaller initialization
  182.  
  183. */
  184.  
  185. !macro MULTIUSER_INIT_QUIT UNINSTALLER_FUNCPREFIX
  186.  
  187.   !ifdef MULTIUSER_INIT_${UNINSTALLER_FUNCPREFIX}FUNCTIONQUIT
  188.     Call "${MULTIUSER_INIT_${UNINSTALLER_FUNCPREFIX}FUCTIONQUIT}
  189.   !else
  190.     Quit
  191.   !endif
  192.  
  193. !macroend
  194.  
  195. !macro MULTIUSER_INIT_TEXTS
  196.  
  197.   !ifndef MULTIUSER_INIT_TEXT_ADMINREQUIRED
  198.     !define MULTIUSER_INIT_TEXT_ADMINREQUIRED "$(^Caption) requires administrator priviledges."
  199.   !endif
  200.  
  201.   !ifndef MULTIUSER_INIT_TEXT_POWERREQUIRED
  202.     !define MULTIUSER_INIT_TEXT_POWERREQUIRED "$(^Caption) requires at least Power User priviledges."
  203.   !endif
  204.  
  205.   !ifndef MULTIUSER_INIT_TEXT_ALLUSERSNOTPOSSIBLE
  206.     !define MULTIUSER_INIT_TEXT_ALLUSERSNOTPOSSIBLE "Your user account does not have sufficient privileges to install $(^Name) for all users of this compuetr."
  207.   !endif
  208.  
  209. !macroend
  210.  
  211. !macro MULTIUSER_INIT_CHECKS UNINSTALLER_PREFIX UNINSTALLER_FUNCPREFIX
  212.  
  213.   ;Installer initialization - check privileges and set install mode
  214.  
  215.   !insertmacro MULTIUSER_INIT_TEXTS
  216.  
  217.   UserInfo::GetAccountType
  218.   Pop $MultiUser.Privileges
  219.   
  220.   ${if} ${IsNT}
  221.   
  222.     ;Check privileges
  223.   
  224.     !if "${MULTIUSER_EXECUTIONLEVEL}" == Admin
  225.   
  226.       ${if} $MultiUser.Privileges != "Admin"
  227.         MessageBox MB_OK|MB_ICONSTOP "${MULTIUSER_INIT_TEXT_ADMINREQUIRED}"
  228.         !insertmacro MULTIUSER_INIT_QUIT "${UNINSTALLER_FUNCPREFIX}"
  229.       ${endif}
  230.   
  231.     !else if "${MULTIUSER_EXECUTIONLEVEL}" == Power
  232.   
  233.       ${if} $MultiUser.Privileges != "Power"
  234.         ${andif} $MultiUser.Privileges != "Admin"
  235.         ${if} ${AtMostWinXP}
  236.            MessageBox MB_OK|MB_ICONSTOP "${MULTIUSER_INIT_TEXT_POWERREQUIRED}"
  237.         ${else}
  238.            MessageBox MB_OK|MB_ICONSTOP "${MULTIUSER_INIT_TEXT_ADMINREQUIRED}"
  239.         ${endif}        
  240.         !insertmacro MULTIUSER_INIT_QUIT "${UNINSTALLER_FUNCPREFIX}"
  241.       ${endif}
  242.   
  243.     !endif
  244.     
  245.     !ifdef MULTIUSER_EXECUTIONLEVEL_ALLUSERS
  246.     
  247.       ;Default to per-machine installation if possible
  248.     
  249.       ${if} $MultiUser.Privileges == "Admin"
  250.         ${orif} $MultiUser.Privileges == "Power"
  251.         !ifndef MULTIUSER_INSTALLMODE_DEFAULT_CURRENTUSER
  252.           Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.AllUsers
  253.         !else
  254.           Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.CurrentUser
  255.         !endif
  256.  
  257.         !ifdef MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_KEY & MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_VALUENAME
  258.  
  259.           ;Set installation mode to setting from a previous installation
  260.  
  261.           !ifndef MULTIUSER_INSTALLMODE_DEFAULT_CURRENTUSER
  262.             ReadRegStr $MultiUser.DefaultKeyValue HKLM "${MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_KEY}" "${MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_VALUENAME}"
  263.             ${if} $MultiUser.DefaultKeyValue == ""
  264.               ReadRegStr $MultiUser.DefaultKeyValue HKCU "${MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_KEY}" "${MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_VALUENAME}"
  265.               ${if} $MultiUser.DefaultKeyValue != ""
  266.                 Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.CurrentUser
  267.               ${endif}
  268.             ${endif}
  269.           !else
  270.             ReadRegStr $MultiUser.DefaultKeyValue HKCU "${MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_KEY}" "${MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_VALUENAME}"
  271.             ${if} $MultiUser.DefaultKeyValue == ""
  272.               ReadRegStr $MultiUser.DefaultKeyValue HKLM "${MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_KEY}" "${MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_VALUENAME}"
  273.               ${if} $MultiUser.DefaultKeyValue != ""
  274.                 Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.AllUsers
  275.               ${endif}
  276.             ${endif}
  277.           !endif
  278.  
  279.         !endif
  280.  
  281.       ${else}
  282.         Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.CurrentUser
  283.       ${endif}
  284.     
  285.     !else
  286.  
  287.       Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.CurrentUser
  288.  
  289.     !endif  
  290.   
  291.     !ifdef MULTIUSER_INSTALLMODE_COMMANDLINE
  292.     
  293.       ;Check for install mode setting on command line
  294.  
  295.       ${${UNINSTALLER_FUNCPREFIX}GetParameters} $MultiUser.Parameters
  296.   
  297.       ${${UNINSTALLER_PREFIX}StrStr} $MultiUser.Result $MultiUser.Parameters "/CurrentUser"    
  298.     
  299.       ${if} $MultiUser.Result != ""
  300.         Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.CurrentUser
  301.       ${endif}    
  302.   
  303.       ${${UNINSTALLER_PREFIX}StrStr} $MultiUser.Result $MultiUser.Parameters "/AllUsers"    
  304.     
  305.       ${if} $MultiUser.Result != ""
  306.         ${if} $MultiUser.Privileges == "Admin"
  307.           ${orif} $MultiUser.Privileges == "Power"
  308.           Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.AllUsers
  309.         ${else}
  310.           MessageBox MB_OK|MB_ICONSTOP "${MULTIUSER_INIT_TEXT_ALLUSERSNOTPOSSIBLE}"
  311.         ${endif}
  312.       ${endif}
  313.   
  314.     !endif
  315.     
  316.   ${else}
  317.   
  318.     ;Not running Windows NT, per-user installation not supported
  319.     
  320.     Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.AllUsers
  321.   
  322.   ${endif}
  323.  
  324. !macroend
  325.  
  326. !macro MULTIUSER_INIT
  327.   !verbose push
  328.   !verbose 3
  329.   
  330.   !insertmacro MULTIUSER_INIT_CHECKS "" ""
  331.   
  332.   !verbose pop 
  333. !macroend
  334.  
  335. !ifndef MULTIUSER_NOUNINSTALL
  336.  
  337. !macro MULTIUSER_UNINIT
  338.   !verbose push
  339.   !verbose 3
  340.   
  341.   !insertmacro MULTIUSER_INIT_CHECKS Un un.
  342.   
  343.   !verbose pop 
  344. !macroend
  345.  
  346. !endif
  347.  
  348. /*
  349.  
  350. Modern UI 2 page
  351.  
  352. */
  353.  
  354. !ifdef MULTIUSER_MUI
  355.  
  356. !macro MULTIUSER_INSTALLMODEPAGE_INTERFACE
  357.  
  358.   !ifndef MULTIUSER_INSTALLMODEPAGE_INTERFACE
  359.     !define MULTIUSER_INSTALLMODEPAGE_INTERFACE
  360.     Var MultiUser.InstallModePage
  361.     
  362.     Var MultiUser.InstallModePage.Text
  363.     
  364.     Var MultiUser.InstallModePage.AllUsers
  365.     Var MultiUser.InstallModePage.CurrentUser
  366.     
  367.     Var MultiUser.InstallModePage.ReturnValue
  368.   !endif
  369.  
  370. !macroend
  371.  
  372. !macro MULTIUSER_PAGEDECLARATION_INSTALLMODE
  373.  
  374.   !insertmacro MUI_SET MULTIUSER_${MUI_PAGE_UNINSTALLER_PREFIX}INSTALLMODEPAGE ""
  375.   !insertmacro MULTIUSER_INSTALLMODEPAGE_INTERFACE
  376.  
  377.   !insertmacro MUI_DEFAULT MULTIUSER_INSTALLMODEPAGE_TEXT_TOP "$(MULTIUSER_INNERTEXT_INSTALLMODE_TOP)"
  378.   !insertmacro MUI_DEFAULT MULTIUSER_INSTALLMODEPAGE_TEXT_ALLUSERS "$(MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS)"
  379.   !insertmacro MUI_DEFAULT MULTIUSER_INSTALLMODEPAGE_TEXT_CURRENTUSER "$(MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER)"  
  380.  
  381.   PageEx custom
  382.  
  383.     PageCallbacks MultiUser.InstallModePre_${MUI_UNIQUEID} MultiUser.InstallModeLeave_${MUI_UNIQUEID}
  384.  
  385.     Caption " "
  386.  
  387.   PageExEnd
  388.  
  389.   !insertmacro MULTIUSER_FUNCTION_INSTALLMODEPAGE MultiUser.InstallModePre_${MUI_UNIQUEID} MultiUser.InstallModeLeave_${MUI_UNIQUEID}
  390.  
  391.   !undef MULTIUSER_INSTALLMODEPAGE_TEXT_TOP
  392.   !undef MULTIUSER_INSTALLMODEPAGE_TEXT_ALLUSERS
  393.   !undef MULTIUSER_INSTALLMODEPAGE_TEXT_CURRENTUSER
  394.  
  395. !macroend
  396.  
  397. !macro MULTIUSER_PAGE_INSTALLMODE
  398.  
  399.   ;Modern UI page for install mode
  400.  
  401.   !verbose push
  402.   !verbose 3
  403.   
  404.   !ifndef MULTIUSER_EXECUTIONLEVEL_ALLUSERS
  405.     !error "A mixed-mode installation requires MULTIUSER_EXECUTIONLEVEL to be set to Admin, Power or Highest."
  406.   !endif
  407.   
  408.   !insertmacro MUI_PAGE_INIT
  409.   !insertmacro MULTIUSER_PAGEDECLARATION_INSTALLMODE
  410.   
  411.   !verbose pop
  412.  
  413. !macroend
  414.  
  415. !macro MULTIUSER_FUNCTION_INSTALLMODEPAGE PRE LEAVE
  416.  
  417.   ;Page functions of Modern UI page
  418.  
  419.   Function "${PRE}"
  420.   
  421.     ${ifnot} ${IsNT}
  422.       Abort
  423.     ${endif}
  424.   
  425.     ${if} $MultiUser.Privileges != "Power"
  426.       ${andif} $MultiUser.Privileges != "Admin"
  427.       Abort
  428.     ${endif}
  429.     
  430.     !insertmacro MUI_PAGE_FUNCTION_CUSTOM PRE
  431.     !insertmacro MUI_HEADER_TEXT_PAGE $(MULTIUSER_TEXT_INSTALLMODE_TITLE) $(MULTIUSER_TEXT_INSTALLMODE_SUBTITLE)
  432.     
  433.     nsDialogs::Create /NOUNLOAD 1018
  434.     Pop $MultiUser.InstallModePage
  435.  
  436.     ${NSD_CreateLabel} 0u 0u 300u 20u "${MULTIUSER_INSTALLMODEPAGE_TEXT_TOP}"
  437.     Pop $MultiUser.InstallModePage.Text
  438.  
  439.     ${NSD_CreateRadioButton} 20u 50u 280u 10u "${MULTIUSER_INSTALLMODEPAGE_TEXT_ALLUSERS}"
  440.     Pop $MultiUser.InstallModePage.AllUsers
  441.     
  442.     ${NSD_CreateRadioButton} 20u 70u 280u 10u "${MULTIUSER_INSTALLMODEPAGE_TEXT_CURRENTUSER}"
  443.     Pop $MultiUser.InstallModePage.CurrentUser
  444.     
  445.     ${if} $MultiUser.InstallMode == "AllUsers"
  446.       SendMessage $MultiUser.InstallModePage.AllUsers ${BM_SETCHECK} ${BST_CHECKED} 0
  447.     ${else}
  448.       SendMessage $MultiUser.InstallModePage.CurrentUser ${BM_SETCHECK} ${BST_CHECKED} 0
  449.     ${endif}
  450.     
  451.     !insertmacro MUI_PAGE_FUNCTION_CUSTOM SHOW
  452.     nsDialogs::Show
  453.     
  454.   FunctionEnd
  455.  
  456.   Function "${LEAVE}"
  457.      SendMessage $MultiUser.InstallModePage.AllUsers ${BM_GETCHECK} 0 0 $MultiUser.InstallModePage.ReturnValue
  458.      
  459.      ${if} $MultiUser.InstallModePage.ReturnValue = ${BST_CHECKED}
  460.         Call MultiUser.InstallMode.AllUsers
  461.      ${else}
  462.         Call MultiUser.InstallMode.CurrentUser
  463.      ${endif}
  464.   
  465.     !insertmacro MUI_PAGE_FUNCTION_CUSTOM LEAVE
  466.   FunctionEnd
  467.  
  468. !macroend
  469.  
  470. !endif
  471.  
  472. !verbose pop
  473. !endif
  474.