У меня проблемы с поиском IP-адреса сетевого принтера, когда в нем нет записи в Win32_TCPIPPrinterPort
.
- Я пытаюсь найти адрес хоста в
Win32_TCPIPPrinterPort
, используя имя порта принтера (из PRINTER_INFO_2.pPortName ). - Некоторые из моих сетевых принтеров делают там нет записи, поэтому я вместо этого пытаюсь проанализировать имя порта как IP-адрес
- Это работает для некоторых принтеров, но не для всех. IP-адрес некоторых принтеров мог измениться после того, как имя порта было создано без обновления имени порта.
Если Win32_TCPIPPrinterPort
не имеет записи для моего принтера, и имя порта не может использоваться как IP-адрес, как мне последовательно найти IP-адрес принтера? Я все еще могу печатать на этом принтере в другом месте в Windows, поэтому мне интересно узнать, как Windows знает IP-адрес принтера.
public static IPAddress FindIPAddress(IEnumerable<string> portNames)
{
// Try to find the printer's IP address in Win32_TCPIPPrinterPort
var searcher = new ManagementObjectSearcher("SELECT * FROM Win32_TCPIPPrinterPort");
foreach (var entry in searcher.Get())
{
string entryName = entry.Properties["Name"].Value as string;
if (!portNames.Any(pn => pn.Contains(entryName)))
continue;
if (entry.Properties["HostAddress"].Value is string ip)
{
if (IPAddress.TryParse(ip, out result))
return result;
}
}
// Try to parse the printer's port name as an IP address
string portName = portNames.FirstOrDefault(pn => !string.IsNullOrEmpty(pn));
if (portName == null)
return null;
if (portName.StartsWith("IP_"))
portName = portName.Substring(3, portName.Length - 3);
return IPAddress.TryParse(portName, out IPAddress result)
? result
: null;
}