ChatGPT (Codex) 桌面版启动失败排查与修复记录

在这里插入图片描述

现象

打开 ChatGPT 桌面版(微软商店 MSIX 包 OpenAI.Codex)时报错:

ChatGPT failed to start.
Unable to locate the Codex CLI binary. Set CODEX_CLI_PATH or ensure the Electron resources include bin/codex.

问题根因

  1. 安装包文件被打上了 EFS 加密属性
    通过 Get-Item 证实:整个 app\resources 目录与其中的 codex.exe(以及 ChatGPT.exe)均带有 Encrypted 属性:

    • CSrcAttr: "Archive, Encrypted"(源文件)
    • 同时 PkgAppDirAttr: "Directory, Archive, Encrypted"(包含目录)
  2. 本机 EFS 加密功能不可用
    测试 [IO.FileInfo]::Encrypt() 抛出 Exception: "不支持该请求",说明系统不支持进行 EFS 加密操作。

  3. 复制过程会尝试保持加密状态
    Windows 的 CopyFileEx(应用使用的 Rust fs::copy 底层)在复制带 Encrypted 属性的文件时,会在目标位置尝试重建加密。由于本机 EFS 不可用,会返回错误码 0x80071770 = ERROR_ENCRYPTION_FAILED(“无法加密指定的文件”)。

  4. 结果
    应用的「重定位」步骤(从 %ProgramFiles%\WindowsApps\...\resources\codex.exe%LOCALAPPDATA%\OpenAI\Codex\bin\codex.exe)失败,导致所有候选路径均为空,直接抛出你看到的错误对话框。

关键证据链

  • Sentry 日志 bundled_executable_relocation_failed ... copy_file errorCode=UNKNOWN errorMessage="Bundled executable relocation failed during copy_file"
  • 手动 Copy-Item 精确复现 0x80071770
  • 对照组(npm 版无加密属性的 exe)复制到同一目录成功;
  • EFS 探测 Encrypt()不支持该请求

修复方案

核心思路

绕过 EFS 加密复制:用流式复制([IO.File]::OpenRead + .CopyTo)生成不带加密属性的普通副本,放到应用期望的 %LOCALAPPDATA%\OpenAI\Codex\bin\,再设置用户级环境变量 CODEX_CLI_PATH 指向它。代码里证实 CODEX_CLI_PATH 为解析器首选来源,直接绕过会失败的「重定位」环节。

具体步骤(已执行)

  1. 流式复制 4 个 exe 到目标目录
    文件 | 目标路径 | 大小 | 校验

    • codex.exe | C:\Users\14429\AppData\Local\OpenAI\Codex\bin\codex.exe | 307,568,432 字节 | SHA256 与源完全一致
    • codex-code-mode-host.exe | 同上 | 65,880,368 字节 | 一致
    • codex-windows-sandbox-setup.exe | 同上 | 15,403,312 字节 | 一致
    • codex-command-runner.exe | 同上 | 8,162,096 字节 | 一致

    复制后属性均为 Archive(普通),不再是 Encrypted

  2. 设置用户级环境变量

    [Environment]::SetEnvironmentVariable('CODEX_CLI_PATH', 
        "C:\Users\14429\AppData\Local\OpenAI\Codex\bin\codex.exe", 'User')
    
    • 该变量会通过 WM_SETTINGCHANGE 广播到所有新进程(包括通过开始菜单/快捷方式启动的应用);
    • 代码解析器 ece() 返回 process.env.CODEX_CLI_PATH(已证实),作为首选路径在 zi() 之前使用,兜底的「重定位」从未被触发。
  3. 验证效果

    • ChatGPT 主窗口正常打开(标题“ChatGPT”);
    • 后端 codex.exe 进程(PID 27560)从 C:\Users\14429\AppData\Local\OpenAI\Codex\bin\codex.exe 启动,带正确 app-server 参数;
    • 日志中不再出现「Unable to locate」或 transport_connect_failed
    • 启动后 Sentry 只留有非致命的 relocation_failed 旧警告(可忽略)。

交付物:刷新脚本

在工作区创建 D:\deeplearning\ds_harness\ds_test\refresh-chatgpt-codex-bin.ps1,方便以后每次 ChatGPT 更新后重跑:

# refresh-chatgpt-codex-bin.ps1
$ErrorActionPreference = 'Stop'

$pkg = Get-AppxPackage -Name 'OpenAI.Codex' |
    Sort-Object { [version]$_.Version } -Descending |
    Select-Object -First 1
if (-not $pkg) { throw '未找到 OpenAI.Codex 包' }

$res = Join-Path $pkg.InstallLocation 'app\resources'
$bin = Join-Path $env:LOCALAPPDATA 'OpenAI\Codex\bin'
New-Item -ItemType Directory -Force -Path $bin | Out-Null

$names = @('codex.exe','codex-code-mode-host.exe','codex-windows-sandbox-setup.exe','codex-command-runner.exe')
foreach ($n in $names) {
    $s = Join-Path $res $n
    $d = Join-Path $bin $n
    if (-not (Test-Path $s)) { Write-Warning "跳过(包内不存在): $n"; continue }
    $fsSrc=[IO.File]::OpenRead($s)
    $fsDst=[IO.File]::Open($d,[IO.FileMode]::Create,[IO.FileAccess]::Write,[IO.FileShare]::None)
    $fsSrc.CopyTo($fsDst); $fsDst.SetLength($fsSrc.Length); $fsSrc.Close(); $fsDst.Close()
    Write-Host ("OK: {0} ({1:N0} bytes)" -f $d, (Get-Item $d).Length)
}

[Environment]::SetEnvironmentVariable('CODEX_CLI_PATH', (Join-Path $bin 'codex.exe'), 'User')
Write-Host "CODEX_CLI_PATH = $(Join-Path $bin 'codex.exe') (用户级,已设置/刷新)"
Write-Host '完成。请完全退出并重新打开 ChatGPT。'

用法powershell -ExecutionPolicy Bypass -File refresh-chatgpt-codex-bin.ps1

  • 何时运行:ChatGPT 每次更新后,建议立即跑一次该脚本;环境变量会持久保留(用户级),只有当新版本的包内二进制文件版本显著变化(需要新功能/修复)时才显著需要重跑,否则只要脚本跑过一次、环境变量仍在有效期内即可。

备选:彻底根治(可选)

如果你更倾向于「安装干净」而非「绕过」:

  1. 卸载 ChatGPT(设置 → 应用 → ChatGPT → 卸载);
  2. 删除残留的 D:\WindowsApps\OpenAI.Codex_*C:\Users\<User>\AppData\Local\OpenAI\Codex\bin\(管理员可选,非必须);
  3. 从微软商店重装最新版。

新装的包文件在我们这台机器上不会再带 EFS 加密属性,即使用无脚本也能正常启动。但当前的「流式复制 + 环境变量」方案同样稳定、无需管理员、且无需重装,推荐优先使用。

小结

项目 状态
根原因 包文件 EFS 加密属性 + 本机 EFS 不可用 → 复制失败 → 启动报错
修复要点 流式复制不带加密属性的副本 → 设 CODEX_CLI_PATH 环境变量 → 重启应用
持久性 环境变量用户级持久;脚本 refresh-chatgpt-codex-bin.ps1 让后续更新一键复现
影响范围 仅本机 ChatGPT 实例;不影响其他应用或系统功能
残留现象 日志里可能仍有 relocation_failed 旧警告,无碍使用

记录时间:2026-08-27

Logo

AtomGit AI 社区提供模型库、数据集、Agent、Token等资源

更多推荐