我正在开发Windows备份应用程序(Go / C ++混合),需要从磁盘备份文件。
我的应用程序
secpol.msc
中显式启用了“备份文件和目录” OpenProcessToken()
和AdjustTokenPrivileges()
为整个过程授予SeBackupPrivilege
遍历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等)。
除防病毒程序外,没有安装特殊的安全软件。
竞争对手的备份软件能够正确备份这些文件。
为什么会发生这种情况?
答案 0 :(得分:1)
此错误可能是由EFS加密的文件引起的,该文件没有密钥。
在这种情况下,CreateFile
在任何情况下都是不可能的。