获得目标路径的路口似乎总是以“Error 5 Access Denied”结束
我有一个项目,我必须获取路口的目标。这是一些代码,我想出了:获得目标路径的路口似乎总是以“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;
}
现在,奇怪的是,该代码很好的GetFinalPathNameByHandle
返回每个目录除了路口/重分析点的文档\我的视频。对于路口,它会引发GetLastError()
“错误5”。有没有人有一个想法可以导致这种情况?
我到了它的底部。在任何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
所以'CreateFile'返回错误,而不是'GetFinalPathNameByHandle'。为了解决这个问题,你需要或者启用'SE_BACKUP_PRIVILEGE'(如果你有)或者不要求'FILE_LIST_DIRECTORY'访问。并确定 - 你需要开放的重新解析点或它的目标 – RbMm
管理员,系统,和“测试”有完全访问此交界处 - 除DACL的条目否认每个人(S-1-1-0)阅读权(列出)目录。取得所有权并不能解决此问题。您需要请求不访问,其中'CreateFile'将请求Windows API的最小值(同步和读取属性)。无论您是调用'GetFinalPathNameByHandle'来获得最终解析路径(在此情况下不要打开重新分析点)或调用'DeviceIoControl'来读取交汇点的直接目标,这就足够了。 – eryksun
我很抱歉,但我认为你错了。 @eryksun :)从CreateFile到“C:\ users \ test \ Documents \ My Videos”文件夹的所有调用都会失败,直到我拥有所有权。 – Erwin
目标路径,你确信你有错误的调用'GetFinalPathNameByHandle'但不调用'CreateFile'?并说'我的音乐'你没有错误? – RbMm
请勿使用'GENERIC_READ';这不是必需的。该联结有一个拒绝读取(列表目录)访问的ACE。 – eryksun
@eryksun - 是的。这是真的。否认每个人都阅读。如果我们没有备份特权'CreateFile'失败。但是'CreateFile'失败,而不是'GetFinalPathNameByHandle',它接受**任何**访问的文件句柄 – RbMm