Как получить IP-адрес принтера, если его нет в Win32_TCPIPPrinterPort? - PullRequest
0 голосов
/ 04 марта 2020

У меня проблемы с поиском IP-адреса сетевого принтера, когда в нем нет записи в Win32_TCPIPPrinterPort.

  1. Я пытаюсь найти адрес хоста в Win32_TCPIPPrinterPort, используя имя порта принтера (из PRINTER_INFO_2.pPortName ).
  2. Некоторые из моих сетевых принтеров делают там нет записи, поэтому я вместо этого пытаюсь проанализировать имя порта как IP-адрес
  3. Это работает для некоторых принтеров, но не для всех. 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;
}
...