如何在Wix中将文件部署到指定用户目录并解决相关报错?
修复步骤
- 首先调整安装包为每用户安装模式,避免请求管理员权限,同时让安装路径正确指向当前用户的AppData目录,在你的
<Product>节点中添加以下两个属性:
<Product ... 你原来的其他属性 ... InstallScope="perUser" InstallPrivileges="limited" >
这个修改解决你遇到的「需要管理员权限、文件找不到」的问题,默认Wix生成的是每机器安装包,会把用户路径重定向到系统级目录,所以你找不到复制的文件。
- 修复ICE38错误:所有安装到用户配置目录的组件,必须使用HKCU下的注册表项作为KeyPath,不能直接用文件作为KeyPath。
- 修复ICE64错误:给用户目录下的父级文件夹添加卸载时的空文件夹移除规则,避免残留空目录。
完整可运行的代码示例
<!-- 目录结构调整ID命名更易识别,和后续移除规则对应即可 --> <Directory Id="TARGETDIR" Name="SourceDir"> <Directory Id="AppDataFolder"> <Directory Id="MicrosoftFolder" Name="Microsoft"> <Directory Id="TemplatesFolder" Name="Templates"> <Directory Id="StartupTemplates" Name="STARTUP"> </Directory> </Directory> </Directory> </Directory> </Directory> <DirectoryRef Id="StartupTemplates"> <Component Id="ApplicationFiles" Guid="0E4812A6-AEC3-4B36-8654-E4FAA6XXXXXX"> <File Id="TheTemplate" Source="ImageAndTableSupport.dotm" /> <!-- 新增HKCU注册表项作为KeyPath,解决ICE38错误,路径可替换为你自己的产品标识 --> <RegistryValue Root="HKCU" Key="Software\你的产品名\WordTemplate" Name="installed" Type="integer" Value="1" KeyPath="yes" /> <RemoveFolder Id="RemoveStartupFolder" Directory="StartupTemplates" On="uninstall"/> <!-- 新增父目录的移除规则,解决ICE64错误,仅空目录会被删除,不影响用户已有数据 --> <RemoveFolder Id="RemoveTemplatesFolder" Directory="TemplatesFolder" On="uninstall"/> <RemoveFolder Id="RemoveMicrosoftFolder" Directory="MicrosoftFolder" On="uninstall"/> </Component> </DirectoryRef> <Feature Id="DefaultFeature" Level="1"> <ComponentRef Id="ApplicationFiles"/> </Feature>
额外说明
- 移除文件夹的逻辑只会在对应目录为空的时候才会执行,不会删除用户已有的其他模板或配置
- 注册表项仅用于满足Windows Installer的校验规则,无额外业务影响
- 打包后安装就会将dotm模板写入当前用户的Word STARTUP目录,启动Word就会自动加载该模板
内容的提问来源于stack exchange,提问作者CharlesW
相关产品推荐
相关产品推荐

