[Bug已解决] Windows 项目目录所有者为 BUILTIN\Administrators 时沙箱初始化失败ACL 与所有权解决方案一、现象长什么样你在Windows上用某个「AI 编码应用」它启动时会建一个沙箱sandbox来限制工具能力。但当你打开的项目目录其所有者owner是BUILTIN\Administrators即该目录由管理员创建/取得所有权时沙箱初始化失败应用起不来。 即 GitHub Issues (openai/codex) #31414Codex App on Windows: sandbox setup fails when project folder owner is BUILTIN\Administrators。 本质是Windows 的沙箱/权限隔离机制对「目录的安全描述符owner ACL」有要求当目录所有者是Administrators组而非具体用户时沙箱用来降权的用户/令牌无法获得预期的访问权或沙箱的策略校验拒绝「 Administrators 所有的对象」于是初始化失败。这是个通用的「Windows 文件所有权/ACL 与沙箱权限」问题。 本文聚焦通用技术Windows 的 BUILTIN\Administrators 特殊性、为什么它会导致沙箱/降权失败、如何检查并修正目录所有者与 ACL用 icacls / PowerShell以及「以普通用户身份运行」的最佳实践。用真实可操作命令说明不依赖具体产品。二、背景BUILTIN\Administrators 在 Windows 上的特殊性Windows 里BUILTIN\Administrators是管理员组。它的特殊之处在于UAC用户账户控制即使你是管理员平时运行的进程也是标准用户令牌UAC 过滤除非「以管理员身份运行」才拿到完整管理员令牌由「以管理员身份」创建的目录其owner 是BUILTIN\Administrators这种目录的 ACL 可能只允许 Administrators 组访问普通标准用户令牌进程没权限读写。 沙箱机制通常故意以低权限标准用户运行以隔离工具能力。当它要访问一个Administrators所有的目录时低权限沙箱令牌不在AdministratorsACL 里UAC 过滤掉了→ 访问被拒或沙箱策略显式拒绝在「管理员所有对象」上建立沙箱安全考虑不让降权沙箱碰管理员资产 于是沙箱初始化需要读写项目目录失败。三、为什么「所有者是 Administrators」会让沙箱失败两个角度权限不足沙箱用标准用户令牌跑目录 ACL 只允许Administrators访问 → 沙箱读写被拒 → 初始化失败策略拒绝沙箱设计上不应在管理员所有的目录上建立弱沙箱否则沙箱失去隔离意义或引发提权风险于是主动报错拒绝。 具体到这个 bug项目文件夹在C:\系统盘或被「以管理员运行」的某人创建owner 是BUILTIN\Administrators。应用启动沙箱时无论「权限不足」还是「策略拒绝」都导致失败。 正确的项目目录应由当前标准用户拥有owner 是具体用户ACL 含该用户这样低权限沙箱能正常访问。四、最小可运行检查目录所有者与 ACLPowerShell下面用 PowerShell 演示「如何检查目录所有者」以及修正命令真实命令Windows 环境# 查看目录所有者Security 选项卡信息 (Get-Acl C:\path\to\project).Owner # 若输出 BUILTIN\Administrators → 就是本 bug 的触发条件 # 查看 ACL 明细 (Get-Acl C:\path\to\project).Access | Format-Table IdentityReference, FileSystemRights # 修正把所有者改为当前用户并授当前用户完全控制 $user $env:USERDOMAIN\$env:USERNAME icacls C:\path\to\project /setowner $user icacls C:\path\to\project /grant $user:(OI)(CI)F /TPython 里也可读跨平台用os.stat在 Windows 上得到的是精简信息建议用subprocess调 icaclsimport subprocess def dir_owner(path): out subprocess.run( [powershell, f(Get-Acl {path}).Owner], capture_outputTrue, textTrue, ).stdout.strip() return out print(所有者:, dir_owner(rC:\path\to\project))要点owner 是BUILTIN\Administrators即触发条件改为当前用户并授权即可。五、解决方案一把目录所有者改为当前用户核心最直接修复让项目目录归当前标准用户所有而非 Administrators 组# 以「标准用户」身份运行不要以管理员运行然后 icacls C:\path\to\project /setowner $env:USERDOMAIN\$env:USERNAME icacls C:\path\to\project /grant $env:USERDOMAIN\$env:USERNAME:(OI)(CI)F /T(OI)(CI)表示对象继承/容器继承对子文件/子目录生效F是完全控制/T递归。改完后低权限沙箱标准用户令牌能正常访问初始化成功。六、解决方案二不要「以管理员身份运行」应用根因之一是「以管理员运行」创建了 Administrators 所有的目录。最佳实践是始终以标准用户运行AI 编码应用不右键「以管理员身份运行」项目目录由标准用户进程创建 → owner 是当前用户天然兼容沙箱若必须某些操作提权用按需提权UAC 弹窗而非全程管理员。 沙箱本就是要「低权限」应用自己以管理员跑反而和沙箱目标冲突。七、解决方案三沙箱初始化时检测并给出清晰错误/自动修复应用层应在沙箱初始化前检测目录所有者import subprocess, os def is_admin_owned(path): owner subprocess.run( [powershell, f(Get-Acl {path}).Owner], capture_outputTrue, textTrue, ).stdout.strip() return Administrators in owner def setup_sandbox(path): if is_admin_owned(path): # 清晰提示而非静默失败 raise RuntimeError( f项目目录所有者为 BUILTIN\\Administrators沙箱无法初始化。 f请以标准用户运行并执行\n ficacls {path} /setowner {os.environ[USERDOMAIN]}\\{os.environ[USERNAME]} ) # 正常初始化沙箱...关键错误要清晰告诉用户「是所有者问题、怎么修」而非笼统「沙箱失败」。八、解决方案四用非系统盘 / 用户目录放项目C:\下的目录常被管理员/系统进程碰容易变 Administrators 所有。建议项目放C:\Users\you\...用户目录标准用户所有安全或数据盘D:\projects\...非系统盘权限更干净。 避免把项目放C:\尤其根目录这类易变 Administrators 所有的位置。九、排查清单Windows 沙箱因 Administrators 所有失败Windows 上沙箱初始化失败且项目在 C:\ 或由管理员创建 → 查目录 owner#31414 类。查 owner(Get-Acl path).Owner若为BUILTIN\Administrators即触发。改所有者icacls path /setowner 当前用户/grant 用户:(OI)(CI)F /T。别以管理员运行始终标准用户跑应用项目目录自然归用户。应用检测沙箱初始化前查 owner清晰提示修复命令不静默失败。放用户目录/数据盘避免 C:\ 根目录的 Administrators 所有目录。十、小结Codex App on Windows: sandbox setup fails when project folder owner is BUILTIN\Administratorsopenai/codex #31414的本质是项目目录所有者是BUILTIN\Administrators通常由「以管理员身份运行」创建而 Windows 沙箱以低权限标准用户令牌运行UAC 过滤掉了 Administrators 权限导致沙箱无法访问该目录或沙箱策略主动拒绝在管理员所有对象上建弱沙箱 → 初始化失败。 通用解决方案适用于任何 Windows 上「沙箱/降权访问目录」的场景改所有者icacls path /setowner 当前用户 授权(OI)(CI)F让标准用户拥有目录标准用户运行不以管理员跑应用项目目录天然归用户、兼容沙箱清晰报错应用初始化前查 owner明确提示修复命令不静默失败放对位置项目放用户目录/数据盘避开 C:\ 根目录的 Administrators 所有。 记住Windows 沙箱要低权限运行而BUILTIN\Administrators所有的目录在标准用户令牌下不可访问。让项目目录归当前标准用户所有是沙箱初始化的前提。