我尝试使用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);
启用了备份和还原权限。 (显然,如果我对相关文件具有完全权限,它就有效;这个问题是关于我没有权限但具有备份和恢复权限的情况。)
出了什么问题,我该怎么办呢?
答案 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
但我不建议使用此选项,但在故障排除期间除外,因为这意味着您可能无法获得您期望的访问权限。通常最好在打开文件后立即发现问题,而不是稍后在尝试使用文件时发现问题。