Inno Setup 6.7.3:深色主题下的启动卡顿修复与 PowerShell 安全加固

2026-05-28 24 预计阅读时间:1 分钟
来源:oschina.net AI 摘要 原文链接

免责声明:本文为 AI 摘要整理,建议结合原文阅读。摘要可能省略上下文、版本差异或边界条件,不作为官方说明。

预计阅读时间:7 分钟

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;

运行前需要修改的地方:

  1. AppNameAppVersionDefaultDirName 替换为你自己的应用信息
  2. CurStepChanged 中的 PowerShell 脚本内容替换为你实际需要的操作(如注册 COM 组件、配置防火墙规则等)
  3. 如果需要深色向导样式,取消注释 WizardBackColorWizardSmallImageBackColor 行,并确保使用 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 是一个低风险、高收益的版本更新。


相关推荐