【问题标题】:CreateFile returns ERROR_ACCESS_DENIED despite FILE_FLAG_BACKUP_SEMANTICS尽管 FILE_FLAG_BACKUP_SEMANTICS,CreateFile 返回 ERROR_ACCESS_DENIED
【发布时间】:2018-12-25 19:45:27
【问题描述】:

我正在开发一个需要从磁盘备份文件的 Windows 备份应用程序(混合 Go / C++)。

我的申请

  1. 以“备份操作员”组中的用户身份运行,并且在secpol.msc 中明确启用“备份文件和目录”
  2. 调用OpenProcessToken()AdjustTokenPrivileges()为整个过程授予SeBackupPrivilege,成功
  3. 成功获取磁盘的 VSS 快照
  4. 遍历 VSS 快照中的所有文件,然后尝试按如下方式备份它们:

    CreateFile( path, GENERIC_READ, FILE_SHARE_READ, NULL, // SecurityAttributes OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS|FILE_FLAG_SEQUENTIAL_SCAN NULL // TemplateFile );

  5. 调用BackupRead()读取文件流。

这通常可以正常工作,并且我可以成功读取我的用户帐户通常会被拒绝读取访问的文件(例如C:\Windows\System32\config\systemprofile)。

但尽管如此,一些“顽固”文件仍然会报错,来自CreateFile: 0x5 ERROR_ACCESS_DENIED(“拒绝访问”)。

我知道“顽固”文件不是重解析点。

文件存在于本地、内部连接的 SATA、NTFS 磁盘驱动器上 - 而不是网络驱动器或任何外来驱动器。

“顽固”文件都是文件,而不是目录。

它们是一系列文件类型(docx、fla、swf、.DS_Store、...)。

除了防病毒程序之外,没有安装任何特殊的安全软件。

竞争对手的备份软件能够正确备份这些文件。

为什么会发生这种情况?

【问题讨论】:

  • 在失败时调用 RtlGetLastNtStatus() 而不是 GetLastError()。哪个是状态?
  • 如果文件深深嵌入文件夹结构或文件名中有奇怪的字符,您可能需要 POSIX_SEMANTICS 来获取它。
  • 另一种可能性是文件已被 MoveFileEx 移动/删除,并且移动/删除正在等待重新启动
  • POSIX 语义标志几乎没用,除了允许CreateFile 能够创建目录。使用默认系统配置(从 Windows XP 开始),它甚至不允许区分大小写的打开方式。它不允许名称中出现“奇怪的字符”,甚至不绕过正常的 DOS 路径规范化(就像使用“\\?\”前缀一样)。

标签: winapi backup ntfs shadow-copy


【解决方案1】:

此错误可能是由 EFS 加密的文件引起的,该文件没有密钥。

在这种情况下CreateFile在任何情况下都是不可能的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多