InstallShield标准用户安装时AppDataFolder映射至错误文件夹问题
这个问题是Windows UAC提权的典型行为导致的——当标准用户通过输入管理员密码提升权限时,安装程序的运行上下文会切换到管理员账户,这时候InstallShield的[AppDataFolder]系统变量就会解析成管理员的漫游数据文件夹,而非你预期的当前标准用户路径。
下面给你几个可行的解决方案:
切换到每用户安装模式
如果你的应用不需要管理员权限就能运行,优先把安装类型改成「每用户(Per-User)」模式。这种模式下,安装程序直接在当前用户上下文运行,无需提权,[AppDataFolder]自然会指向当前标准用户的漫游文件夹。在InstallShield中,你可以在「项目助手」的「应用程序信息」里设置安装类型,或者在「媒体」选项卡调整权限要求。通过自定义动作获取当前用户的AppData路径
如果必须使用每机器(Per-Machine)安装模式,就需要通过自定义脚本动作获取发起安装的标准用户的AppData路径,而非依赖系统变量:- 创建VBScript或C++自定义动作,在文件复制前执行,获取交互式用户的AppData\Roaming路径。比如VBScript可以这么写:
Set objShell = CreateObject("WScript.Shell") userAppData = objShell.SpecialFolders("AppData") Session.Property("USER_APPDATA") = userAppData - 在InstallShield中把组件的目标路径设为
[USER_APPDATA]MyApp,注意要将自定义动作设置为「交互式用户」上下文运行,避免在管理员上下文执行。
- 创建VBScript或C++自定义动作,在文件复制前执行,获取交互式用户的AppData\Roaming路径。比如VBScript可以这么写:
检查InstallShield版本是否支持专用变量
部分新版本的InstallShield提供了[CurrentUserAppDataFolder]这类变量,专门指向当前交互式用户的漫游文件夹,如果你的版本支持,直接替换[AppDataFolder]就能解决问题,这是最省心的方式。调整安装程序的权限上下文(仅限无需管理员权限的场景)
修改安装程序的manifest文件,指定以asInvoker权限运行,这样不会触发UAC提权,安装程序直接在当前标准用户上下文运行,文件会自动放到正确路径。但这种方法只适用于不需要修改系统级文件/注册表的安装场景。
最后提醒:测试时一定要用真实的标准用户账户验证,不要在管理员账户下模拟标准用户,模拟的上下文和真实场景可能存在差异。
内容的提问来源于stack exchange,提问作者bavaza

