В другом посте (https://stackoverflow.com/a/30758129/6513653) по этому поводу Скотт Чемберлен сказал: «Я не верю, что в .NET есть что-то, что может сделать это, вам нужно будет сделать собственный вызов». После попытки все возможные ресурсы .NET, я думаю, что он прав.
Итак, я начал исследовать, как диалог ADD PRINTER выполняет поиск. Используя Wireshark, я обнаружил, что ADD PRINTER отправляет по крайней мере два типа пакетов на все хосты в локальной сети: два запроса http / xml на порт 3911 и три запроса SNMP.
Первым запросом SNMP является get-next 1.3.6.1.2.1.43, который представляет собой Printer-MIB. Вторым является get 1.3.6.1.4.1.2699.1.2.1.2.1.1.3, который представляет собой pmPrinterIEEE1284DeviceId PRINTER-PORT-MONITOR-MIB. Это наиболее интересно, потому что именно там ADD PRINTER берет имя принтера. Третий - это get 1.3.6.1.2.1.1.1.0, который является sysDescr системы SNMP MIB-2.
Я действительно считаю, что второго запроса SNMP достаточно, чтобы найти большинство сетевых принтеров в локальной сети, поэтому я сделал этот код. Он работает для Windows Form Application и зависит от SnmpSharpNet.
Edit: я использую ARP Ping вместо обычного Ping для поиска активных хостов в сети. Ссылка на пример проекта: ListNetworks C # Project