为什么我不能使用FILE_FLAG_BACKUP_SEMANTICS为GENERIC_ALL或FILE_ALL_ACCESS打开文件?

时间:2014-12-16 02:34:09

标签: windows file-permissions

我尝试使用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);

启用了备份和还原权限。 (显然,如果我对相关文件具有完全权限,它就有效;这个问题是关于我没有权限但具有备份和恢复权限的情况。)

出了什么问题,我该怎么办呢?

1 个答案:

答案 0 :(得分:1)

您无法通过FILE_DELETE_CHILD获取FILE_FLAG_BACKUP_SEMANTICS访问权限。这似乎是一个特例,尽管这是否是故意的并不明显。 (在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但我不建议使用此选项,但在故障排除期间除外,因为这意味着您可能无法获得您期望的访问权限。通常最好在打开文件后立即发现问题,而不是稍后在尝试使用文件时发现问题。