* added some comments

* added settings for registry key that enables the installation mode to be set to the mode from a previous installation
* fixed a few typos

git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@5498 212acab6-be3b-0410-9dea-997c60f758d6
This commit is contained in:
joostverburg 2008-01-28 21:46:31 +00:00
parent bce63d6a98
commit 48b9003ca1
2 changed files with 236 additions and 149 deletions

View file

@ -13,6 +13,8 @@ Copyright
!verbose push !verbose push
!verbose 3 !verbose 3
;Standard NSIS header files
!ifdef MULTIUSER_MUI !ifdef MULTIUSER_MUI
!include MUI2.nsh !include MUI2.nsh
!endif !endif
@ -21,9 +23,13 @@ Copyright
!include WinVer.nsh !include WinVer.nsh
!include FileFunc.nsh !include FileFunc.nsh
;Variables
Var MultiUser.Privileges Var MultiUser.Privileges
Var MultiUser.InstallMode Var MultiUser.InstallMode
;Command line installation mode setting
!ifdef MULTIUSER_INSTALLMODE_COMMANDLINE !ifdef MULTIUSER_INSTALLMODE_COMMANDLINE
!insertmacro GetParameters !insertmacro GetParameters
!ifndef MULTIUSER_NOUNINSTALLER !ifndef MULTIUSER_NOUNINSTALLER
@ -39,10 +45,18 @@ Var MultiUser.InstallMode
Var MultiUser.Result Var MultiUser.Result
!endif !endif
;Installation folder stored in registry
!ifdef MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_KEY & MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_VALUENAME !ifdef MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_KEY & MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_VALUENAME
Var MultiUser.InstDir Var MultiUser.InstDir
!endif !endif
!ifdef MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_KEY & MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_VALUENAME
Var MultiUser.DefaultKeyValue
!endif
;Windows Vista UAC setting
!if "${MULTIUSER_EXECUTIONLEVEL}" == Admin !if "${MULTIUSER_EXECUTIONLEVEL}" == Admin
RequestExecutionLevel admin RequestExecutionLevel admin
!define MULTIUSER_EXECUTIONLEVEL_ALLUSERS !define MULTIUSER_EXECUTIONLEVEL_ALLUSERS
@ -64,6 +78,8 @@ Install modes
!macro MULTIUSER_INSTALLMODE_ALLUSERS UNINSTALLER_PREFIX UNINSTALLER_FUNCPREFIX !macro MULTIUSER_INSTALLMODE_ALLUSERS UNINSTALLER_PREFIX UNINSTALLER_FUNCPREFIX
;Install mode initialization - per-machine
${ifnot} ${IsNT} ${ifnot} ${IsNT}
${orif} $MultiUser.Privileges == "Admin" ${orif} $MultiUser.Privileges == "Admin"
${orif} $MultiUser.Privileges == "Power" ${orif} $MultiUser.Privileges == "Power"
@ -78,7 +94,7 @@ Install modes
!ifdef MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_KEY & MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_VALUENAME !ifdef MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_KEY & MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_VALUENAME
ReadRegStr $MultiUser.InstDir SHELL_CONTEXT "${MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_KEY}" "${MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_VALUENAME}" ReadRegStr $MultiUser.InstDir HKLM "${MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_KEY}" "${MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_VALUENAME}"
${if} $MultiUser.InstDir != "" ${if} $MultiUser.InstDir != ""
StrCpy $INSTDIR $MultiUser.InstDir StrCpy $INSTDIR $MultiUser.InstDir
@ -96,6 +112,8 @@ Install modes
!macro MULTIUSER_INSTALLMODE_CURRENTUSER UNINSTALLER_PREFIX UNINSTALLER_FUNCPREFIX !macro MULTIUSER_INSTALLMODE_CURRENTUSER UNINSTALLER_PREFIX UNINSTALLER_FUNCPREFIX
;Install mode initialization - per-user
${if} ${IsNT} ${if} ${IsNT}
StrCpy $MultiUser.InstallMode CurrentUser StrCpy $MultiUser.InstallMode CurrentUser
@ -112,7 +130,7 @@ Install modes
!ifdef MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_KEY & MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_VALUENAME !ifdef MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_KEY & MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_VALUENAME
ReadRegStr $MultiUser.InstDir SHELL_CONTEXT "${MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_KEY}" "${MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_VALUENAME}" ReadRegStr $MultiUser.InstDir HKCU "${MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_KEY}" "${MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_VALUENAME}"
${if} $MultiUser.InstDir != "" ${if} $MultiUser.InstDir != ""
StrCpy $INSTDIR $MultiUser.InstDir StrCpy $INSTDIR $MultiUser.InstDir
@ -182,6 +200,8 @@ Installer/uninstaller initialization
!macro MULTIUSER_INIT_CHECKS UNINSTALLER_PREFIX UNINSTALLER_FUNCPREFIX !macro MULTIUSER_INIT_CHECKS UNINSTALLER_PREFIX UNINSTALLER_FUNCPREFIX
;Installer initialization - check privileges and set install mode
!insertmacro MULTIUSER_INIT_TEXTS !insertmacro MULTIUSER_INIT_TEXTS
UserInfo::GetAccountType UserInfo::GetAccountType
@ -189,6 +209,8 @@ Installer/uninstaller initialization
${if} ${IsNT} ${if} ${IsNT}
;Check privileges
!if "${MULTIUSER_EXECUTIONLEVEL}" == Admin !if "${MULTIUSER_EXECUTIONLEVEL}" == Admin
${if} $MultiUser.Privileges != "Admin" ${if} $MultiUser.Privileges != "Admin"
@ -212,6 +234,8 @@ Installer/uninstaller initialization
!ifdef MULTIUSER_EXECUTIONLEVEL_ALLUSERS !ifdef MULTIUSER_EXECUTIONLEVEL_ALLUSERS
;Default to per-machine installation if possible
${if} $MultiUser.Privileges == "Admin" ${if} $MultiUser.Privileges == "Admin"
${orif} $MultiUser.Privileges == "Power" ${orif} $MultiUser.Privileges == "Power"
!ifndef MULTIUSER_INSTALLMODE_DEFAULT_CURRENTUSER !ifndef MULTIUSER_INSTALLMODE_DEFAULT_CURRENTUSER
@ -219,6 +243,31 @@ Installer/uninstaller initialization
!else !else
Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.CurrentUser Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.CurrentUser
!endif !endif
!ifdef MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_KEY & MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_VALUENAME
;Set installation mode to setting from a previous installation
!ifndef MULTIUSER_INSTALLMODE_DEFAULT_CURRENTUSER
ReadRegStr $MultiUser.DefaultKeyValue HKLM "${MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_KEY}" "${MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_VALUENAME}"
${if} $MultiUser.DefaultKeyValue == ""
ReadRegStr $MultiUser.DefaultKeyValue HKCU "${MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_KEY}" "${MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_VALUENAME}"
${if} $MultiUser.DefaultKeyValue != ""
Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.AllUsers
${endif}
${endif}
!else
ReadRegStr $MultiUser.DefaultKeyValue HKCU "${MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_KEY}" "${MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_VALUENAME}"
${if} $MultiUser.DefaultKeyValue == ""
ReadRegStr $MultiUser.DefaultKeyValue HKLM "${MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_KEY}" "${MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_VALUENAME}"
${if} $MultiUser.DefaultKeyValue != ""
Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.CurrentUser
${endif}
${endif}
!endif
!endif
${else} ${else}
Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.CurrentUser Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.CurrentUser
${endif} ${endif}
@ -231,6 +280,8 @@ Installer/uninstaller initialization
!ifdef MULTIUSER_INSTALLMODE_COMMANDLINE !ifdef MULTIUSER_INSTALLMODE_COMMANDLINE
;Check for install mode setting on command line
${${UNINSTALLER_FUNCPREFIX}GetParameters} $MultiUser.Parameters ${${UNINSTALLER_FUNCPREFIX}GetParameters} $MultiUser.Parameters
${${UNINSTALLER_PREFIX}StrStr} $MultiUser.Result $MultiUser.Parameters "/CurrentUser" ${${UNINSTALLER_PREFIX}StrStr} $MultiUser.Result $MultiUser.Parameters "/CurrentUser"
@ -254,6 +305,8 @@ Installer/uninstaller initialization
${else} ${else}
;Not running Windows NT, per-user installation not supported
Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.AllUsers Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.AllUsers
${endif} ${endif}
@ -333,6 +386,8 @@ Modern UI 2 page
!macro MULTIUSER_PAGE_INSTALLMODE !macro MULTIUSER_PAGE_INSTALLMODE
;Modern UI page for install mode
!verbose push !verbose push
!verbose 3 !verbose 3
@ -349,6 +404,8 @@ Modern UI 2 page
!macro MULTIUSER_FUNCTION_INSTALLMODEPAGE PRE LEAVE !macro MULTIUSER_FUNCTION_INSTALLMODEPAGE PRE LEAVE
;Page functions of Modern UI page
Function "${PRE}" Function "${PRE}"
${ifnot} ${IsNT} ${ifnot} ${IsNT}

View file

@ -145,7 +145,7 @@ FunctionEnd</pre>
have the required privileges. After the macros are inserted, the variable $MultiUser.Privileges have the required privileges. After the macros are inserted, the variable $MultiUser.Privileges
will contain the current execution level (Admin, Power, User or Guest).</p> will contain the current execution level (Admin, Power, User or Guest).</p>
<p> <p>
The following additonal settings are available to customize the initialization:</p> The following additional settings are available to customize the initialization:</p>
<table> <table>
<tr> <tr>
<td> <td>
@ -185,7 +185,8 @@ FunctionEnd</pre>
MULTIUSER_INIT_UNFUNCTIONQUIT MULTIUSER_INIT_UNFUNCTIONQUIT
</td> </td>
<td> <td>
A custom fuction to be called when the installer is closed due to insufficient privileges. A custom function to be called when the installer is closed due to insufficient
privileges.
</td> </td>
</tr> </tr>
</table> </table>
@ -202,27 +203,56 @@ FunctionEnd</pre>
if Administrator or Power User rights are available (this is always the case if if Administrator or Power User rights are available (this is always the case if
the execution level is set to Admin or Power, if Highest is set it depends on the the execution level is set to Admin or Power, if Highest is set it depends on the
user account). For the Standard execution level the installation will always be user account). For the Standard execution level the installation will always be
for a single user. If you prefer the default to be a per-user installation even for a single user. On Windows 95/98/Me installation for a single user is not possible.</p>
though the rights for a per-machine installation are available, define MULTIUSER_INSTALLMODE_DEFAULT_CURRENTUSER
before including User.nsh. On Windows 95/98/Me installation for a single user is
not possible.</p>
<p>
After initialization, the variable $MultiUser.InstallMode will contain the current installation
mode (AllUsers or CurrentUser).
</p>
<h3>
<a name="step-show"></a>Mixed-Mode Installation</h3>
<p> <p>
For the Admin and Power levels, both a per-machine as well as a per-user installation The following settings are available to change the default installation mode:
is possible. If the Highest level is set and the user is an Administrator or Power <table>
User, both options are also available.</p> <tr>
<p> <td>
Usually it's a good thing to give the user to choice between these options. For <b>Setting</b>
users of the Modern UI version 2, a page is provided that asks the user for the </td>
installation mode. To use this page, define MULTIUSER_MUI before including User.nsh. <td>
Then, the MULTIUSER_PAGE_INSTALLMODE macro can be used just like a normal Modern <b>Description</b>
UI page (this page will automatically be skipped when running Windows 95/98/Me):</p> </td>
<pre>!define MULTIUSER_EXECUTIONLEVEL Highest </td>
</tr>
<tr>
<td>
MULTIUSER_INSTALLMODE_DEFAULT_CURRENTUSER
</td>
<td>
Set default to a per-user installation, even if the rights for a per-machine installation
are available.
</td>
</tr>
<tr>
<td>
MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_KEY MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_VALUENAME
</td>
<td>
Non-empty registry key that is created during the installation in either HKCU or
HKLM. The default installation mode will automatically be set to the previously
selected mode depending on the location of the key.
</td>
</tr>
</table>
<p>
After initialization, the variable $MultiUser.InstallMode will contain the current
installation mode (AllUsers or CurrentUser).
</p>
<h3>
Mixed-Mode Installation</h3>
<p>
For the Admin and Power levels, both a per-machine as well as a per-user installation
is possible. If the Highest level is set and the user is an Administrator or Power
User, both options are also available.</p>
<p>
Usually it's a good thing to give the user to choice between these options. For
users of the Modern UI version 2, a page is provided that asks the user for the
installation mode. To use this page, define MULTIUSER_MUI before including User.nsh.
Then, the MULTIUSER_PAGE_INSTALLMODE macro can be used just like a normal Modern
UI page (this page will automatically be skipped when running Windows 95/98/Me):</p>
<pre>!define MULTIUSER_EXECUTIONLEVEL Highest
<b>!define MULTIUSER_MUI</b> <b>!define MULTIUSER_MUI</b>
!define MULTIUSER_INSTALLMODE_COMMANDLINE !define MULTIUSER_INSTALLMODE_COMMANDLINE
!include MultiUser.nsh !include MultiUser.nsh
@ -244,131 +274,131 @@ Function un.onInit
!insertmacro MULTIUSER_UNINIT !insertmacro MULTIUSER_UNINIT
FunctionEnd FunctionEnd
</pre> </pre>
<p> <p>
The MULTIUSER_INSTALLMODE_COMMANDLINE setting that also appears in this example The MULTIUSER_INSTALLMODE_COMMANDLINE setting that also appears in this example
enables the installation mode to be set using the /AllUsers or /CurrentUser command enables the installation mode to be set using the /AllUsers or /CurrentUser command
line parameters. This is especially useful for silent setup.</p> line parameters. This is especially useful for silent setup.</p>
<p> <p>
The following settings can be used to customize the texts on the page (in addition The following settings can be used to customize the texts on the page (in addition
to the general Modern UI page settings):</p> to the general Modern UI page settings):</p>
<table> <table>
<tr> <tr>
<td>
<b>Setting</b>
</td>
<td>
<b>Description</b>
</td>
</tr>
<tr>
<td>
MULTIUSER_INSTALLMODEPAGE_TEXT_TOP
</td>
<td>
Text to display on the top of the page.
</td>
</tr>
<tr>
<td>
MULTIUSER_INSTALLMODEPAGE_TEXT_ALLUSERS
</td>
<td>
Text to display on the combo button for a per-machine installation.
</td>
</tr>
<tr>
<td>
MULTIUSER_INSTALLMODEPAGE_TEXT_CURRENTUSER
</td>
<td>
Text to display on the combo button for a per-user installation.
</td>
</tr>
</table>
<h3>
Installation Mode Initalization</h3>
<p>
The SetShellVarContext flag (which determines the folders for e.g. shortcuts, like
$DESKTOP) is automatically set depending on the installation mode. In addition,
the following settings can be used to perform additional actions when the installation
mode is initialized:</p>
<table>
<tr>
<td>
<b>Setting</b>
</td>
<td>
<b>Description</b>
</td>
</td>
</tr>
<tr>
<td>
MULTIUSER_INSTALLMODE_INSTDIR
</td>
<td>
Name of the folder in which to install the application, without a path. This folder
will be located in Program Files for a per-machine installation and in the local
Application Data folder for a per-user installation (if supported).
</td>
</tr>
<tr>
<td>
MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_KEY MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_VALUENAME
</td>
<td>
Registry key from which to obtain a previously stored installation folder. It will
be retrieved from HKCU for per-user and HKLM for per-machine.
</td>
</tr>
<tr>
<td>
MULTIUSER_INSTALLMODE_FUNCTION<br />
MULTIUSER_INSTALLMODE_UNFUNCTION
</td>
<td>
A custom fuction to be called during the initialization of the installation mode
to set additional installer settings that depend on the mode
</td>
</table>
<p>
To set the installation mode manually, call one of these four functions:</p>
<table>
<tr>
<td>
<b>Function name</b>
</td>
<td>
<b>Installation mode</b>
</td>
</tr>
<tr>
<td>
MultiUser.InstallMode.AllUsers
</td>
<td>
Installer: Per-machine installation
</td>
</tr>
<tr>
<td>
MultiUser.InstallMode.CurrentUser
<td> <td>
Installer: Per-user installation <b>Setting</b>
</td> </td>
</tr> <td>
<tr> <b>Description</b>
<td>
un.MultiUser.InstallMode.AllUsers<td>
Uninstaller: Per-machine installation
</td> </td>
</tr> </tr>
<tr> <tr>
<td> <td>
un.MultiUser.InstallMode.CurrentUser<td> MULTIUSER_INSTALLMODEPAGE_TEXT_TOP
Uninstaller: Per-user installation
</td> </td>
</tr> <td>
</table> Text to display on the top of the page.
</td>
</tr>
<tr>
<td>
MULTIUSER_INSTALLMODEPAGE_TEXT_ALLUSERS
</td>
<td>
Text to display on the combo button for a per-machine installation.
</td>
</tr>
<tr>
<td>
MULTIUSER_INSTALLMODEPAGE_TEXT_CURRENTUSER
</td>
<td>
Text to display on the combo button for a per-user installation.
</td>
</tr>
</table>
<h3>
Installation Mode Initalization</h3>
<p>
The SetShellVarContext flag (which determines the folders for e.g. shortcuts, like
$DESKTOP) is automatically set depending on the installation mode. In addition,
the following settings can be used to perform additional actions when the installation
mode is initialized:</p>
<table>
<tr>
<td>
<b>Setting</b>
</td>
<td>
<b>Description</b>
</td>
</td>
</tr>
<tr>
<td>
MULTIUSER_INSTALLMODE_INSTDIR
</td>
<td>
Name of the folder in which to install the application, without a path. This folder
will be located in Program Files for a per-machine installation and in the local
Application Data folder for a per-user installation (if supported).
</td>
</tr>
<tr>
<td>
MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_KEY MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_VALUENAME
</td>
<td>
Registry key from which to obtain a previously stored installation folder. It will
be retrieved from HKCU for per-user and HKLM for per-machine.
</td>
</tr>
<tr>
<td>
MULTIUSER_INSTALLMODE_FUNCTION<br />
MULTIUSER_INSTALLMODE_UNFUNCTION
</td>
<td>
A custom fuction to be called during the initialization of the installation mode
to set additional installer settings that depend on the mode
</td>
</table>
<p>
To set the installation mode manually, call one of these four functions:</p>
<table>
<tr>
<td>
<b>Function name</b>
</td>
<td>
<b>Installation mode</b>
</td>
</tr>
<tr>
<td>
MultiUser.InstallMode.AllUsers
</td>
<td>
Installer: Per-machine installation
</td>
</tr>
<tr>
<td>
MultiUser.InstallMode.CurrentUser
<td>
Installer: Per-user installation
</td>
</tr>
<tr>
<td>
un.MultiUser.InstallMode.AllUsers<td>
Uninstaller: Per-machine installation
</td>
</tr>
<tr>
<td>
un.MultiUser.InstallMode.CurrentUser<td>
Uninstaller: Per-user installation
</td>
</tr>
</table>
</body> </body>
</html> </html>