930 字
5 分钟
Codex Windows 沙盒故障修复:setup refresh had errors 排查记录

背景#

Codex 的 Windows 沙盒通过修改目录 ACL 实现文件访问隔离。每次启动时,codex-windows-sandbox-setup.exe 会向写根(工作区目录及其 .git)写入 deny ACE,并将沙盒用户加入各读取目录的 ACL。该步骤需要当前用户对目标目录具有 WRITE_DAC 权限。

本次故障现象:在某批已有项目目录中运行 Codex 时启动失败,报 setup refresh had errors;在新建目录中运行则正常。

测试环境:Windows 11(中文),Codex CLI 0.149.1(npm 全局安装)。

症状#

启动 Codex 时终端输出:

deny ACE failed on D:\Projects\xxx\.git: SetNamedSecurityInfoW failed for D:\Projects\xxx\.git: 5
setup refresh: processed 2 write roots (read roots delegated); errors=[...]
setup refresh completed with errors: [...]
setup error: setup refresh had errors

随后会话无法正常进行。任务管理器中可见 codex-windows-sandbox-setup.exe 持续占用 CPU 与磁盘。

排查#

1. 属主检查#

对报错目录执行:

Terminal window
(Get-Acl "D:\Projects\xxx\.git").Owner

结果为 LAPTOP-XXXX\CodexSandboxOffline,而非当前用户账号。

CodexSandboxOffline 是 Codex 沙盒创建的本地用户(另有 CodexSandboxOnline,同属 CodexSandboxUsers 组):

Terminal window
Get-LocalUser | Where-Object Name -like '*Codex*'
Get-LocalGroup | Where-Object Name -like '*Codex*'

2. 原因分析#

当前用户对该目录仅持有继承自 Authenticated Users 的 Modify 权限(不含 WRITE_DAC),且不是属主,因此无法修改其 DACL。setup 向该目录写入 deny ACE 时,SetNamedSecurityInfoW 返回错误码 5(ACCESS_DENIED),setup 失败。

属主被改为沙盒用户,是 Codex Windows 沙盒的已知行为(见文末 Issue #17179)。目录属主何时被改、为何未恢复,本次未能从日志中确认,属于推测,本文不展开。

新目录属主正常,setup 可正常写入 ACL,因此不受影响——这也解释了故障仅在旧目录出现。

3. 时间线观察#

故障日志首次出现在 8 月 24 日。当天 Codex 从 0.149.0 升级到 0.149.1(npm 包安装时间 20:51)。两者时间重合,但未确认存在因果关系;沙盒账号 CodexSandboxOffline 的 LastLogon 为 8 月 23 日。

4. setup 进程 CPU 观察#

对 setup 进程采样(8 秒间隔对比 CPU 时间):

Terminal window
$s1 = Get-Process -Name 'codex-windows-sandbox-setup'
Start-Sleep 8
$s2 = Get-Process -Name 'codex-windows-sandbox-setup'
$s2.CPU - $s1.CPU

实测 8 秒内 CPU 增加约 2 秒,说明进程持续工作(推测为反复重试 ACL 写入,未进一步验证)。本次还观察到两个 setup 实例并行运行,会话初始化被阻塞,表现为 AI 长时间无响应。

修复#

以管理员身份打开 PowerShell(Win+X → “终端(管理员)”),对每个报错的项目目录执行:

Terminal window
takeown /F "D:\Projects\xxx" /R /D Y
icacls "D:\Projects\xxx" /grant "你的电脑名\ying:(OI)(CI)F" /T /C /Q
  • takeown:将目录树属主改为执行者
  • icacls:为指定用户递归授予完全控制(含 WRITE_DAC)

验证:

Terminal window
(Get-Acl "D:\Projects\xxx\.git").Owner

属主恢复为当前账号后,重新打开 Codex 验证 setup 是否不再报错。

NOTE

icacls 中的用户名建议写死,不要使用 %USERNAME%:管理员终端中的当前用户可能不是日常使用的账号。

全量扫描#

属主被改的不仅是 .git。对项目根目录做遍历,找出所有属主含 CodexSandbox 的目录:

Terminal window
Get-ChildItem 'D:\Projects' -Directory | ForEach-Object {
if ((Get-Acl $_.FullName).Owner -like '*Sandbox*') { $_.FullName }
}

本次共发现 7 处,分布于 4 个项目,包括 .git.github__pycache__ 等目录。注意项目根目录属主均正常,异常仅出现在内层,仅检查顶层会遗漏。

排查命令速查#

Terminal window
# 查看属主
(Get-Acl "路径").Owner
# 查看 ACL 明细
(Get-Acl "路径").Access | Format-Table IdentityReference, AccessControlType, FileSystemRights
# 查看沙盒账号及最后登录时间
Get-LocalUser | Where-Object Name -like '*Codex*'
# 查看 setup 进程状态
Get-Process -Name 'codex-windows-sandbox-setup' | Select-Object CPU, StartTime
# 查看沙盒日志(~/.codex/sandbox.*.log)
Get-Content "$env:USERPROFILE\.codex\sandbox.2026-08-24.log" -Tail 50

参考#

Codex Windows 沙盒故障修复:setup refresh had errors 排查记录
https://blog.stng.asia/posts/blog-codex-windows-sandbox-fix/
作者
Star Nguyen
发布于
2026-08-25
许可协议
CC BY-NC-SA 4.0