我正在开发一个需要从磁盘备份文件的Windows备份应用程序(混合Go/C++(。
我的应用程序
- 在"Backup Operators"组中以用户身份运行,并且在
secpol.msc
中明确启用了"备份文件和目录"> - 调用
OpenProcessToken()
和AdjustTokenPrivileges()
为整个进程授予SeBackupPrivilege
,成功 - 成功获取磁盘的VSS快照
-
遍历VSS快照中的所有文件,然后按如下方式尝试备份它们:
CreateFile( path, GENERIC_READ, FILE_SHARE_READ, NULL, // SecurityAttributes OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS|FILE_FLAG_SEQUENTIAL_SCAN NULL // TemplateFile );
-
调用
BackupRead()
读取文件流。
这通常工作正常,并且我可以成功读取我的用户帐户通常被拒绝读取访问的文件(例如C:WindowsSystem32configsystemprofile
(。
但尽管如此,一些"顽固"文件仍然会出现错误,从CreateFile
:0x5ERROR_ACCESS_DENIED
("访问被拒绝"(。
我知道那些"顽固"的文件不是重分析点。
这些文件存在于本地、内部连接的SATA、NTFS磁盘驱动器上,而不是网络驱动器或任何外来的驱动器。
"顽固"文件都是文件,而不是目录。
它们是一系列文件类型(docx、fla、swf、.DS_Store…(。
除了防病毒程序之外,没有安装任何特殊的安全软件。
竞争对手的备份软件能够毫无错误地备份这些文件。
为什么会发生这种情况
此错误可能是由EFS加密文件引起的,该文件不存在密钥。
在这种情况下,CCD_ 10在任何情况下都是不可能的。