【发布时间】:2016-02-22 20:27:18
【问题描述】:
我正在开发一种产品,其中OpenFileById() 在其他可访问的文件和文件夹上出现ERROR_ACCESS_DENIED 失败(意味着CreateFile() 在由具有相同访问级别/共享模式的路径指定的同一文件或文件夹上等成功)。
我正在使用备份语义,因此我还可以获得文件夹句柄; SE_BACKUP_NAME 和 SE_RESTORE_NAME 权限已启用。除了这台机器(Windows 8.1)之外,此代码适用于其他任何地方。
该进程在本地系统下作为服务运行,我尝试让他们将其更改为具有管理员权限的其他帐户,但这也不起作用。有问题的文件/文件夹尚未打开以供删除(根据文档,这是此功能失败并显示 ERROR_ACCESS_DENIED 的一种情况)。
我没有对该机器的物理访问权限,因此无法进行内核调试或类似的操作。有没有人遇到过这个?
简而言之,这就是我想要做的事情:
hRoot = ::CreateFileA(szRootPath, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);
if (hRoot != INVALID_HANDLE_VALUE)
{
FILE_ID_DESCRIPTOR fileId;
fileId.dwSize = sizeof(fileId);
fileId.Type = FileIdType;
fileId.FileId.QuadPart = nId;
hFile = ::OpenFileById(hRoot, &fileId, SYNCHRONIZE | FILE_READ_ATTRIBUTES, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL, FILE_FLAG_BACKUP_SEMANTICS);
if (hFile != INVALID_HANDLE_VALUE)
{
...
::CloseHandle(hFile);
}
::CloseHandle(hRoot);
}
【问题讨论】:
-
您已经清楚地解释了您的问题,但是如果没有一些代码就很难提供帮助。介意发布一些吗?
-
您正在使用不支持通过 id 打开的文件系统的机器上工作吗?
-
这是我在某个时候的想法,但不是。这是卷信息:最大组件长度:255 文件系统名称:NTFS 是读写支持区分大小写的文件名保留文件名的大小写支持文件名中的 Unicode 保留和强制 ACL 支持基于文件的压缩支持磁盘配额支持稀疏文件支持重解析点支持对象标识符 支持加密文件系统 支持命名流 支持事务 支持硬链接 支持扩展属性 支持通过 FileID 打开 支持 USN 日志