C# Network Discovery не работает (Windows)

Я пытаюсь читать устройства в сети на C#, в основном так, как они отображаются на вкладке «Сеть» в проводнике.

Единственный способ сделать это: https://www.codeproject.com/Articles/16113/Retreiving-a-list-of-network-computer-names-using, использующий NetServerEnum().

Независимо от того, насколько усердно я ищу в Google, все в конечном итоге приводит к этой ссылке. Но это совсем не работает! Я использую этот код:

static class Network {
    [DllImport("Netapi32")]
    static extern int NetServerEnum(string ServerNane, int dwLevel, ref IntPtr pBuf, int dwPrefMaxLen,
    out int dwEntriesRead, out int dwTotalEntries, int dwServerType, string domain, out int dwResumeHandle);

    [DllImport("Netapi32")]
    static extern int NetApiBufferFree(IntPtr pBuf);

    [StructLayout(LayoutKind.Sequential)]
    struct SERVER_INFO_100 {
        internal int id;
        [MarshalAs(UnmanagedType.LPWStr)]
        internal string name;
    }

    static int SV_TYPE_WORKSTATION = 1, SV_TYPE_SERVER = 2;
    static int SSIZE = Marshal.SizeOf(typeof(SERVER_INFO_100));

    public static ArrayList GetNetwork() {
        ArrayList net = new ArrayList();

        IntPtr buffer = IntPtr.Zero, tmpBuffer = IntPtr.Zero;
        int read = 0, total = 0, handle = 0;

        try {
            int ret = NetServerEnum(null, 100, ref buffer, -1, out read, out total, SV_TYPE_WORKSTATION | SV_TYPE_SERVER, null, out handle);
            if (ret != 0) Console.WriteLine("Error Code "+ret+": "+new Win32Exception(ret).Message);
            Console.WriteLine(read+" of "+total);
            if (ret == 0) {
                for(int i=0; i<total; i++) {
                    tmpBuffer = new IntPtr((long)buffer + (i*SSIZE));
                    SERVER_INFO_100 inf = (SERVER_INFO_100)Marshal.PtrToStructure(tmpBuffer, typeof(SERVER_INFO_100));
                    net.Add(inf.name);
                }
            }
            NetApiBufferFree(buffer);
        } catch(Exception ex) {
            MessageBox.Show("Problem with acessing network computers in NetworkBrowser"
            +"\r\n\r\n\r\n"+ex.Message,"Error",MessageBoxButtons.OK,MessageBoxIcon.Error);
            return null;
        }
        return net;
    }
}

Я получаю следующий код ошибки:

Error Code 1231: The network location cannot be reached. For information about network troubleshooting, see Windows Help

Какие? Я еще даже не пытающийся, чтобы добраться до сетевого местоположения! И этого кода ошибки нет в списке возможных кодов ошибок на MSDN. Что я делаю неправильно?

Почему эта базовая функциональность использования Windows Network Discovery, уже встроенного в ОС, так сложна в API, буквально называемом .NET?

Работает для меня. У вас есть что-то, что имеет роль главного обозревателя или обозревателя компьютера локально?

Jimi 23.03.2018 04:04

IDK, но у меня включено обнаружение сети и общий доступ к файлам в сети. Моя сеть настроена довольно стандартно и обычно просто работает. А в проводнике я могу видеть все, что есть в моей сети. Около 5 компьютеров, NAT, принтер и мой WiFi-роутер. Да еще у меня нет домашней группы. Это как-то связано с этим?

Pecacheu 23.03.2018 04:35

Да, что ж, для используемых вами функций API требуется локальный браузер (сервер или рабочая станция). Посмотрите в службах Windows, запущена ли служба обозревателя компьютеров.

Jimi 23.03.2018 04:41

В статье в Википедии (которая для меня не имеет смысла), кажется, говорится, что это включено только в Windows Server. У меня только Windows 10 Pro ... У меня действительно есть домашний сервер, но он работает под управлением Linux (очевидная ОС, которую выбирают для безголовых серверов). В любом случае, похоже, что это для корпоративных сетей или чего-то в этом роде, так чем это отличается от обычного Windows Network Discovery, и в таком случае, как мне это сделать?

Pecacheu 23.03.2018 06:35

Что входит только в Windows Server? Однако я тестировал его на рабочей станции Windows 7. Эта ошибка была довольно частой в Windows Vista, обычно связанной с неправильной конфигурацией маршрутизации. Иногда решается отключение IPV6. В других случаях включение NetBios через TcpIp (Сетевые подключения / IpV4 / Свойства / Дополнительно / Победы). Любая рабочая станция Windows имеет службу обозревателя компьютеров. Просто убедитесь, что он работает (иногда это не так).

Jimi 23.03.2018 06:42

Существуют и другие, более свежие способы просмотра сети. Но SO не подходит для такого рода обсуждений.

Jimi 23.03.2018 06:45

Хорошо, я нашел его в списке услуг. Он уже сказал, что работает, но я перезапустил службу, и теперь программа работает как-то, но возвращает только 2 устройства. Этот компьютер и один из двух моих принтеров. Ни компьютеров, ни маршрутизатора, ни моего NAT (а это то, что я действительно хочу, чтобы найти ПК и NAT), или даже другого принтера ... Я не думаю, что у меня есть рабочая группа или домен или что-то еще, поэтому null для домена должен работать верно?

Pecacheu 23.03.2018 07:03

Код, который вы используете, предназначен только для поиска на серверах и рабочих станциях. Взгляните на MSDN, чтобы узнать больше. Есть еще много других.

Jimi 23.03.2018 07:08

Я попробовал другие варианты, и у меня есть еще несколько устройств, но не все, но теперь он снова выдает ошибку 1231, и перезапуск службы больше не работает. Честно говоря, я не думаю, что это очень хорошее решение. Если это не сработает для меня, это не сработает для людей, которые устанавливают мое приложение ... В любом случае я также видел ответ на SO, в котором говорилось об использовании папки Environment.SpecialFolder.NetworkShortcuts, но для меня эта папка всегда пуста.

Pecacheu 24.03.2018 20:31
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
9
417
0

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