尽管有FILE_FLAG_BACKUP_SEMANTICS

时间:2018-07-18 02:25:35

标签: winapi backup ntfs shadow-copy

我正在开发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等)。

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

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

为什么会发生这种情况?

1 个答案:

答案 0 :(得分:1)

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

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