我正在尝试使用 FILE_FLAG_BACKUP_SEMANTICS
来绕过文件权限,但如果我请求 GENERIC_ALL
或等效的 FILE_ALL_ACCESS
它就不起作用作为访问掩码。 CreateFile
函数返回 ERROR_ACCESS_DENIED
。
例如,
h = CreateFile(L"c:\\working\\backup-semantics-test\\xyzzy\\test.txt",
FILE_ALL_ACCESS,
FILE_SHARE_WRITE | FILE_SHARE_READ | FILE_SHARE_DELETE, 0,
OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0);
备份和恢复权限已启用。 (显然,如果我对相关文件有完全权限,它就可以工作;这个问题是关于我没有权限但有备份和恢复权限的情况。)
出了什么问题,我该怎么办?
最佳答案
您无法通过 FILE_FLAG_BACKUP_SEMANTICS
获得 FILE_DELETE_CHILD
访问权限。这似乎是一个特例,尽管尚不清楚这是否是故意的。 (在 Windows 7 SP1 x64 中测试。)
您可以通过备份语义获得所有其他访问权限,包括DELETE
,因此无需获得FILE_DELETE_CHILD
。只需将其从请求中排除:
h = CreateFile(L"c:\\working\\backup-semantics-test\\xyzzy\\test.txt",
FILE_ALL_ACCESS & ~FILE_DELETE_CHILD,
FILE_SHARE_WRITE | FILE_SHARE_READ | FILE_SHARE_DELETE, 0,
OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0);
如果可能,只请求您实际需要的那些权限。就我而言,我打算调用 SetFileShortName
,因此我将访问掩码设置为 GENERIC_WRITE|DELETE
,如文档所述。
另一个选项是 MAXIMUM_ALLOWED
但我不建议使用此选项,除非在故障排除期间,因为这意味着您可能无法获得您期望的访问权限。通常最好在打开文件后立即发现问题,而不是等到您尝试对其执行某些操作时才发现问题。
关于windows - 为什么我不能使用 FILE_FLAG_BACKUP_SEMANTICS 打开 GENERIC_ALL 或 FILE_ALL_ACCESS 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27496612/