一、为当前用户和所有用户安装选择
确定 NSIS 脚本中应使用
SetShellVarContext all
还是 current
,主要取决于你的软件安装目标和用户访问需求。可以通过以下几个核心问题来判断:1. 软件是否需要被系统中所有用户访问?
-
是 → 用
SetShellVarContext all
典型场景:- 企业级软件、团队协作工具,需要所有用户共用同一套安装程序和配置
- 系统工具、驱动程序,需对系统全局生效
- 软件许可证允许多用户使用,且希望所有用户看到相同的快捷方式、配置
此时,快捷方式会出现在「所有用户」的开始菜单 / 桌面(C:\Users\Public\Desktop
等),注册表写入HKLM
(机器级),所有用户登录后都能看到和使用。 -
否 → 用
SetShellVarContext current
典型场景:- 个人专用软件(如笔记工具、个性化插件),仅当前用户需要使用
- 软件配置与用户强关联(如浏览器插件、个人开发工具)
- 非管理员用户安装(无需权限也能安装到自己的用户目录)
此时,资源仅存于当前用户的私有目录(C:\Users\用户名\...
),其他用户无法看到。
2. 安装路径和操作是否涉及系统级资源?
-
是 → 必须用
SetShellVarContext all
(且需管理员权限)例如:- 安装到
C:\Program Files
目录(系统默认的公共程序目录) - 修改
HKLM
注册表项(影响所有用户的系统配置) - 创建全局环境变量、安装 Windows 服务
这些操作本身需要管理员权限,且目标就是让所有用户受益,因此必须配合all
。 - 安装到
-
否 → 可用
SetShellVarContext current
例如:- 安装到当前用户的
AppData
目录(C:\Users\用户名\AppData\Local
) - 仅修改
HKCU
注册表项(仅影响当前用户) - 快捷方式仅需在当前用户桌面显示
这些操作无需管理员权限,且资源隔离在当前用户范围内。 - 安装到当前用户的
3. 实际业务场景举例
场景 | 应选值 | 理由 |
---|---|---|
公司内部办公软件,要求所有员工都能使用 | all |
需全局可见,所有用户共用 |
个人使用的输入法皮肤,仅自己需要 | current |
无需其他用户看到,安装到个人目录即可 |
软件需要注册系统服务(如数据库服务) | all |
服务是系统级的,需所有用户可见 |
绿色软件解压后仅当前用户临时使用 | current |
无需写入系统目录,隔离在个人范围 |
总结原则
- 「所有用户共用」→
SetShellVarContext all
(需管理员权限) - 「仅当前用户使用」→
SetShellVarContext current
(普通权限即可)
如果你的需求是「为所有用户安装」(如之前的脚本所示),则必须使用
SetShellVarContext all
,并配合 RequestExecutionLevel admin
确保权限足够。二、当安装包具有管理员权限时,SetShellVarContext current如何工作
当安装程序以管理员权限运行时,
SetShellVarContext current
仍然有效,但它指向的 "当前用户" 是正在执行安装操作的管理员用户,而非系统的普通用户。具体表现如下:
-
路径指向明确即使在管理员权限下,
SetShellVarContext current
会严格指向当前登录的管理员用户的私有目录:$SMPROGRAMS
→C:\Users\管理员用户名\AppData\Roaming\...\Programs
$DESKTOP
→C:\Users\管理员用户名\Desktop
-
仅对管理员用户可见此时创建的快捷方式、写入的用户级注册表项(
HKCU
)等,只会对执行安装的管理员用户生效,其他用户(包括其他管理员)无法看到或访问这些资源。 -
与权限的关系管理员权限仅决定 "能否操作系统级资源",而
SetShellVarContext
决定 "资源安装到哪个用户的作用域",二者互不冲突:- 管理员权限 +
SetShellVarContext all
→ 安装到公共目录(所有用户可见) - 管理员权限 +
SetShellVarContext current
→ 安装到当前管理员的私有目录(仅该管理员可见)
- 管理员权限 +
典型场景示例
如果管理员希望:
- 为所有用户安装 → 用
SetShellVarContext all
(需管理员权限) - 仅为自己安装(即使以管理员身份运行)→ 用
SetShellVarContext current
因此,若需要实现 "为所有用户安装",必须同时满足:
- 脚本顶部声明
RequestExecutionLevel admin
(获取管理员权限) - 在操作路径前设置
SetShellVarContext all
(指定公共目录)
变量名 | 当 SetShellVarContext all 时的路径 | 当 SetShellVarContext current 时的路径 |
---|---|---|
$SMPROGRAMS |
C:\ProgramData\Microsoft\Windows\Start Menu\Programs |
C:\Users\用户名\AppData\Roaming\Microsoft\Windows\Start Menu\Programs |
$DESKTOP |
C:\Users\Public\Desktop |
C:\Users\用户名\Desktop |
$APPDATA |
C:\ProgramData (公共应用数据) |
C:\Users\用户名\AppData\Roaming (当前用户应用数据) |
$COMMONFILES |
C:\Program Files\Common Files (所有用户共享文件) |
同上(此变量通常不受 context 影响) |