DeepSeek Harness Windows 启动即崩:install_dir_access ACL 排查
7-Zip 退出码 2、事件日志 Exception 0x80000003、双击之后什么都不发生——这三个症状在 Windows 上其实是同一条链:安装目录的 DACL 里有一个 AppContainer 包 SID,却没有 ALL APPLICATION PACKAGES 的对应项,Chromium 的 install_dir_access 检查直接把主进程判死。 社区核对源码后确认这是 Electron/Chromium 的检查,不是 DSH 沙箱本身;修复脚本随包提供,但重装和清 AppData 都不会碰它(#10863、#10983)。
这篇按实验顺序写:先取证,再做三组单变量对照,最后才动手改 ACL。
DeepSeek Harness 实验一:只加 --enable-logging,把结论抓出来
--enable-logging 是唯一不改任何系统状态的取证手段:它只多写一份 stderr,就能告诉你这次崩溃到底是不是 install_dir_access。
- 完全退出 DSH,包括托盘图标和任务管理器里的残留进程。
- 从命令行启动:
"<安装目录>\DeepSeek Harness.exe" --enable-logging。 - 观察 stderr,找
install_dir_access这一行。命中的长这样:
FATAL:electron\shell\browser\win\install_dir_access.cc:52]
Sandboxed processes cannot read D:\deepseekherness:
its ACL has an entry for an AppContainer package SID
but none for ALL APPLICATION PACKAGES...
- 同时看事件查看器 → Windows 日志 → 应用程序,找 Event 1000。社区记录到的形态是
Exception 0x80000003,faulting module 就是 exe 自身。 - 如果 stderr 里没有
install_dir_access,这篇的结论不适用,停在这里换方向查。
一个前提要记住:提示里说的「packages 不能读」,指的是沙箱里的渲染进程读不到 icudtl.dat 这类安装树文件,不是你的项目目录有问题。
DSH插件 实验二:--no-sandbox 只当信号,不当方案
加 --no-sandbox 能启动,恰恰证明问题在 Chromium 的安装目录访问检查这一段;它是分诊信号,不是修复。
- 用
--no-sandbox启动一次,确认窗口能出来。 - 再试
--disable-gpu、--disable-gpu-sandbox,社区实测这两个都无效——无效反而有价值,说明不是 GPU 相关,基本锁定沙箱的目录访问检查。 - 修好 ACL 之后,务必把
--no-sandbox去掉再验一次,别让它留在快捷方式里。
DeepSeek Harness 实验三:换一个可写路径,区分「安装器问题」和「目录问题」
安装阶段就失败时,换路径重装是最干净的单变量实验:装得上说明目标目录那条链的权限有问题,装不上才是安装器或临时目录的问题。
- 在一个新盘或新建目录里试装,比如
D:\DSH\,确保它是你手动新建的普通目录。 - 如果原路径是
%LOCALAPPDATA%\Programs这类继承来的目录,特别值得换——社区遇到的安装日志是Cannot create folder : 拒绝访问指向locales、resources,7-Zip 在解压第一步就停了。 - 两种路径都失败,再怀疑安装器本身;只有原路径失败,直接去查那条链的 ACL。顺手把
TEMP也换成另一块盘上的空目录,避免临时目录被打过 Low 完整性标签。
DeepSeek插件 实验四:两台机器 icacls 对比,直接看差异
把故障机与正常机的 icacls 输出并排放,差异一眼可见:故障机的父目录多了 S-1-15-3-1024-* 和包 SID S-1-15-2-<哈希>,却没有任何 ALL APPLICATION PACKAGES 条目。
- 在故障机上执行
icacls "D:\Application",把输出存成文件。 - 在正常机上执行同一条命令,也存下来。
- 逐行对齐,重点看三类条目:
S-1-15-3-*(孤立 AppContainer SID)、S-1-15-2-<哈希>(具体包 SID)、S-1-15-2-1/S-1-15-2-2(知名组)。 - 故障机的典型形态是前两类有、后两类没有;正常机通常一条 AppContainer 条目都没有,安装目录继承的是普通 DACL,压根不触发这项检查。
DeepSeek Harness 修复:先跑随包脚本,再考虑手工 icacls
官方包的脚本是首选,因为它按祖先优先顺序删外来包 ACE,并在同一条链上补齐 WRITE_DAC/WRITE_OWNER;每处改动都备份、回读校验、打印回滚命令。
- 打开一个非受限的 PowerShell 窗口(不要在 DSH 沙箱里的 shell 里跑)。
- 先判断包 SID 到底写在哪一层:如果
icacls D:\里就有,那-Path应该是D:\,而不是安装目录。 - 执行:
& '<skill-dir>\scripts\diagnose-windows-sandbox-acl.ps1' `
-Path '<install-dir-or-volume-root>' `
-AllowRoot '<same-or-higher-dir>' `
-Out '<recovery-dir>'
- 看输出:脚本会删掉显式的
S-1-15-2-*允许 ACE(结尾是 1 或 2 的知名组除外),并补权限。 - 如果它拒绝处理(重解析点、受管应用目录),按它打印的回滚命令准备好,再用
icacls <dir> /save导出 ACL 后手工改。
最小手工修复是把缺失项补上,两个知名组一起给:
icacls "<安装目录>" /grant "*S-1-15-2-1:(OI)(CI)(RX)" "*S-1-15-2-2:(OI)(CI)(RX)" /T
社区在 rc.3 标签(1f81c047)和 master(22ddee3)上都确认脚本存在;报告者按这条命令执行后,不需要任何启动参数就能正常启动。
DSH插件 为什么重装一定无效
ACL 属于目录,不属于程序文件;就地更新会继承它找到的 ACL,卸载器清理的是应用数据而不是父目录 ACL,所以重装一遍等于把同一个坏环境再铺一次。
- 先确认你已经排除了「文件没写完」这一类:那是另一个问题(runtime 目录为空),症状是 ENOENT 而不是 0x80000003。
- 不要靠删
%LOCALAPPDATA%里的应用数据来试,社区明确说卸载器只动这部分。 - 修完 ACL 后重启,再用
--enable-logging验一次,stderr 里不再出现install_dir_access才算结束。 - 记录下你改过哪一层,下次更新如果复发,先看更新器有没有重新继承坏 ACL。
注意事项
- 不要在卷根上大范围
icacls /T。先icacls /save导出,改完能回滚再动手。 S-1-15-2-1和S-1-15-2-2是两个不同的知名组,社区案例里两个都补才恢复。- 脚本拒绝执行不等于脚本有缺陷。它明确拒绝重解析点和受管应用目录,这时按提示手工处理。
--no-sandbox别写进日常快捷方式,它关掉的是整个渲染进程沙箱。- 升级后复查。更新器目前不补授 AAP ACE,坏 ACL 会跟着文件一起被继承。
如果你的日志里压根没有 install_dir_access,说明这次崩溃不是 ACL 这一条,回到 0xC0000142 那篇按宿主形态重新分诊。相关排查见 DeepSeek Harness Windows 子进程报 0xC0000142:受限令牌与宿主定位。
常见问题
先用 --enable-logging 启动 DeepSeek Harness 一次,看 stderr 里有没有 install_dir_access。有这一行就说明 Chromium 的安装目录访问检查失败了,通常是 DACL 里有 AppContainer 包 SID 却缺 ALL APPLICATION PACKAGES(S-1-15-2-1)。没有这一行就换方向。
因为 DeepSeek Harness 的启动崩溃挂在目录 ACL 上,不在程序文件里。社区核对的结论是:就地更新会继承已有 ACL,卸载器只清理应用数据不清理父目录 ACL,所以重装不会补回 ALL APPLICATION PACKAGES 这一项。
不算,--no-sandbox 只是让 DeepSeek Harness 绕过了 Chromium 的安装目录访问检查。能启动说明宿主跑在 Chromium 沙箱里且该项检查失败,正确做法是修 ACL 或用随包脚本删掉孤立包 ACE,而不是长期关掉沙箱。
多数时候不是,问题在 DeepSeek Harness 安装目标目录的权限,而不是安装包坏了。先换一个确定可写的路径装一次,比如新建 D:\DSH\;装得上说明问题在目标目录那条链的权限。也可以顺手换一个 TEMP 目录,避免临时目录被打过 Low 完整性标签。
用非受限身份运行 DeepSeek Harness 随包的 diagnose-windows-sandbox-acl.ps1,-Path 指向真正带包 SID 的那一层(可能是卷根而不是安装目录),-AllowRoot 不低于它,-Out 给一个恢复目录。脚本会先备份、改完回读校验、打印回滚命令,遇到重解析点或受管应用目录会直接拒绝。
相关术语
- install_dir_access
- install_dir_access 是 Chromium 在 Windows 上对安装目录做的沙箱访问检查,位于 install_dir_access.cc。当安装目录 DACL 含 AppContainer 包 SID 却缺少 ALL APPLICATION PACKAGES 时,检查失败并让主进程 FATAL 退出。— https://github.com/deepseek-ai/deepseek-harness/discussions/10863
- ALL APPLICATION PACKAGES(S-1-15-2-1)
- ALL APPLICATION PACKAGES(S-1-15-2-1)是 Windows 的知名组 SID,代表所有 AppContainer 应用包。安装目录 DACL 出现任何包 SID 时必须同时给它读取执行权限,否则 Chromium 沙箱进程读不到安装树。— https://github.com/deepseek-ai/deepseek-harness/discussions/10983
- AppContainer 包 SID
- AppContainer 包 SID 是标识某个具体应用包的 SID,形如 S-1-15-2-<哈希>。它出现在安装目录 DACL 里通常意味着有别的沙箱工具或旧版本给目录盖过章,是启动崩溃的常见来源。— https://github.com/deepseek-ai/deepseek-harness/discussions/10983
- diagnose-windows-sandbox-acl.ps1
- 这个 PowerShell 脚本是 deepseek-harness 沙箱包随附的 ACL 诊断修复工具(diagnose-windows-sandbox-acl.ps1)。它按祖先优先顺序删除外来的 AppContainer 包 ACE、补齐缺失的 WRITE_DAC/WRITE_OWNER,并在每次改动前后做备份与回读校验。— https://github.com/deepseek-ai/deepseek-harness/discussions/10863
来源
- #10863 — 卷根 ACL 含包 SID 但缺 ALL APPLICATION PACKAGES 时启动即崩· deepseek-ai(GitHub Discussions)
- #10983 — 安装目录继承孤立 AppContainer SID 但缺少 ALL APPLICATION PACKAGES 授权· deepseek-ai(GitHub Discussions)
- #11318 — Windows 客户端启动报错,加 --no-sandbox 后可正常启动· deepseek-ai(GitHub Discussions)
- #11369 — 0.2.1-rc.4 安装包安装失败(7-Zip exit code 2)· deepseek-ai(GitHub Discussions)
- deepseek-ai/deepseek-harness(沙箱包 README)· GitHub