NSIS安装包设计为当前用户和所有用户安装

一、在windows系统中为当前用户安装和所有用户安装有什么差异

 

最直观、简单的区别就是如果选择“仅为我安装”,那么安装完成后,软件只能安装软件的这个用户使用,其他用户的开始菜单和桌面上没有这个应用;而如果选择“为使用这台电脑的任何人安装”,那么安装完成后,所有用户的开始菜单中都会有这个应用,都可以使用。

如果选择仅为我安装,那么用户不需要提供管理员权限,因为所有可能修改的目录预期均为用户所有应用的相关资源会被解包到%APPDATA%目录应用的开始菜单快捷方式会被创建在%APPDATA%\Microsoft\Windows\Start Menu\Programs中

应用的相关注册表项会写在Computer\HKEY_CURRENT_USER位置

如果选择为所有用户安装,那么用户需要提供管理员权限应用相关的资源会被解包到%PROGRAMFILES%或者 %PROGRAMFILES(X86)%

文件夹中应用的开始菜单快捷方式会被创建在%PROGRAMDATA%\Microsoft\Windows\Start Menu\Programs 中

应用可能在%PROGRAMDATA%中写入一些与用户无关的配置文件应用相关的注册表项会写在Computer\HKEY_LOCAL_MACHINE位置

如果应用开发符合微软的规范,无论选择那种安装,应用都会将一些与用户相关的配置文件、日志、缓存等写入 %APPDATA% ,以实现不同用户使用相互隔离。

二、NSIS示例

 

为了在 NSIS 脚本中实现“为所有用户安装”和“仅为当前用户安装”选项,并在注册表和安装位置上体现不同,可以按照以下步骤进行:

### 1. 创建选择页面

使用 `nsDialogs` 创建一个页面,让用户选择安装类型。

### 2. 设置变量

定义一个变量来存储用户的选择。

### 3. 修改安装路径

根据用户的选择,设置安装路径到适当的位置。

### 4. 更新注册表

根据安装类型,更新注册表项,以便在“所有用户”或“当前用户”范围内可用。

### 示例脚本

```nsis
!include "MUI2.nsh"
!include "LogicLib.nsh"
!include "nsDialogs.nsh"

Var INSTALL_TYPE
Var Dialog

Page custom SelectInstallType
Page instfiles

Function SelectInstallType
nsDialogs::Create 1018
Pop $Dialog

${NSD_CreateRadioButton} 20u 20u 200u 10u "为所有用户安装"
Pop $0
${NSD_SetState} $0 ${BST_CHECKED}

${NSD_CreateRadioButton} 20u 40u 200u 10u "仅为当前用户安装"
Pop $1

nsDialogs::Show
FunctionEnd

Function .onNextPage
${NSD_GetState} $0 $R0
StrCmp $R0 ${BST_CHECKED} 0 +3
StrCpy $INSTALL_TYPE "all"
Goto done

${NSD_GetState} $1 $R0
StrCmp $R0 ${BST_CHECKED} 0 +3
StrCpy $INSTALL_TYPE "current"

done:
FunctionEnd

Function .onInit
; Set default installation path based on the selection
${If} $INSTALL_TYPE == "all"
SetShellVarContext all
StrCpy $INSTDIR "$PROGRAMFILES\MyApp"
${Else}
SetShellVarContext current
StrCpy $INSTDIR "$LOCALAPPDATA\MyApp"
${EndIf}
FunctionEnd

Section "Install"
SetOutPath $INSTDIR
; Copy files, etc.

; Update registry
${If} $INSTALL_TYPE == "all"
WriteRegStr HKLM "Software\MyApp" "InstallPath" "$INSTDIR"
${Else}
WriteRegStr HKCU "Software\MyApp" "InstallPath" "$INSTDIR"
${EndIf}
SectionEnd
```

### 说明

- **选择页面**:使用 `nsDialogs` 创建选择界面。
- **变量存储**:用 `INSTALL_TYPE` 变量存储用户选择。
- **安装路径**:在 `.onInit` 函数中,根据用户选择设置不同的安装路径。
- **注册表更新**:在安装过程中,根据选择在 `HKLM` 或 `HKCU` 中写入注册表项。

确保根据你的具体需求调整脚本中的路径和逻辑。

posted @ 2024-10-12 10:18  卖雨伞的小男孩  阅读(90)  评论(0编辑  收藏  举报