如何让Wix自定义动作生成64位PowerShell进程?
问题核心
你的问题本质是32位MSI自定义动作进程触发了文件系统重定向:即使指定了C:\Windows\System32下的PowerShell,实际仍会被映射到C:\Windows\SysWow64运行32位版本,进而无法访问64位专属的注册表路径(32位进程中HKLM:\Software会被重定向到HKLM:\Software\Wow6432Node)。
解决步骤
1. 构建64位专属MSI
明确指定Wix项目的64位平台属性:
- 打开Wix项目属性,将目标平台设置为
x64(不要使用Any CPU)。 - 在
Product元素中添加Platform="x64"标识,确保MSI被识别为64位安装包:
<Product Id="*" Name="YourProduct" Language="1033" Version="1.0.0.0" Manufacturer="YourCompany" UpgradeCode="YOUR-GUID-HERE" Platform="x64">
2. 给自定义动作添加Win64标识
你的SystemShell自定义动作缺少Win64="yes"属性,这是让自定义动作以64位进程运行的关键。修改CustomAction定义:
<CustomAction Id="SystemShell" BinaryKey="WixCA" DllEntry="WixQuietExec" Execute="deferred" Return="check" Impersonate="no" Win64="yes" />
3. 确认注册表搜索有效性
你已在RegistrySearch中添加Win64="yes",结合64位MSI设置,现在会正确读取64位注册表中的PowerShell路径,不会被重定向到Wow6432Node。
为什么之前的尝试无效?
- 仅修改RegistrySearch但未构建64位MSI:32位MSI会强制启用文件系统重定向,
C:\Windows\System32会被映射到C:\Windows\SysWow64,实际运行的还是32位PowerShell。 - 未给自定义动作加
Win64="yes":即使MSI是64位,自定义动作默认仍以32位进程运行,这就是日志中显示"32bit Elevated Non-remapped custom action server"的原因。
验证方法
安装时生成MSI日志,检查是否出现以下内容,确认自定义动作服务器为64位:
MSI (s) (XX:YY) [HH:MM:SS:mmm]: Hello, I'm your 64bit Elevated Non-remapped custom action server.
此时PowerShell的$([Environment]::Is64BitProcess)会返回true,注册表路径也能正常访问。
内容的提问来源于stack exchange,提问作者im_sam39
相关产品推荐
相关产品推荐

