MSI自定义操作条件中使用命令行变量失效,报2717错误
解决MSI自定义操作2717错误问题
问题场景
我尝试通过命令行参数控制MSI自定义操作,编写的MSI脚本片段如下:
... <CustomAction Id='LaunchInstallQuiet' FileKey='InstallImageFile' ExeCommand='-q' Execute="deferred" Return="check" Impersonate="yes" /> <CustomAction Id='LaunchInstallQuietNonadmin' FileKey='InstallImageFile' ExeCommand='-q -na' Execute="deferred" Return="check" Impersonate="yes" /> <Property Id="NONADMIN" Secure="yes" Value="0" /> <InstallExecuteSequence> <Custom Action='LaunchInstallQuiet' After='InstallFiles'>NONADMIN!="1" AND NOT REMOVE="ALL"</Custom> <Custom Action='LaunchInstallQuietNonadmin' After='InstallFiles'>NONADMIN="1" AND NOT REMOVE="ALL"</Custom> <ScheduleReboot After="InstallFinalize">Installed</ScheduleReboot> </InstallExecuteSequence> ...
但执行以下两条命令时均触发2717错误,自定义操作完全未执行:
msiexec /i myapp.msi msiexec /i myapp.msi NONADMIN=1
问题分析与修复方案
2717错误核心原因是自定义操作的配置或执行条件存在问题,结合脚本细节,修正点如下:
1. 延迟自定义操作的属性访问限制
延迟执行(Execute="deferred")的自定义操作运行在系统上下文,无法直接读取普通属性,必须通过CustomActionData传递属性值。需要添加即时执行的自定义操作,将NONADMIN属性传递给延迟操作。
2. 条件表达式语法错误
MSI条件中的字符串比较不需要引号,原脚本中NONADMIN!="1"的写法不符合规范,应改为NONADMIN<>1。
3. 权限模拟设置
如果自定义操作需要系统权限完成任务,Impersonate="yes"会导致权限不足,建议设为Impersonate="no"。
修正后的完整脚本片段
... <CustomAction Id='LaunchInstallQuiet' FileKey='InstallImageFile' ExeCommand='-q' Execute="deferred" Return="check" Impersonate="no" /> <CustomAction Id='LaunchInstallQuietNonadmin' FileKey='InstallImageFile' ExeCommand='-q -na' Execute="deferred" Return="check" Impersonate="no" /> <!-- 新增:将NONADMIN属性传递给延迟自定义操作 --> <CustomAction Id="SetLaunchInstallQuietData" Property="LaunchInstallQuiet" Value="NONADMIN=[NONADMIN]" Execute="immediate" /> <CustomAction Id="SetLaunchInstallQuietNonadminData" Property="LaunchInstallQuietNonadmin" Value="NONADMIN=[NONADMIN]" Execute="immediate" /> <Property Id="NONADMIN" Secure="yes" Value="0" /> <InstallExecuteSequence> <!-- 先执行属性传递的即时操作 --> <Custom Action='SetLaunchInstallQuietData' Before='LaunchInstallQuiet'>NOT REMOVE="ALL"</Custom> <Custom Action='SetLaunchInstallQuietNonadminData' Before='LaunchInstallQuietNonadmin'>NOT REMOVE="ALL"</Custom> <Custom Action='LaunchInstallQuiet' After='InstallFiles'>NONADMIN<>1 AND NOT REMOVE="ALL"</Custom> <Custom Action='LaunchInstallQuietNonadmin' After='InstallFiles'>NONADMIN=1 AND NOT REMOVE="ALL"</Custom> <ScheduleReboot After="InstallFinalize">Installed</ScheduleReboot> </InstallExecuteSequence> ...
额外排查要点
- 确认
InstallImageFile对应的文件已正确添加到MSI的File表中,路径无误(找不到执行文件是2717错误的常见诱因) - 启用MSI日志排查细节:执行
msiexec /i myapp.msi NONADMIN=1 /l*v install.log,日志会详细记录自定义操作的触发逻辑和错误信息 - 若支持非管理员安装,需确保MSI的
Package元素设置了InstallPrivileges="limited"
内容的提问来源于stack exchange,提问作者byq
相关产品推荐
相关产品推荐

