获取联结的目标路径似乎总是在“错误5访问被拒绝”中结束

时间:2017-10-21 22:50:18

标签: c++ winapi reparsepoint

我有一个项目,我必须得到一个交叉点的目标。这是我提出的一些代码:

#include "stdafx.h"
#include <iostream>
#include <Windows.h>

#define BUFSIZE MAX_PATH

using namespace std;


int main()
{
TCHAR Path[BUFSIZE];
DWORD dwRet;
HANDLE hFile;

hFile = CreateFile(L"C:\\Users\\Test\\Documents\\My Videos",
    GENERIC_READ,
    FILE_SHARE_READ,
    0,
    OPEN_EXISTING,
    FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OPEN_REPARSE_POINT,
    0);

if (hFile == INVALID_HANDLE_VALUE)
{
    printf("Could not open file (error %d)\n", GetLastError());
    return 0;
}
dwRet = GetFinalPathNameByHandle(hFile, Path, BUFSIZE, VOLUME_NAME_DOS);
if (dwRet < BUFSIZE)
{
    _tprintf(TEXT("\nThe final path is: %s\n"), Path);
}


CloseHandle(hFile);

//wcout << Path;

return 0;
}

现在,奇怪的是代码很好地为每个目录返回GetFinalPathNameByHandle,除了结点/重新分析点Documents \ My Videos。对于交叉点,它会向GetLastError()抛出“错误5”。有谁知道是什么原因造成的?

1 个答案:

答案 0 :(得分:-1)

我到底了。在任何C ++ API可以打开文件系统对象的句柄之前,您首先必须执行takeown /f "C:\users\test\Documents\My Videos" /r /d y

编辑2:

对于将来读这篇文章的人。上面的代码可以工作,但只有在关键时刻使用takeown命令时才能使用。在takeown使用之前,标准Windows联结上存在Everyone:(DENY)(S,RD)策略,该策略拒绝所有用户读取访问权限。在该策略消失后,该联结也可在Windows资源管理器中使用。

编辑:这是C ++中的工作解决方案,不使用takeown命令:

#define BUFSIZE MAX_PATH

using namespace std;

int main()
{
TCHAR Path[BUFSIZE];
DWORD dwRet;
HANDLE hFile;

hFile = CreateFile(L"C:\\Users\\Test\\Documents\\My Music",
    0,
    0,
    0,
    OPEN_EXISTING,
    FILE_FLAG_BACKUP_SEMANTICS,
    0);

if (hFile == INVALID_HANDLE_VALUE)
{
    printf("Could not open file (error %d)\n", GetLastError());
    return 0;
}
dwRet = GetFinalPathNameByHandle(hFile, Path, BUFSIZE, VOLUME_NAME_DOS);
if (dwRet < BUFSIZE)
{
    _tprintf(TEXT("\nThe final path is: %s\n"), Path);
}

CloseHandle(hFile);

return 0;
}

此代码的产品是C:\users\test\Documents\My Music

的目标路径