我正在开发一个需要从磁盘备份文件的 Windows 备份应用程序(混合 Go / C++)。
我的应用程序
- 以“备份操作员”组中的用户身份运行,并且在“备份文件和目录”中明确启用
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:\Windows\System32\config\systemprofile
)。
但尽管如此,一些“顽固”文件仍然会给出错误,来自CreateFile
:0x5 ERROR_ACCESS_DENIED
(“访问被拒绝”)。
我知道“顽固”文件不是重解析点。
这些文件存在于本地、内部连接的 SATA、NTFS 磁盘驱动器上——而不是网络驱动器或任何外来驱动器。
“顽固”文件都是文件,而不是目录。
它们是一系列文件类型(docx、fla、swf、.DS_Store、...)。
除了防病毒程序之外,没有安装任何特殊的安全软件。
竞争对手的备份软件能够正确备份这些文件。
为什么这可能会发生?