获取路口的目标路径似乎总是以 "Error 5 Access Denied" 结尾

Getting target path of junction always seems to end in "Error 5 Access Denied"

我有一个项目,我必须在其中获取交汇点的目标。这是我想出的一些代码:

#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;
}

现在,奇怪的是代码 returns 很好地 GetFinalPathNameByHandle 用于每个目录,除了连接/重新分析点 Documents\My 视频。对于路口,它会抛出 "error 5" 和 GetLastError()。有谁知道是什么原因造成的?

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

编辑 2:

对于以后阅读本文的任何人。上面的代码可以工作,但是只有当你在关头使用takeown命令的时候。在使用 takeown 之前,在标准 Windows 联结上有一个 Everyone:(DENY)(S,RD) 策略,它拒绝所有用户读取访问权限。在 takeown 之后,该策略消失了,连接也可以在 Windows Explorer 中使用。

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

#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

的目标路径