【问题标题】:Why can't I open a file for GENERIC_ALL or FILE_ALL_ACCESS using FILE_FLAG_BACKUP_SEMANTICS?为什么我不能使用 FILE_FLAG_BACKUP_SEMANTICS 打开 GENERIC_ALL 或 FILE_ALL_ACCESS 的文件?
【发布时间】:2015-02-14 06:58:49
【问题描述】:

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

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

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

【问题讨论】:

    标签: windows file-permissions


    【解决方案1】:

    您无法通过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,但我不建议使用此选项,除非在故障排除期间,因为这意味着您可能无法获得预期的访问权限。通常最好在您打开文件时立即发现问题,而不是稍后尝试对其进行处理。

    【讨论】:

    • 我从目录的 DACL 中删除了所有授予的访问权限,然后使用 MAXIMUM_ALLOWED (0x02000000) 访问权限打开它,并启用了 SeBackupPrivilegeSeRestorePrivilege。授予的访问权限是0x011F01BF,即文件对象特定权限中缺少FILE_DELETE_CHILD (0x40)。
    • @eryksun:谢谢,很高兴我的观察得到证实。如果有人想知道多余的位是从哪里来的,那就是ACCESS_SYSTEM_SECURITYwhich is determined by the process privileges rather than being part of the DACL.
    • 澄清一下,我没有启用SeSecurityPrivilegeACCESS_SYSTEM_SECURITY 是通过打开备份意图并请求 MAXIMUM_ALLOWED 访问权限来授予的。
    • @eryksun:是的,我看到了同样的行为。如果您使用FILE_FLAG_BACKUP_SEMANTICS,如果您启用了SeSecurityPrivilegeSeBackupPrivilegeSeRestorePrivilege 中的任何一个,您可以获得ACCESS_SYSTEM_SECURITY。如果您不使用FILE_FLAG_BACKUP_SEMANTICS,那么您必须启用SeSecurityPrivilege。不像记录的那样,但不足为奇。
    猜你喜欢
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 2021-09-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-27
    • 2021-09-01
    相关资源
    最近更新 更多