diff --git a/Examples/install-per-user.nsi b/Examples/install-per-user.nsi index b152245f..c5dcb7a4 100644 --- a/Examples/install-per-user.nsi +++ b/Examples/install-per-user.nsi @@ -1,168 +1,168 @@ -/* - -This example script installs a simple application for a single user. - -If multiple users on the same machine run this installer, each user -will end up with a separate install that is not affected by -update/removal operations performed by other users. - -Per-user installers should only write to HKCU and -folders inside the users profile. - -*/ - -!define NAME "Per-User example" -!define REGPATH_UNINSTSUBKEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${NAME}" -Name "${NAME}" -OutFile "Install ${NAME}.exe" -Unicode True -RequestExecutionLevel User ; We don't need UAC elevation -InstallDir "" ; Don't set a default $InstDir so we can detect /D= and InstallDirRegKey -InstallDirRegKey HKCU "${REGPATH_UNINSTSUBKEY}" "UninstallString" - -!include LogicLib.nsh -!include WinCore.nsh -!include Integration.nsh - - -Page Directory -Page InstFiles - -Uninstpage UninstConfirm -Uninstpage InstFiles - - -Function .onInit - SetShellVarContext Current - - ${If} $InstDir == "" ; No /D= nor InstallDirRegKey? - GetKnownFolderPath $InstDir ${FOLDERID_UserProgramFiles} ; This folder only exists on Win7+ - StrCmp $InstDir "" 0 +2 - StrCpy $InstDir "$LocalAppData\Programs" ; Fallback directory - - StrCpy $InstDir "$InstDir\$(^Name)" - ${EndIf} -FunctionEnd - -Function un.onInit - SetShellVarContext Current -FunctionEnd - -Section "Program files (Required)" - SectionIn Ro - - SetOutPath $InstDir - WriteUninstaller "$InstDir\Uninst.exe" - WriteRegStr HKCU "${REGPATH_UNINSTSUBKEY}" "DisplayName" "${NAME}" - WriteRegStr HKCU "${REGPATH_UNINSTSUBKEY}" "DisplayIcon" "$InstDir\MyApp.exe,0" - WriteRegStr HKCU "${REGPATH_UNINSTSUBKEY}" "UninstallString" '"$InstDir\Uninst.exe"' - WriteRegDWORD HKCU "${REGPATH_UNINSTSUBKEY}" "NoModify" 1 - WriteRegDWORD HKCU "${REGPATH_UNINSTSUBKEY}" "NoRepair" 1 - - File "/oname=$InstDir\MyApp.exe" "${NSISDIR}\Bin\MakeLangId.exe" ; Pretend that we have a real application to install -SectionEnd - -Section "Start Menu shortcut" - CreateShortcut /NoWorkingDir "$SMPrograms\${NAME}.lnk" "$InstDir\MyApp.exe" -SectionEnd - -/* -This Section registers a fictional .test-nullsoft file extension and the Nullsoft.Test ProgId. -Proprietary file types are encouraged (by Microsoft) to use long file extensions and ProgIds that include the company name. - -When registering with "Open With" your executable should ideally have a somewhat unique name, -otherwise there could be a naming collision with a different application (with the same name) installed on the same machine. - -REGISTER_DEFAULTPROGRAMS is not defined because proprietary file types do not typically use the Default Programs functionality. -If your application registers a standard file type such as .mp3 or .html or a protocol like HTTP it should register as a Default Program. -It should also register as a client (https://docs.microsoft.com/en-us/windows/win32/shell/reg-middleware-apps#common-registration-elements-for-all-client-types). -*/ -!define ASSOC_EXT ".test-nullsoft" -!define ASSOC_PROGID "Nullsoft.Test" -!define ASSOC_VERB "MyApp" -!define ASSOC_APPEXE "MyApp.exe" -Section -ShellAssoc - # Register file type - WriteRegStr ShCtx "Software\Classes\${ASSOC_PROGID}\DefaultIcon" "" "$InstDir\${ASSOC_APPEXE},0" - ;WriteRegStr ShCtx "Software\Classes\${ASSOC_PROGID}\shell\${ASSOC_VERB}" "" "Nullsoft Test App" [Optional] - ;WriteRegStr ShCtx "Software\Classes\${ASSOC_PROGID}\shell\${ASSOC_VERB}" "MUIVerb" "@$InstDir\${ASSOC_APPEXE},-42" ; WinXP+ [Optional] Localizable verb display name - WriteRegStr ShCtx "Software\Classes\${ASSOC_PROGID}\shell\${ASSOC_VERB}\command" "" '"$InstDir\${ASSOC_APPEXE}" "%1"' - WriteRegStr ShCtx "Software\Classes\${ASSOC_EXT}" "" "${ASSOC_PROGID}" - - # Register "Open With" [Optional] - WriteRegNone ShCtx "Software\Classes\${ASSOC_EXT}\OpenWithList" "${ASSOC_APPEXE}" ; Win2000+ [Optional] - ;WriteRegNone ShCtx "Software\Classes\${ASSOC_EXT}\OpenWithProgids" "${ASSOC_PROGID}" ; WinXP+ [Optional] - WriteRegStr ShCtx "Software\Classes\Applications\${ASSOC_APPEXE}\shell\open\command" "" '"$InstDir\${ASSOC_APPEXE}" "%1"' - WriteRegStr ShCtx "Software\Classes\Applications\${ASSOC_APPEXE}" "FriendlyAppName" "Nullsoft Test App" ; [Optional] - WriteRegStr ShCtx "Software\Classes\Applications\${ASSOC_APPEXE}" "ApplicationCompany" "Nullsoft" ; [Optional] - WriteRegNone ShCtx "Software\Classes\Applications\${ASSOC_APPEXE}\SupportedTypes" "${ASSOC_EXT}" ; [Optional] Only allow "Open With" with specific extension(s) on WinXP+ - - # Register "Default Programs" [Optional] - !ifdef REGISTER_DEFAULTPROGRAMS - WriteRegStr ShCtx "Software\Classes\Applications\${ASSOC_APPEXE}\Capabilities" "ApplicationDescription" "Shell association example test application" - WriteRegStr ShCtx "Software\Classes\Applications\${ASSOC_APPEXE}\Capabilities\FileAssociations" "${ASSOC_EXT}" "${ASSOC_PROGID}" - WriteRegStr ShCtx "Software\RegisteredApplications" "Nullsoft Test App" "Software\Classes\Applications\${ASSOC_APPEXE}\Capabilities" - !endif - - ${NotifyShell_AssocChanged} -SectionEnd - - -Section -un.ShellAssoc - # Unregister file type - ClearErrors - DeleteRegKey ShCtx "Software\Classes\${ASSOC_PROGID}\shell\${ASSOC_VERB}" - DeleteRegKey /IfEmpty ShCtx "Software\Classes\${ASSOC_PROGID}\shell" - ${IfNot} ${Errors} - DeleteRegKey ShCtx "Software\Classes\${ASSOC_PROGID}\DefaultIcon" - ${EndIf} - ReadRegStr $0 ShCtx "Software\Classes\${ASSOC_EXT}" "" - DeleteRegKey /IfEmpty ShCtx "Software\Classes\${ASSOC_PROGID}" - ${IfNot} ${Errors} - ${AndIf} $0 == "${ASSOC_PROGID}" - DeleteRegValue ShCtx "Software\Classes\${ASSOC_EXT}" "" - DeleteRegKey /IfEmpty ShCtx "Software\Classes\${ASSOC_EXT}" - ${EndIf} - - # Unregister "Open With" - DeleteRegKey ShCtx "Software\Classes\Applications\${ASSOC_APPEXE}" - DeleteRegValue ShCtx "Software\Classes\${ASSOC_EXT}\OpenWithList" "${ASSOC_APPEXE}" - DeleteRegKey /IfEmpty ShCtx "Software\Classes\${ASSOC_EXT}\OpenWithList" - DeleteRegValue ShCtx "Software\Classes\${ASSOC_EXT}\OpenWithProgids" "${ASSOC_PROGID}" - DeleteRegKey /IfEmpty ShCtx "Software\Classes\${ASSOC_EXT}\OpenWithProgids" - DeleteRegKey /IfEmpty ShCtx "Software\Classes\${ASSOC_EXT}" - - # Unregister "Default Programs" - !ifdef REGISTER_DEFAULTPROGRAMS - DeleteRegValue ShCtx "Software\RegisteredApplications" "Nullsoft Test App" - DeleteRegKey ShCtx "Software\Classes\Applications\${ASSOC_APPEXE}\Capabilities" - DeleteRegKey /IfEmpty ShCtx "Software\Classes\Applications\${ASSOC_APPEXE}" - !endif - - # Attempt to clean up junk left behind by the Windows shell - DeleteRegValue HKCU "Software\Microsoft\Windows\CurrentVersion\Search\JumplistData" "$InstDir\${ASSOC_APPEXE}" - DeleteRegValue HKCU "Software\Classes\Local Settings\Software\Microsoft\Windows\Shell\MuiCache" "$InstDir\${ASSOC_APPEXE}.FriendlyAppName" - DeleteRegValue HKCU "Software\Classes\Local Settings\Software\Microsoft\Windows\Shell\MuiCache" "$InstDir\${ASSOC_APPEXE}.ApplicationCompany" - DeleteRegValue HKCU "Software\Microsoft\Windows\ShellNoRoam\MUICache" "$InstDir\${ASSOC_APPEXE}" ; WinXP - DeleteRegValue HKCU "Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Compatibility Assistant\Store" "$InstDir\${ASSOC_APPEXE}" - DeleteRegValue HKCU "Software\Microsoft\Windows\CurrentVersion\ApplicationAssociationToasts" "${ASSOC_PROGID}_${ASSOC_EXT}" - DeleteRegValue HKCU "Software\Microsoft\Windows\CurrentVersion\ApplicationAssociationToasts" "Applications\${ASSOC_APPEXE}_${ASSOC_EXT}" - DeleteRegValue HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\${ASSOC_EXT}\OpenWithProgids" "${ASSOC_PROGID}" - DeleteRegKey /IfEmpty HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\${ASSOC_EXT}\OpenWithProgids" - DeleteRegKey /IfEmpty HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\${ASSOC_EXT}\OpenWithList" - DeleteRegKey /IfEmpty HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\${ASSOC_EXT}" - ;DeleteRegKey HKCU "Software\Microsoft\Windows\Roaming\OpenWith\FileExts\${ASSOC_EXT}" - ;DeleteRegKey HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\RecentDocs\${ASSOC_EXT}" - - ${NotifyShell_AssocChanged} -SectionEnd - -Section -Uninstall - ${UnpinShortcut} "$SMPrograms\${NAME}.lnk" - Delete "$SMPrograms\${NAME}.lnk" - - Delete "$InstDir\MyApp.exe" - Delete "$InstDir\Uninst.exe" - RMDir "$InstDir" - DeleteRegKey HKCU "${REGPATH_UNINSTSUBKEY}" -SectionEnd +/* + +This example script installs a simple application for a single user. + +If multiple users on the same machine run this installer, each user +will end up with a separate install that is not affected by +update/removal operations performed by other users. + +Per-user installers should only write to HKCU and +folders inside the users profile. + +*/ + +!define NAME "Per-User example" +!define REGPATH_UNINSTSUBKEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${NAME}" +Name "${NAME}" +OutFile "Install ${NAME}.exe" +Unicode True +RequestExecutionLevel User ; We don't need UAC elevation +InstallDir "" ; Don't set a default $InstDir so we can detect /D= and InstallDirRegKey +InstallDirRegKey HKCU "${REGPATH_UNINSTSUBKEY}" "UninstallString" + +!include LogicLib.nsh +!include WinCore.nsh +!include Integration.nsh + + +Page Directory +Page InstFiles + +Uninstpage UninstConfirm +Uninstpage InstFiles + + +Function .onInit + SetShellVarContext Current + + ${If} $InstDir == "" ; No /D= nor InstallDirRegKey? + GetKnownFolderPath $InstDir ${FOLDERID_UserProgramFiles} ; This folder only exists on Win7+ + StrCmp $InstDir "" 0 +2 + StrCpy $InstDir "$LocalAppData\Programs" ; Fallback directory + + StrCpy $InstDir "$InstDir\$(^Name)" + ${EndIf} +FunctionEnd + +Function un.onInit + SetShellVarContext Current +FunctionEnd + +Section "Program files (Required)" + SectionIn Ro + + SetOutPath $InstDir + WriteUninstaller "$InstDir\Uninst.exe" + WriteRegStr HKCU "${REGPATH_UNINSTSUBKEY}" "DisplayName" "${NAME}" + WriteRegStr HKCU "${REGPATH_UNINSTSUBKEY}" "DisplayIcon" "$InstDir\MyApp.exe,0" + WriteRegStr HKCU "${REGPATH_UNINSTSUBKEY}" "UninstallString" '"$InstDir\Uninst.exe"' + WriteRegDWORD HKCU "${REGPATH_UNINSTSUBKEY}" "NoModify" 1 + WriteRegDWORD HKCU "${REGPATH_UNINSTSUBKEY}" "NoRepair" 1 + + File "/oname=$InstDir\MyApp.exe" "${NSISDIR}\Bin\MakeLangId.exe" ; Pretend that we have a real application to install +SectionEnd + +Section "Start Menu shortcut" + CreateShortcut /NoWorkingDir "$SMPrograms\${NAME}.lnk" "$InstDir\MyApp.exe" +SectionEnd + +/* +This Section registers a fictional .test-nullsoft file extension and the Nullsoft.Test ProgId. +Proprietary file types are encouraged (by Microsoft) to use long file extensions and ProgIds that include the company name. + +When registering with "Open With" your executable should ideally have a somewhat unique name, +otherwise there could be a naming collision with a different application (with the same name) installed on the same machine. + +REGISTER_DEFAULTPROGRAMS is not defined because proprietary file types do not typically use the Default Programs functionality. +If your application registers a standard file type such as .mp3 or .html or a protocol like HTTP it should register as a Default Program. +It should also register as a client (https://docs.microsoft.com/en-us/windows/win32/shell/reg-middleware-apps#common-registration-elements-for-all-client-types). +*/ +!define ASSOC_EXT ".test-nullsoft" +!define ASSOC_PROGID "Nullsoft.Test" +!define ASSOC_VERB "MyApp" +!define ASSOC_APPEXE "MyApp.exe" +Section -ShellAssoc + # Register file type + WriteRegStr ShCtx "Software\Classes\${ASSOC_PROGID}\DefaultIcon" "" "$InstDir\${ASSOC_APPEXE},0" + ;WriteRegStr ShCtx "Software\Classes\${ASSOC_PROGID}\shell\${ASSOC_VERB}" "" "Nullsoft Test App" [Optional] + ;WriteRegStr ShCtx "Software\Classes\${ASSOC_PROGID}\shell\${ASSOC_VERB}" "MUIVerb" "@$InstDir\${ASSOC_APPEXE},-42" ; WinXP+ [Optional] Localizable verb display name + WriteRegStr ShCtx "Software\Classes\${ASSOC_PROGID}\shell\${ASSOC_VERB}\command" "" '"$InstDir\${ASSOC_APPEXE}" "%1"' + WriteRegStr ShCtx "Software\Classes\${ASSOC_EXT}" "" "${ASSOC_PROGID}" + + # Register "Open With" [Optional] + WriteRegNone ShCtx "Software\Classes\${ASSOC_EXT}\OpenWithList" "${ASSOC_APPEXE}" ; Win2000+ [Optional] + ;WriteRegNone ShCtx "Software\Classes\${ASSOC_EXT}\OpenWithProgids" "${ASSOC_PROGID}" ; WinXP+ [Optional] + WriteRegStr ShCtx "Software\Classes\Applications\${ASSOC_APPEXE}\shell\open\command" "" '"$InstDir\${ASSOC_APPEXE}" "%1"' + WriteRegStr ShCtx "Software\Classes\Applications\${ASSOC_APPEXE}" "FriendlyAppName" "Nullsoft Test App" ; [Optional] + WriteRegStr ShCtx "Software\Classes\Applications\${ASSOC_APPEXE}" "ApplicationCompany" "Nullsoft" ; [Optional] + WriteRegNone ShCtx "Software\Classes\Applications\${ASSOC_APPEXE}\SupportedTypes" "${ASSOC_EXT}" ; [Optional] Only allow "Open With" with specific extension(s) on WinXP+ + + # Register "Default Programs" [Optional] + !ifdef REGISTER_DEFAULTPROGRAMS + WriteRegStr ShCtx "Software\Classes\Applications\${ASSOC_APPEXE}\Capabilities" "ApplicationDescription" "Shell association example test application" + WriteRegStr ShCtx "Software\Classes\Applications\${ASSOC_APPEXE}\Capabilities\FileAssociations" "${ASSOC_EXT}" "${ASSOC_PROGID}" + WriteRegStr ShCtx "Software\RegisteredApplications" "Nullsoft Test App" "Software\Classes\Applications\${ASSOC_APPEXE}\Capabilities" + !endif + + ${NotifyShell_AssocChanged} +SectionEnd + + +Section -un.ShellAssoc + # Unregister file type + ClearErrors + DeleteRegKey ShCtx "Software\Classes\${ASSOC_PROGID}\shell\${ASSOC_VERB}" + DeleteRegKey /IfEmpty ShCtx "Software\Classes\${ASSOC_PROGID}\shell" + ${IfNot} ${Errors} + DeleteRegKey ShCtx "Software\Classes\${ASSOC_PROGID}\DefaultIcon" + ${EndIf} + ReadRegStr $0 ShCtx "Software\Classes\${ASSOC_EXT}" "" + DeleteRegKey /IfEmpty ShCtx "Software\Classes\${ASSOC_PROGID}" + ${IfNot} ${Errors} + ${AndIf} $0 == "${ASSOC_PROGID}" + DeleteRegValue ShCtx "Software\Classes\${ASSOC_EXT}" "" + DeleteRegKey /IfEmpty ShCtx "Software\Classes\${ASSOC_EXT}" + ${EndIf} + + # Unregister "Open With" + DeleteRegKey ShCtx "Software\Classes\Applications\${ASSOC_APPEXE}" + DeleteRegValue ShCtx "Software\Classes\${ASSOC_EXT}\OpenWithList" "${ASSOC_APPEXE}" + DeleteRegKey /IfEmpty ShCtx "Software\Classes\${ASSOC_EXT}\OpenWithList" + DeleteRegValue ShCtx "Software\Classes\${ASSOC_EXT}\OpenWithProgids" "${ASSOC_PROGID}" + DeleteRegKey /IfEmpty ShCtx "Software\Classes\${ASSOC_EXT}\OpenWithProgids" + DeleteRegKey /IfEmpty ShCtx "Software\Classes\${ASSOC_EXT}" + + # Unregister "Default Programs" + !ifdef REGISTER_DEFAULTPROGRAMS + DeleteRegValue ShCtx "Software\RegisteredApplications" "Nullsoft Test App" + DeleteRegKey ShCtx "Software\Classes\Applications\${ASSOC_APPEXE}\Capabilities" + DeleteRegKey /IfEmpty ShCtx "Software\Classes\Applications\${ASSOC_APPEXE}" + !endif + + # Attempt to clean up junk left behind by the Windows shell + DeleteRegValue HKCU "Software\Microsoft\Windows\CurrentVersion\Search\JumplistData" "$InstDir\${ASSOC_APPEXE}" + DeleteRegValue HKCU "Software\Classes\Local Settings\Software\Microsoft\Windows\Shell\MuiCache" "$InstDir\${ASSOC_APPEXE}.FriendlyAppName" + DeleteRegValue HKCU "Software\Classes\Local Settings\Software\Microsoft\Windows\Shell\MuiCache" "$InstDir\${ASSOC_APPEXE}.ApplicationCompany" + DeleteRegValue HKCU "Software\Microsoft\Windows\ShellNoRoam\MUICache" "$InstDir\${ASSOC_APPEXE}" ; WinXP + DeleteRegValue HKCU "Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Compatibility Assistant\Store" "$InstDir\${ASSOC_APPEXE}" + DeleteRegValue HKCU "Software\Microsoft\Windows\CurrentVersion\ApplicationAssociationToasts" "${ASSOC_PROGID}_${ASSOC_EXT}" + DeleteRegValue HKCU "Software\Microsoft\Windows\CurrentVersion\ApplicationAssociationToasts" "Applications\${ASSOC_APPEXE}_${ASSOC_EXT}" + DeleteRegValue HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\${ASSOC_EXT}\OpenWithProgids" "${ASSOC_PROGID}" + DeleteRegKey /IfEmpty HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\${ASSOC_EXT}\OpenWithProgids" + DeleteRegKey /IfEmpty HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\${ASSOC_EXT}\OpenWithList" + DeleteRegKey /IfEmpty HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\${ASSOC_EXT}" + ;DeleteRegKey HKCU "Software\Microsoft\Windows\Roaming\OpenWith\FileExts\${ASSOC_EXT}" + ;DeleteRegKey HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\RecentDocs\${ASSOC_EXT}" + + ${NotifyShell_AssocChanged} +SectionEnd + +Section -Uninstall + ${UnpinShortcut} "$SMPrograms\${NAME}.lnk" + Delete "$SMPrograms\${NAME}.lnk" + + Delete "$InstDir\MyApp.exe" + Delete "$InstDir\Uninst.exe" + RMDir "$InstDir" + DeleteRegKey HKCU "${REGPATH_UNINSTSUBKEY}" +SectionEnd diff --git a/Examples/install-shared.nsi b/Examples/install-shared.nsi index 7b88f099..f812772b 100644 --- a/Examples/install-shared.nsi +++ b/Examples/install-shared.nsi @@ -1,81 +1,81 @@ -/* - -This example script installs a simple application for all users on a machine. - -All-users installers should only write to HKLM, $ProgramFiles, $CommonFiles and the -"All context" versions of $LocalAppData, $Templates, $SMPrograms etc. - -It should not write to HKCU nor any folders in the users profile! -If the application requires writable template data in $AppData it -must copy the required files from a shared location the -first time a user launches the application. - -*/ - -!define NAME "All-users example" -!define REGPATH_UNINSTSUBKEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${NAME}" -Name "${NAME}" -OutFile "Install ${NAME}.exe" -Unicode True -RequestExecutionLevel Admin ; Request admin rights on WinVista+ (when UAC is turned on) -InstallDir "$ProgramFiles\$(^Name)" -InstallDirRegKey HKLM "${REGPATH_UNINSTSUBKEY}" "UninstallString" - -!include LogicLib.nsh -!include Integration.nsh - -Page Directory -Page InstFiles - -Uninstpage UninstConfirm -Uninstpage InstFiles - -!macro EnsureAdminRights - UserInfo::GetAccountType - Pop $0 - ${If} $0 != "admin" ; Require admin rights on WinNT4+ - MessageBox MB_IconStop "Administrator rights required!" - SetErrorLevel 740 ; ERROR_ELEVATION_REQUIRED - Quit - ${EndIf} -!macroend - -Function .onInit - SetShellVarContext All - !insertmacro EnsureAdminRights -FunctionEnd - -Function un.onInit - SetShellVarContext All - !insertmacro EnsureAdminRights -FunctionEnd - - -Section "Program files (Required)" - SectionIn Ro - - SetOutPath $InstDir - WriteUninstaller "$InstDir\Uninst.exe" - WriteRegStr HKLM "${REGPATH_UNINSTSUBKEY}" "DisplayName" "${NAME}" - WriteRegStr HKLM "${REGPATH_UNINSTSUBKEY}" "DisplayIcon" "$InstDir\MyApp.exe,0" - WriteRegStr HKLM "${REGPATH_UNINSTSUBKEY}" "UninstallString" '"$InstDir\Uninst.exe"' - WriteRegDWORD HKLM "${REGPATH_UNINSTSUBKEY}" "NoModify" 1 - WriteRegDWORD HKLM "${REGPATH_UNINSTSUBKEY}" "NoRepair" 1 - - File "/oname=$InstDir\MyApp.exe" "${NSISDIR}\Bin\MakeLangId.exe" ; Pretend that we have a real application to install -SectionEnd - -Section "Start Menu shortcut" - CreateShortcut /NoWorkingDir "$SMPrograms\${NAME}.lnk" "$InstDir\MyApp.exe" -SectionEnd - - -Section -Uninstall - ${UnpinShortcut} "$SMPrograms\${NAME}.lnk" - Delete "$SMPrograms\${NAME}.lnk" - - Delete "$InstDir\MyApp.exe" - Delete "$InstDir\Uninst.exe" - RMDir "$InstDir" - DeleteRegKey HKLM "${REGPATH_UNINSTSUBKEY}" -SectionEnd +/* + +This example script installs a simple application for all users on a machine. + +All-users installers should only write to HKLM, $ProgramFiles, $CommonFiles and the +"All context" versions of $LocalAppData, $Templates, $SMPrograms etc. + +It should not write to HKCU nor any folders in the users profile! +If the application requires writable template data in $AppData it +must copy the required files from a shared location the +first time a user launches the application. + +*/ + +!define NAME "All-users example" +!define REGPATH_UNINSTSUBKEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${NAME}" +Name "${NAME}" +OutFile "Install ${NAME}.exe" +Unicode True +RequestExecutionLevel Admin ; Request admin rights on WinVista+ (when UAC is turned on) +InstallDir "$ProgramFiles\$(^Name)" +InstallDirRegKey HKLM "${REGPATH_UNINSTSUBKEY}" "UninstallString" + +!include LogicLib.nsh +!include Integration.nsh + +Page Directory +Page InstFiles + +Uninstpage UninstConfirm +Uninstpage InstFiles + +!macro EnsureAdminRights + UserInfo::GetAccountType + Pop $0 + ${If} $0 != "admin" ; Require admin rights on WinNT4+ + MessageBox MB_IconStop "Administrator rights required!" + SetErrorLevel 740 ; ERROR_ELEVATION_REQUIRED + Quit + ${EndIf} +!macroend + +Function .onInit + SetShellVarContext All + !insertmacro EnsureAdminRights +FunctionEnd + +Function un.onInit + SetShellVarContext All + !insertmacro EnsureAdminRights +FunctionEnd + + +Section "Program files (Required)" + SectionIn Ro + + SetOutPath $InstDir + WriteUninstaller "$InstDir\Uninst.exe" + WriteRegStr HKLM "${REGPATH_UNINSTSUBKEY}" "DisplayName" "${NAME}" + WriteRegStr HKLM "${REGPATH_UNINSTSUBKEY}" "DisplayIcon" "$InstDir\MyApp.exe,0" + WriteRegStr HKLM "${REGPATH_UNINSTSUBKEY}" "UninstallString" '"$InstDir\Uninst.exe"' + WriteRegDWORD HKLM "${REGPATH_UNINSTSUBKEY}" "NoModify" 1 + WriteRegDWORD HKLM "${REGPATH_UNINSTSUBKEY}" "NoRepair" 1 + + File "/oname=$InstDir\MyApp.exe" "${NSISDIR}\Bin\MakeLangId.exe" ; Pretend that we have a real application to install +SectionEnd + +Section "Start Menu shortcut" + CreateShortcut /NoWorkingDir "$SMPrograms\${NAME}.lnk" "$InstDir\MyApp.exe" +SectionEnd + + +Section -Uninstall + ${UnpinShortcut} "$SMPrograms\${NAME}.lnk" + Delete "$SMPrograms\${NAME}.lnk" + + Delete "$InstDir\MyApp.exe" + Delete "$InstDir\Uninst.exe" + RMDir "$InstDir" + DeleteRegKey HKLM "${REGPATH_UNINSTSUBKEY}" +SectionEnd