home *** CD-ROM | disk | FTP | other *** search
/ Hackers Magazine 57 / CdHackersMagazineNr57.iso / Software / Programming / nsis-2.46-setup.exe / Include / MultiUser.nsh < prev    next >
Encoding:
Text File  |  2009-02-01  |  13.0 KB  |  470 lines

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