背景
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: 5setup 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. 属主检查
对报错目录执行:
(Get-Acl "D:\Projects\xxx\.git").Owner结果为 LAPTOP-XXXX\CodexSandboxOffline,而非当前用户账号。
CodexSandboxOffline 是 Codex 沙盒创建的本地用户(另有 CodexSandboxOnline,同属 CodexSandboxUsers 组):
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 时间):
$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 → “终端(管理员)”),对每个报错的项目目录执行:
takeown /F "D:\Projects\xxx" /R /D Yicacls "D:\Projects\xxx" /grant "你的电脑名\ying:(OI)(CI)F" /T /C /Qtakeown:将目录树属主改为执行者icacls:为指定用户递归授予完全控制(含 WRITE_DAC)
验证:
(Get-Acl "D:\Projects\xxx\.git").Owner属主恢复为当前账号后,重新打开 Codex 验证 setup 是否不再报错。
NOTEicacls 中的用户名建议写死,不要使用
%USERNAME%:管理员终端中的当前用户可能不是日常使用的账号。
全量扫描
属主被改的不仅是 .git。对项目根目录做遍历,找出所有属主含 CodexSandbox 的目录:
Get-ChildItem 'D:\Projects' -Directory | ForEach-Object { if ((Get-Acl $_.FullName).Owner -like '*Sandbox*') { $_.FullName }}本次共发现 7 处,分布于 4 个项目,包括 .git、.github、__pycache__ 等目录。注意项目根目录属主均正常,异常仅出现在内层,仅检查顶层会遗漏。
排查命令速查
# 查看属主(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