Я пытаюсь читать устройства в сети на 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?
IDK, но у меня включено обнаружение сети и общий доступ к файлам в сети. Моя сеть настроена довольно стандартно и обычно просто работает. А в проводнике я могу видеть все, что есть в моей сети. Около 5 компьютеров, NAT, принтер и мой WiFi-роутер. Да еще у меня нет домашней группы. Это как-то связано с этим?
Да, что ж, для используемых вами функций API требуется локальный браузер (сервер или рабочая станция). Посмотрите в службах Windows, запущена ли служба обозревателя компьютеров.
В статье в Википедии (которая для меня не имеет смысла), кажется, говорится, что это включено только в Windows Server. У меня только Windows 10 Pro ... У меня действительно есть домашний сервер, но он работает под управлением Linux (очевидная ОС, которую выбирают для безголовых серверов). В любом случае, похоже, что это для корпоративных сетей или чего-то в этом роде, так чем это отличается от обычного Windows Network Discovery, и в таком случае, как мне это сделать?
Что входит только в Windows Server? Однако я тестировал его на рабочей станции Windows 7. Эта ошибка была довольно частой в Windows Vista, обычно связанной с неправильной конфигурацией маршрутизации. Иногда решается отключение IPV6. В других случаях включение NetBios через TcpIp (Сетевые подключения / IpV4 / Свойства / Дополнительно / Победы). Любая рабочая станция Windows имеет службу обозревателя компьютеров. Просто убедитесь, что он работает (иногда это не так).
Существуют и другие, более свежие способы просмотра сети. Но SO не подходит для такого рода обсуждений.
Хорошо, я нашел его в списке услуг. Он уже сказал, что работает, но я перезапустил службу, и теперь программа работает как-то, но возвращает только 2 устройства. Этот компьютер и один из двух моих принтеров. Ни компьютеров, ни маршрутизатора, ни моего NAT (а это то, что я действительно хочу, чтобы найти ПК и NAT), или даже другого принтера ... Я не думаю, что у меня есть рабочая группа или домен или что-то еще, поэтому null для домена должен работать верно?
Код, который вы используете, предназначен только для поиска на серверах и рабочих станциях. Взгляните на MSDN, чтобы узнать больше. Есть еще много других.
Я попробовал другие варианты, и у меня есть еще несколько устройств, но не все, но теперь он снова выдает ошибку 1231, и перезапуск службы больше не работает. Честно говоря, я не думаю, что это очень хорошее решение. Если это не сработает для меня, это не сработает для людей, которые устанавливают мое приложение ... В любом случае я также видел ответ на SO, в котором говорилось об использовании папки Environment.SpecialFolder.NetworkShortcuts, но для меня эта папка всегда пуста.





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