如何使用WinAPI强制删除受保护的隐藏.git目录并解决访问被拒绝问题
1. 如何强制打开该受保护文件进行修改或删除?
你遇到的权限报错核心原因是.git目录下的文件默认被设置了只读属性,Windows会阻止对只读文件的删除、写入操作,哪怕以管理员身份运行也不例外,按照以下步骤处理即可:
- 调用
GetFileAttributesW接口获取目标文件/目录的属性,如果返回值包含FILE_ATTRIBUTE_READONLY标记,先调用SetFileAttributesW接口,将属性修改为FILE_ATTRIBUTE_NORMAL,清除只读标记后再执行打开操作 - 调整
CreateFile的访问权限参数,不需要请求GENERIC_ALL(该权限包含大量不必要的高权限操作,容易触发权限校验失败),仅请求你实际需要的GENERIC_READ | DELETE即可 - 如果需要打开目录句柄,需要在
dwFlagsAndAttributes参数中额外增加FILE_FLAG_BACKUP_SEMANTICS标记,否则无法正常获取目录句柄 - 目录删除需要按照「先删除子目录下所有文件→再删除空目录」的层级顺序处理,不能直接对非空目录设置
FILE_FLAG_DELETE_ON_CLOSE
2. Windows的文件保护机制具体是如何运作的?
你当前遇到的是普通用户态的文件访问控制机制,核心包含三层逻辑:
- 文件属性校验:文件如果被设置了
FILE_ATTRIBUTE_READONLY只读属性,所有写入、删除请求会被直接拒绝,和账户权限无关,必须先清除只读属性才能执行修改类操作,你测试的rm -r -force就是默认先清除目标文件的只读属性再执行删除,所以可以成功,普通rm不会自动修改只读属性因此报错 - NTFS访问控制列表(DACL)校验:每个文件/目录都关联了独立的DACL列表,列表中定义了不同用户、用户组对该对象拥有的具体权限(读、写、删除、修改权限等),打开文件时系统会对比当前进程的令牌权限和DACL配置,权限不匹配就会返回访问拒绝
- 文件共享锁校验:如果有其他进程已经打开了目标文件,且打开时设置的共享模式不允许你的操作(比如对方没有开启
FILE_SHARE_DELETE),你的删除、写入请求也会被拒绝
3. 你设置的dwShareMode共享模式参数是否正确?
当前的参数是正确的。FILE_SHARE_DELETE | FILE_SHARE_WRITE | FILE_SHARE_READ的配置允许其他进程同时对目标文件进行读、写、删除操作,不会因为其他进程的合法占用导致你打开文件失败,你当前遇到的ERROR_ACCESS_DENIED报错和该参数无关。
内容的提问来源于stack exchange,提问作者Moshe Groot
相关产品推荐
相关产品推荐

