OpenFileById因ERROR_ACCESS_DENIED而失败

时间:2016-02-22 20:27:19

标签: c++ windows winapi

我正在开发一个产品,其中OpenFileById()失败,ERROR_ACCESS_DENIED文件和文件夹无法访问(意味着CreateFile()在由路径指定的同一文件或文件夹上相同的访问级别/共享模式等成功)。

我正在使用备份语义,所以我也可以获得文件夹的句柄;已启用SE_BACKUP_NAMESE_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);
}

1 个答案:

答案 0 :(得分:1)

显然这是由第三方软件产品的内核组件引起的(不能真正具体说明)