当前位置: 首页 > news >正文

NSIS为当前用户安装和为所有用户安装的选择

一、为当前用户和所有用户安装选择

确定 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 仍然有效,但它指向的 "当前用户" 是正在执行安装操作的管理员用户,而非系统的普通用户。
具体表现如下:
  1. 路径指向明确即使在管理员权限下,SetShellVarContext current 会严格指向当前登录的管理员用户的私有目录:
    • $SMPROGRAMS → C:\Users\管理员用户名\AppData\Roaming\...\Programs
    • $DESKTOP → C:\Users\管理员用户名\Desktop
  2. 仅对管理员用户可见此时创建的快捷方式、写入的用户级注册表项(HKCU)等,只会对执行安装的管理员用户生效,其他用户(包括其他管理员)无法看到或访问这些资源。
  3. 与权限的关系管理员权限仅决定 "能否操作系统级资源",而 SetShellVarContext 决定 "资源安装到哪个用户的作用域",二者互不冲突:
    • 管理员权限 + SetShellVarContext all → 安装到公共目录(所有用户可见)
    • 管理员权限 + SetShellVarContext current → 安装到当前管理员的私有目录(仅该管理员可见)

典型场景示例

如果管理员希望:
  • 为所有用户安装 → 用 SetShellVarContext all(需管理员权限)
  • 仅为自己安装(即使以管理员身份运行)→ 用 SetShellVarContext current
因此,若需要实现 "为所有用户安装",必须同时满足:
  1. 脚本顶部声明 RequestExecutionLevel admin(获取管理员权限)
  2. 在操作路径前设置 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 影响)
http://www.hskmm.com/?act=detail&tid=20682

相关文章:

  • 数据中台厂商选型|解决方案厂商与独立中台厂商详细解读
  • 深度学习项目全流程实践与核心技术解析:从数据处理到模型优化 - 教程
  • 直接使用的NLog帮助类
  • 【每日一面】setTimeout 延时为 0 的情况
  • AI元人文:悟空博弈框架
  • sway - wayland下截图方案
  • 不同网络间文件互传怎么实现?
  • sway wayland下 wps-office无法输入中文
  • 科学史笔记
  • Spring XML 设置简介
  • 2025 年真空泵品牌最新权威推荐排行榜:覆盖真空泵维修,真空泵机组,真空泵油,真空泵配件领域选择指南
  • 专业的跨网文件交换系统 和传统FTP/U盘拷贝有什么区别?
  • 0voice-2.1.4-http服务器的实现
  • CF *2600 思维题 2
  • 中低压配网设备介绍
  • vue3使用路由配置
  • 分享一个YTB视频下载器
  • 基于Python+Vue开发的家具商城管理系统源码+运行步骤
  • 2025年,CRM口碑排行榜:从SAAS到本地部署方案
  • Arraylist集合原理分析
  • Commitlint 使用指南
  • VonaJS提供的读写分离,直观,优雅
  • 免费开源的百度文库平替!支持多格式文档预览与存储!
  • 个人行业选择
  • idea
  • 写假数据
  • C语言的指针与cpp的引用
  • day24——Java高级技术深度解析:单元测试、反射、注解与动态代理 - 指南
  • 进程互斥的硬件实现方式(比较难懂的一节课,但是我搞懂了)
  • 【征文计划】基于Rokid眼镜平台的AR历史情景课堂创意应用 - 指南