DeepSeek Harness Windows 沙箱 0xC0000142:桌面端与 dsh web 分诊
一条最普通的 echo ok,在 Windows 桌面版的 workspace-write 下返回 0xC0000142,stdout 和 stderr 一个字都没有——这不是命令写错,是受限子进程在 DLL 初始化阶段就死了。 同一个 DSH、同一台机器,换成 dsh web 启动就正常,这一个对照就能把范围缩到「宿主形态」;社区在 Win11 26200 和 Win10 19045 上都复现过同一个形态(#10483、#10706)。
DeepSeek Harness 分诊:先问三个问题,别急着改配置
三个判据按顺序问:桌面端挂不挂、dsh web 挂不挂、是所有 exe 都挂还是只有 PowerShell 挂。三个答案组合起来,基本就能落到三条成因中的一条。
- 桌面端新建会话,权限选「工作区内修改」,让 Agent 执行
echo ok,记下退出码。看到3221225794或0xC0000142就进了这一类。 - 同一条命令切到「完全权限」(danger-full-access)再跑。能跑通,说明令牌构造、ACL、路径都没问题,故障只在受限路径上。
- 在同一个工作区改用
dsh web启动(Node 宿主),切 workspace-write 再跑一次。这一步是整篇的分水岭。 - 如果手边有
--no-sandbox之类的启动参数,也试一次;能起说明是 Chromium 的安装目录检查,不在本文范围。
对照结果可以直接查表:
| 桌面端 | dsh web | 判断方向 |
|---|---|---|
| 全挂 | 正常 | 控制台缺失(成因一) |
| 全挂 | 正常,且只有 PowerShell 挂 | PowerShell 的控制台依赖 |
| 全挂 | 全挂 | 路径 DACL(成因三) |
加 --no-sandbox 能起 | — | 安装目录 ACL,另文处理 |
DSH插件 成因一:GUI 宿主没有控制台,受限子进程起不来
桌面端是 Electron GUI 子系统进程,天生没有控制台;受限令牌下子进程又建不出可用的控制台,conhost 初始化失败,进程在 DLL 初始化阶段就退出,所以没有任何输出。
- 确认宿主类型:任务管理器里看
DeepSeek Harness.exe的父进程,如果是explorer.exe,就是 GUI 启动。 - 用
dsh web在同一个工作区复跑同一条命令。web 版由node.exe启动,从终端继承了真实控制台,整条 runner 链都有控制台。 - 如果 web 版正常,基本可以确认是「宿主无控制台」,不需要再动 ACL。
- 社区核对源码时还查了发布包:当前构建的
app.asar里ensureWindowsConsoleHost和AllocConsole都是 0 处,说明那个「给 Electron 补控制台」的 trampoline 修复(a1caef3)没有进这个构建。
这也解释了为什么「从终端启动桌面版」同样失败:GUI 子系统进程不会附加父进程的控制台。
DeepSeek Harness 成因二:CREATE_NEW_CONSOLE 是真正的失败点
受限令牌加「需要新建控制台」的组合必挂;能继承已有控制台、或者完全不建控制台,都能正常起。六组宿主/标志对照把这一点钉死了。
社区做过一组 A–F 对照,只改宿主进程和 creationFlags:
| 组 | 宿主 | 标志 | 结果 |
|---|---|---|---|
| A | node.exe(有控制台) | 0(继承) | 成功 |
| B | node.exe | CREATE_NEW_CONSOLE | 0xC0000142 |
| C | node.exe | DETACHED_PROCESS | 成功 |
| D | DeepSeek Harness.exe(GUI) | 0(被迫新建) | 0xC0000142 |
| E | DeepSeek Harness.exe | DETACHED_PROCESS | cmd 成功 |
| F | DeepSeek Harness.exe | 0 | powershell 5.1 失败 |
两个后续实验值得记:给 runner 加隐藏控制台(AllocConsole + SW_HIDE)后,PowerShell 的内置命令能跑了,但由它再去起外部程序仍然失败;改成 DETACHED_PROCESS 后 cmd 能跑,PowerShell 却连 -Command 都不执行,因为 PowerShell 的 ConsoleHost 需要真实控制台。
所以「加个隐藏控制台就好了」只对了一半:它证明了根因,但没解决句柄继承。
DeepSeek插件 成因三:路径 DACL 带外来包 SID,跑随包脚本
如果每条命令都挂、跟命令内容和 cwd 无关,还要考虑第三种:子进程必须读的某个路径,其 DACL 里带着别的 AppContainer 工具的包 SID,低完整性令牌打不开。
官方包的 README(packages/sandbox/sandbox-windows-acl/README.md)写明了两条已文档化的成因和一条结构性限制:
- 保活组(登录 SID + Everyone)不在令牌里。
- 子进程用
CREATE_NO_WINDOW/CREATE_NEW_CONSOLE创建,README 注明控制台隔离不可用。 - 路径 DACL 带外来包 SID——以前的沙箱工具或旧版 DSH 给工作区、安装树盖过章,就会命中这一条。
针对第三条,包里带了一个诊断加修复脚本,用非受限身份运行:
& '<skill-dir>\scripts\diagnose-windows-sandbox-acl.ps1' `
-Path '<workspace-or-install-dir>' `
-RecoveryDir '<recovery-dir>'
脚本会备份并校验每一处 DACL 改动、在源头删除外来包 ACE、拒绝处理重解析点与托管应用目录,最后打印回滚命令。rc.2(687f282e)的发布包里已经有这个脚本,不用等 rc.3。
DeepSeek Harness 为什么卸载重装没有用
ACL 挂在目录上,不在程序文件里;卸载程序不会去补 ACE,清 AppData 也不会。所以「重装一遍」对这三条成因一条都不生效。
- 先别重装,按上面的分诊表确认方向。
- 需要跑修复脚本时,从非受限制的 PowerShell 窗口跑,不要在 DSH 沙箱里的 shell 跑。
- 脚本必须指定
RecoveryDir,改之前留备份,出问题按它打印的命令回滚。 - 如果脚本报「nothing to repair」,说明不属于第三条,回到成因一或成因二。
- 另有一种「重装后应用直接起不来」是卸载器留下的问题,和 shell 的 0xC0000142 是两件事,别混在一起查。
DSH插件 注意事项
下面这些做法会加重问题或掩盖真因,先避开再谈修复。
- 别让长期方案停在 danger-full-access。它是分诊工具,不是修复。
- 不要同时改令牌、ACL 和启动标志。一次一个变量,否则复现结果没有意义。
--no-sandbox只当信号用。它能起说明是安装目录访问检查那一层,长期这么跑等于关掉浏览器沙箱。- Windows 10 和 Windows 11 都会命中。社区在 19045、22621 上都复现过,别以为是系统版本门槛。
- 先记版本号和提交。rc.2 与 rc.3 的差别会影响你判断「是不是已经修了」。
如果 dsh web 能跑、桌面端不能,最省事的临时方案就是先用 web 版干活;要留在桌面端,就得等宿主侧补上控制台 trampoline。相关排查见 DeepSeek Harness Windows 子进程报 0xC0000142:受限令牌与宿主定位。
常见问题
先在 DeepSeek Harness 里做宿主对照:同一条 echo ok 分别用桌面端和 dsh web 跑一次。桌面端失败、dsh web 正常,就锁定「GUI 宿主没有控制台」这一条;两边都失败才去查路径 DACL。这个对照比改任何配置都省时间。
因为 DeepSeek Harness 桌面端是 Electron GUI 子系统进程,不会附加父进程的控制台。社区实验里 A 组(node 宿主、继承控制台)能起,D 组(GUI 宿主、被迫新建控制台)必挂,差别只在宿主形态,与启动方式无关。
会造成,DeepSeek Harness 的受限子进程一旦需要新建控制台就会返回 0xC0000142。社区的六组对照里,只要受限子进程需要新建控制台就失败,能继承已有控制台或完全不建控制台则成功。给 runner 加隐藏控制台后 PowerShell 内置命令能跑,但它再去起外部程序仍然失败。
只有当路径 DACL 里带着别的 AppContainer 包 SID 时,DeepSeek Harness 随包的这个脚本才有用。脚本随包提供,用非受限身份运行并指定 -Path 和 -RecoveryDir,会先备份再改,最后打印回滚命令。报 nothing to repair 就说明不属于这一类。
不能,重装 DeepSeek Harness 解决不了 workspace-write 的 0xC0000142。ACL 挂在目录上而不是程序文件里,卸载程序不会补 ACE,清 AppData 也不会。社区核对后明确说重装救不了这三条成因,只能按分诊表逐条定位。
相关术语
- 0xC0000142
- 0xC0000142 是 Windows 的 STATUS_DLL_INIT_FAILED 退出码,表示进程在加载器/DLL 初始化阶段失败,子进程连 stdout/stderr 都来不及产生。它在沙箱场景里通常指向控制台创建或令牌受限,而不是命令本身写错。— https://github.com/deepseek-ai/deepseek-harness/discussions/10483
- workspace-write
- workspace-write 是 DeepSeek Harness 的一种文件策略,允许在工作区内写入、对工作区外只读,通过受限令牌与 ACL 实现隔离。它承诺的是写入边界,不是「进程无法初始化」,所以初始化失败属于缺陷而非设计。— https://github.com/deepseek-ai/deepseek-harness
- CREATE_NEW_CONSOLE
- CREATE_NEW_CONSOLE 是 Windows CreateProcess 的创建标志,要求为新进程分配一个新控制台。在受限令牌下新建控制台会在 conhost 初始化阶段失败,是 0xC0000142 的已知触发点之一。— https://github.com/deepseek-ai/deepseek-harness/discussions/10706
- diagnose-windows-sandbox-acl.ps1
- 这个 PowerShell 脚本是 deepseek-harness 沙箱包随附的诊断与修复工具(diagnose-windows-sandbox-acl.ps1),用于检查并清理路径 DACL 中外来的 AppContainer 包 ACE。它必须用非受限身份运行,会备份并校验每处改动,同时拒绝处理重解析点。— https://github.com/deepseek-ai/deepseek-harness/discussions/10789
来源
- #10483 — workspace-write makes every confined command exit 0xC0000142· deepseek-ai(GitHub Discussions)
- #10706 — Windows 10 19045 下工作区沙箱模式无法启动 shell(0xC0000142)· deepseek-ai(GitHub Discussions)
- #10789 — README 列明的三类成因与随包诊断脚本· deepseek-ai(GitHub Discussions)
- #10898 — shell 工具 100% 失败;重装后应用无法启动· deepseek-ai(GitHub Discussions)
- deepseek-ai/deepseek-harness(源码与沙箱 README)· GitHub