OpenFileById 失败并显示ERROR_ACCESS_DENIED

OpenFileById fails with ERROR_ACCESS_DENIED

本文关键字:ACCESS DENIED ERROR 显示 失败 OpenFileById      更新时间:2023-10-16

我正在开发一种产品,该产品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);
}

显然这是由第三方软件产品的内核组件引起的(无法真正详细说明)