获取路口的目标路径似乎总是以 "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
的目标路径
我有一个项目,我必须在其中获取交汇点的目标。这是我想出的一些代码:
#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