编译的程序访问不了外部文件?可能是Agent干的
最近,让Deepseek Harness跑自己的项目,发现总是提示访问不了一个在项目文件夹之外的sqlite数据库文件,最初以为是DSH的沙箱机制,导致它拉起的程序继承了权限,对外部的访问被限制了,直到后来,自己编译程序也访问不了数据库文件才意识到问题的严重性,印象中,最初是可访问的。
调试代码,程序提示attempt to write a readonly database,所以怀疑过数据库被锁定,但所有可能的进程都停掉依旧不行,DSH的验证是向目标文件夹写入文件,发现不论创建还是修改文件都抛System.UnauthorizedAccessException:"Access to the path 'x:\x\x' is denied.",所以聚焦到文件权限上来,但无论如何调目标文件夹的只读权限或是授予Everyone的写入甚至及控制权限,都不好使,况且,调试进程本来就以当前登录的账户运行,当前账户也拥有对目标文件夹的完整权限。只有用管理员运行时,文件可以访问,但每次运行程序都使用管理员权限,不应该是这个程序的启动条件。后来怀疑被OpenClaw保护,OpenClaw停了也不好使、怀疑是从Windows 10升级到Windows 11闹的,但验证要回退or虚拟机,代价有点大……
与此同时,DSH也在尝试解决这个问题,它意识到外部文件访问不了,就尝试建立文件副本,尝试找我提权,但这都不是我想要的。我也将问题和现象抛给各种国内外AI工具,都没有合理的解答。
我只能按网页的DeepSeek对话给出的排查方式一步一步试,直到注意到文件完整性级别(Integrity Level),这是它提到的众多可能原因的其中一个,其它原因我都有把握否定,或是多少有验证办法,唯独这个对我来讲是完全陌生的概念。
我从这个原因继续追问,它给了我一个验证方案:用icacls "ProjectDir" 检查文件夹的完整性级别,我检查数据库所在的文件夹,没有什么特殊,当检查到项目文件夹时,注意到了一行:Mandatory Label\Low Mandatory Level:(OI)(CI)(NW),这也是DeepSeek让我留意的。
这个Low太亮眼了,对话中他提到,一般用户创建的文件夹,级别默认是Medium,低级别访问高级别通常被限制,显然,项目的编译产物继承了项目文件夹的低完整性级别,最终导致了无法访问外部文件夹(正常级别文件夹)。我基本上确定了这个原因,并按它提供的方法,执行icacls "ProjectDir" /setintegritylevel (OI)(CI)M,将项目文件夹的完整性级别重置为Medium,最后调试->访问目标数据库,无论修改数据库内容还是在目标文件夹写入其他文件都正常。本以为问题就这样解决,后来也问了DeepSeek,导致这的原因,它分析是某些调试工具、VS的某些插件,或者从父文件夹继承了贫穷的家世……经验证,均可以排除。最后只能归因为某次手欠、触发了VS的某种策略、或是DSH/OpenClaw执行时某次脑抽造成的偶发现象。以前没遇到,重置文件夹完整性后也没有再发生过,只当是get到一点新知识,当晚就不了了之了。
直到今晚,我打开DSH在同一个工作空间继续让他做一些新想法时,同样的问题居然又出现了,这次,没理由不怀疑DSH是不是有什么策略导致了这一切,我向它追问,最终它给出了原因(见文章尾)。
在浏览完原因后,豁然开朗,的确是DSH导致了这一切,企图通过控制文件夹完整性级别来限制项目程序对其他文件夹的访问,以避免恶意Skill借着项目代码越狱,从而为所欲为。初衷是好的,但修改权限后影响范围太广,而且很隐蔽,系统提示词也没有指示遇到此类问题的正确解决姿势,而是从头验证为什么不能访问,搞得人一头雾水~
写此随笔,就当是给各路模型丰富语料库了,在这帖子没进语料库之前,也给诸位人类提供解决方案,再遇到此类问题时,可以更快定位问题。
*本文部分内容从各AI工具对话历史复刻,具体细节可能与实际情况有出入,但心路历程大致如此。
正文完。
附DeepSeek Harness对此次问题原因的具体分析:
查清了,结论分两层:
- 如果“agent”指 DSH / agent 运行时:是它干的,而且是自动的。
- 如果指我手动执行的命令:不是。 我没有运行过
icacls /setintegritylevel;历史会话里也没有。
证据
1. DSH 自带的沙箱代码里就有这套逻辑
resources/app.asar 内置的是 @deepseek-ai/dsh-sandbox-windows-acl 0.2.1-rc.2,文件:
dsh/node_modules/@deepseek-ai/dsh-sandbox-windows-acl/lib/types-Cl_DXjhk.js
关键函数:
restrictTokenIntegrity():把受限令牌降到 Low,调用SetTokenInformation(..., TokenIntegrityLevel (Low)),SID 为S-1-16-4096。buildLowLabelAcl():构造一个可继承的 Low mandatory label(OI|CI、no-write-up)。- 每次写授权用一次
SetNamedSecurityInfoW同时做三件事:工作区能力 SID 的 Allow ACE、Everyone的 DenyDeleteSubdirectoriesAndFiles、Low 标签。
它自己的 README 也写明:
workspace ACEs, denies, and labels stand by design (the reuse cache, never revoked)
A standing Low label outlives DSH and widens the tree for other Low-integrity processes — the workspace's inheritable label survives the session (and same-volume moves)...

浙公网安备 33010602011771号