Проблема с Win32 WNet API и NFS путями - PullRequest
1 голос
/ 03 июня 2011

Я работаю в системе Win2K8R2, в которой установлен клиент Microsoft NFS в дополнение к клиенту Windows CIFS.

Учитывая UNC-путь (который NFS-клиент поддерживает с предостережениями), я должен быть в состоянии определить, будут ли операции на этом пути обрабатываться CIFS или NFS-клиентом. WNetGetResourceInformation (), по-видимому, обеспечивает это, но я не смог заставить его работать, когда путь UNC к серверу NFS.

Пример кода:

int GetResourceInformation(TCHAR* path, void* buffer, DWORD* size)
{
    TCHAR* p = NULL;
    NETRESOURCE nr;
    memset(&nr, 0, sizeof(nr));

    nr.lpRemoteName = path;

    DWORD dwRetVal = WNetGetResourceInformation(&nr, buffer, size, &p);

    if(dwRetVal == NO_ERROR)
    {
        NETRESOURCE* tmp = (NETRESOURCE*)buffer;
        wprintf(L"%s provider=%s system=%s\n", path, tmp->lpProvider, (p == NULL) ? L"<null>" : p);
    }
    else
    {
        wprintf(L"WNetGetResourceInformation failed for %s with error: %u\n", path, dwRetVal);
    }

    return dwRetVal;
}

Я также попытался заполнить поля NETRESOURCE lpProvider и / или dwType, как указано в doc , но без изменений в поведении.

Если я передам функции путь CIFS UNC, то она будет выполнена успешно. Если я передаю ему путь NFS UNC, он завершается с ошибкой 487 «Попытка доступа к неверному адресу». Я также попытался передать имя хоста в стиле пути NFS: / export / file, но это не удалось с ошибкой 67 «Сетевое имя не найдено».

Я нашел следующий пример для использования WNetAddConnection2 () с NFS, но этот код также не работает для меня с ошибкой 50 «Запрос не поддерживается». Я могу успешно смонтировать экспорт с помощью команды «net use» или специального средства NFS mount.exe, предоставленного Microsoft.

Наконец, WNetOpenEnum / WNetEnumResource не возвращает мне никакой информации о провайдере NFS и даже не показывает подключенные диски, которые я подключил с помощью «net use» или mount.exe.

Мой общий вопрос: кто-нибудь добился большего успеха, используя API-интерфейсы WNet с поставщиком NFS? В частности, есть ли какой-нибудь механизм, который я могу использовать для определения поставщика для удаленного пути?

1 Ответ

0 голосов
/ 05 декабря 2012

Вы строите как x86 или x64? Похоже, что API WNet * не работают правильно для общих ресурсов NFS из процесса x86 под WOW64. Это можно увидеть без написания кода - если у вас смонтирован общий ресурс NFS, «C: \ windows \ system32 \ net use» покажет это, а «C: \ windows \ syswow64 \ net use» - нет. Доступ к файловой системе кажется нормальным 32-битным процессом, но ни один из API не работает.

Даже для сборки x64 использование NULL lpProvider для меня несовместимо. Половина времени не работает, другая половина ждет около 5 секунд, прежде чем вернуться.

Вызов WNetGetResourceInformation дважды, один раз с lpProvider «NFS Network» и один раз с «Microsoft Windows Network», работает последовательно и мгновенно возвращается.

...