OneDrive For Business中对现有文件调用CreateFile带OPEN_ALWAYS返回ERROR_ACCESS_DENIED
问题原因说明
代码层面问题
- 路径字符串写法错误
你代码中使用的u"D:\OneDrive - 翁悸会\test2.txt"存在两处错误:一是C++字符串内的反斜杠需要转义,\t会被识别为制表符而非路径分隔符,最终拼接出的路径本身无效;二是u前缀生成的是char16_t类型字符串,直接强制转换为LPCWSTR(即wchar_t*)属于类型不匹配的未定义行为,Windows平台下宽字符路径应该使用L前缀生成原生wchar_t字符串。 - 权限请求过度
你传入了GENERIC_ALL作为访问权限参数,该宏包含了读、写、修改ACL、取得所有权等全量文件权限,远高于普通文件读写的需求。
OneDrive For Business 机制层面问题
OneDrive For Business 会通过文件系统筛选器驱动对同步目录下的文件做额外的权限校验,用于实现按需同步、企业数据防泄漏、版本管控等特性:
- 普通读写权限的请求会被正常放行,这也是你通过资源管理器可以正常操作文件的原因
- 当你请求
GENERIC_ALL这类包含特殊操作权限的请求时,就算你的账户拥有普通读写权限,也会被OFB的安全机制拦截,返回ERROR_ACCESS_DENIED错误码 - 个人版OneDrive没有企业级权限管控逻辑,所以不会触发该拦截
- 新建文件时OFB的管控逻辑还未生效,所以你在目标文件不存在时调用不会报错
修复方案
- 修正路径写法,调整权限请求,按需申请对应权限即可:
#include <iostream> #include <Windows.h> int main() { // 用L前缀生成宽字符,反斜杠转义,按需申请读写权限,不要使用GENERIC_ALL HANDLE a = CreateFileW(L"D:\\OneDrive - 翁悸会\\test2.txt", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); DWORD b = GetLastError(); std::cout << a << "\n" << b; }
- 如果确实需要更高操作权限,可以先将对应文件设置为「始终保留在此设备上」,关闭按需同步后再进行操作。
内容的提问来源于stack exchange,提问作者埃博拉酱
相关产品推荐
相关产品推荐

