我正在开发一个产品,其中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);
}
答案 0 :(得分:1)
显然这是由第三方软件产品的内核组件引起的(不能真正具体说明)