Получение целевого пути соединения всегда заканчивается "Ошибка 5: доступ запрещен"

У меня есть проект, в котором я должен получить цель соединения. Вот некоторый код, который я придумал:

#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. Для соединений это выдает "ошибку 5" с GetLastError(), Кто-нибудь знает, что может вызвать это?

1 ответ

Решение

Я докопался до этого. Сначала вы должны сделать takeown /f "C:\users\test\Documents\My Videos" /r /d y прежде чем любой C++ API сможет открыть дескриптор объекта файловой системы.

РЕДАКТИРОВАТЬ 2:

Для тех, кто читает это в будущем. Приведенный выше код может работать, но только когда вы используете takeown командование на стыке. Перед takeown использование есть Everyone:(DENY)(S,RD) политика по стандартным соединениям Windows, которая запрещает всем пользователям доступ на чтение. После того, как политика исчезла, соединение также можно использовать в проводнике 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

Другие вопросы по тегам