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

标签 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);

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

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

最佳答案

您无法通过 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/

相关文章:

Python Pyinstaller ERRNO 22 无效参数

c++ - window OS下c中UDP包的源IP

C++ 如何让程序在全局范围内检测我的击键?

php - mkdir() 为创建的所有子目录应用 chmod 0777

ubuntu - Capistrano 3 部署 :clean old releases permission error

emacs - 如何使用 Emacs 更改文件的读/写模式?

windows - 使用 Vim 进行提交的错误

c++ - 如何通过编程方式杀掉audiodg.exe进程?

file-permissions - apache 权限被拒绝 : exec of '/usr/sbin/suexec2' failed

java - 有没有办法让 Java 应用程序获得 root 权限?