2017-10-21 74 views
0

我有一个项目,我必须获取路口的目标。这是一些代码,我想出了:获得目标路径的路口似乎总是以“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”。有没有人有一个想法可以导致这种情况?

+1

目标路径,你确信你有错误的调用'GetFinalPathNameByHandle'但不调用'CreateFile'?并说'我的音乐'你没有错误? – RbMm

+1

请勿使用'GENERIC_READ';这不是必需的。该联结有一个拒绝读取(列表目录)访问的ACE。 – eryksun

+1

@eryksun - 是的。这是真的。否认每个人都阅读。如果我们没有备份特权'CreateFile'失败。但是'CreateFile'失败,而不是'GetFinalPathNameByHandle',它接受**任何**访问的文件句柄 – RbMm

回答

-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

+1

所以'CreateFile'返回错误,而不是'GetFinalPathNameByHandle'。为了解决这个问题,你需要或者启用'SE_BACKUP_PRIVILEGE'(如果你有)或者不要求'FILE_LIST_DIRECTORY'访问。并确定 - 你需要开放的重新解析点或它的目标 – RbMm

+2

管理员,系统,和“测试”有完全访问此交界处 - 除DACL的条目否认每个人(S-1-1-0)阅读权(列出)目录。取得所有权并不能解决此问题。您需要请求不访问,其中'CreateFile'将请求Windows API的最小值(同步和读取属性)。无论您是调用'GetFinalPathNameByHandle'来获得最终解析路径(在此情况下不要打开重新分析点)或调用'DeviceIoControl'来读取交汇点的直接目标,这就足够了。 – eryksun

+0

我很抱歉,但我认为你错了。 @eryksun :)从CreateFile到“C:\ users \ test \ Documents \ My Videos”文件夹的所有调用都会失败,直到我拥有所有权。 – Erwin

相关问题