Общие ресурсы сервера могут быть перечислены в Windows File Explorer, но net view \\ MyServerName возвращает ошибку 53 - PullRequest
1 голос
/ 13 января 2020

Я пытаюсь найти способ получить список общих ресурсов на удаленном сервере. Сервер представляет собой видеосервер на основе Linux, к которому у меня нет доступа в отношении изменения настроек и т. Д. c. Моя проблема заключается в том, что после запуска программного обеспечения диспетчера клиентов на моем локальном компьютере я могу перечислить все общие ресурсы в обычном окне проводника файлов, просто введя \\ MyServerName в качестве пути, но все пытается получить доступ к списку общих ресурсов через представление net. или C# DirectoryInfo (..) возвращает ошибку 53. Я перепробовал все идеи, найденные в строке:

  1. Добавление имени входа в хранилище учетной записи пользователя на локальном компьютере
  2. net use \\MyServerName /user:MyID MyPassword
  3. PowerShell Get-WmiObject Win32_MappedLogicalDisk -computer | выберите имя, имя провайдера (возвращает RP C - сервер недоступен)

Странно то, что у File Explorer нет проблем с перечислением общих ресурсов! Если я создаю DirectoryInfo с одним из существующих общих ресурсов на сервере, он работает нормально:

var d = new DirectoryInfo(@"\\MyServerName\OneOfTheShares");

Я знаю, что DirectoryInfo не может использовать только имя сервера. Нужна папка. Но что я не могу понять, так это то, почему File Explorer может перечислять акции, но net view \\MyServerName не может!

Может кто-нибудь помочь мне с некоторыми мыслями?

1 Ответ

1 голос
/ 13 января 2020

Хорошо, поэтому Антон Анпилогов дразнил меня ;-), чтобы принять WinApi-подход к этой проблеме, я нашел 16-летний CodeProject Роба Мандерсона https://www.codeproject.com/Articles/6235/Enumerating-Network-Resources, который поставил меня на правильный путь: -) Используя WNetEnumResource для перечисления ресурсов подключенного сервера, фильтруя их по моему известному имени сервера, я могу вернуть список всех общих ресурсов на этом сервере!

result = WNetOpenEnum(scope, type, usage, pRsrc, out handle);
if (result == ErrorCodes.NO_ERROR)
{
    do
    {
        result = WNetEnumResource(handle, ref cEntries, buffer, ref bufferSize);
        if (result == ErrorCodes.NO_ERROR)
        {
            Marshal.PtrToStructure(buffer, pRsrc);
            if(pRsrc.lpRemoteName.StartsWith(<MyServerName>))
        {
             Shares.Add(pRsrc.lpRemoteName);
        }
    }
    else if (result != ErrorCodes.ERROR_NO_MORE_ITEMS)
        break;
} while (result != ErrorCodes.ERROR_NO_MORE_ITEMS);

WNetCloseEnum(handle);

}

Код, очевидно, нуждается в некоторые убираются, но это работает! Thanx!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...