Inno Setup 作为 Windows 安装包制作领域的老牌工具,近期从 7.x 分支回移植了两个关键修复:一是深色自定义向导样式下 RichEdit 控件在 Wine 环境中的启动延迟问题,二是示例脚本中 PowerShell 调用方式的安全隐患。这两个改动看似细节,但对实际打包流程有直接影响——如果你正在用 Inno Setup 制作带深色主题的安装器,或在脚本中调用了 PowerShell,6.7.3 是一个值得升级的版本。
深色向导 + 超大文本:Wine 下的启动延迟根源
6.7.2 版本引入了一个 Wine RichEdit 的 workaround,解决 RichEdit 控件在 Wine 环境中的兼容性问题。但这个 workaround 本身带来了新问题:当安装向导使用深色自定义样式(Dark Wizard Style)并且页面中包含超大文本内容时,安装程序启动会出现明显延迟。
6.7.3 对该 workaround 进行了改进,针对"超大文本 + 深色样式"这一组合场景优化了处理逻辑,消除了启动时的卡顿。
影响范围判断: 如果你只在原生 Windows 上运行安装程序、不使用深色自定义样式、或页面文本量较小,这个修复对你影响不大。但以下场景建议关注:
- 在 Wine 环境下测试安装包(Linux 上的 Windows 兼层)
- 自定义了深色向导样式(
WizardStyle=modern配合深色颜色方案) - 许可协议页面或说明页面包含大量文本
PowerShell 示例脚本的安全修复
另一个回移植改动涉及示例脚本 PowerShell.iss。此前该脚本在调用 PowerShell 时使用了相对路径,这在某些场景下可能被路径劫持利用——攻击者如果在相对路径对应位置放置了恶意 powershell.exe,脚本就会执行伪造的程序。
6.7.3 将 PowerShell.iss 中的 PowerShell 调用改为绝对路径(即 %SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe),从源头杜绝了路径劫持的可能性。
这个修复虽然只改了示例脚本,但它传递的信号很明确:在你自己的安装脚本中调用外部程序时,也应优先使用绝对路径。
实践:编写一个安全的 PowerShell 调用 Inno Setup 脚本
下面给出一个可直接改造使用的 Inno Setup 脚本片段,演示如何在安装流程中安全地调用 PowerShell,并遵循 6.7.3 的安全建议——使用绝对路径:
; -- SafePowerShellDemo.iss --
; 演示在 Inno Setup 中安全调用 PowerShell(使用绝对路径)
[Setup]
AppName=SafePSDemo
AppVersion=1.0
DefaultDirName={pf}\SafePSDemo
WizardStyle=modern
; 如果使用深色样式,6.7.3 修复了 Wine 下超大文本的启动延迟
; WizardBackColor=#1E1E1E
; WizardSmallImageBackColor=#1E1E1E
[Code]
const
// 关键:使用绝对路径而非相对路径,防止路径劫持
PowerShellPath = '%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe';
function ExecPowerShell(Script: String; Wait: Boolean): Integer;
var
ResultCode: Integer;
FullCmd: String;
begin
// 构造完整命令:-NoProfile 减少启动开销,-NonInteractive 防止弹窗
FullCmd := ExpandConstant(PowerShellPath) +
' -NoProfile -NonInteractive -ExecutionPolicy Bypass -Command "' +
Script + '"';
if Wait then
Exec(FullCmd, '', SW_HIDE, ewWaitUntilTerminated, ResultCode)
else
Exec(FullCmd, '', SW_HIDE, ewNoWait, ResultCode);
Result := ResultCode;
end;
// 安装完成后执行:写入一条注册表记录并输出日志
procedure CurStepChanged(CurStep: TSetupStep);
var
RC: Integer;
begin
if CurStep = ssPostInstall then
begin
RC := ExecPowerShell(
'$logPath = [System.IO.Path]::Combine($env:TEMP, ''SafePSDemo_install.log'');' +
'Set-Content -Path $logPath -Value ("Installed at " + [DateTime]::Now.ToString());' +
'Write-Host "Log written to $logPath"',
True // 等待执行完成
);
if RC <> 0 then
Log('PowerShell exited with code: ' + IntToStr(RC));
end;
end;
运行前需要修改的地方:
AppName、AppVersion、DefaultDirName替换为你自己的应用信息CurStepChanged中的 PowerShell 脚本内容替换为你实际需要的操作(如注册 COM 组件、配置防火墙规则等)- 如果需要深色向导样式,取消注释
WizardBackColor和WizardSmallImageBackColor行,并确保使用 6.7.3 以避免 Wine 下的启动延迟
升级建议与注意事项
| 场景 | 是否需要升级到 6.7.3 |
|---|---|
| 使用深色向导样式 + Wine 测试 | 强烈建议,启动延迟直接影响用户体验 |
| 脚本中调用了 PowerShell | 建议,检查你的脚本是否使用了绝对路径 |
| 仅原生 Windows、默认样式 | 可选升级,无紧迫问题 |
| 正在评估 Inno Setup 7.x | 6.7.3 的回移植内容与 7.x 对齐,升级可减少后续迁移差异 |
检查清单:
- 确认现有
.iss脚本中所有Exec调用外部程序的地方是否使用了绝对路径 - 如果使用了深色自定义样式,在 Wine 环境下重新测试安装包启动速度
- 将项目中从
PowerShell.iss示例复制出来的代码片段与 6.7.3 新版示例对比,确认路径写法已更新
Inno Setup 的这类回移植修复通常不会引入破坏性变更,升级风险很低。如果你在打包流程中触及了上述两个场景,6.7.3 是一个低风险、高收益的版本更新。