Определить IP-адрес принтера в C#

Я хотел бы определить IP-адрес принтера с помощью С# (.NET 2.0). У меня есть только общее имя принтера, установленное в ОС Windows, в формате \\PC Name\Printer Name. Принтер является сетевым принтером и имеет другой IP-адрес, чем ПК. У кого-нибудь есть указатели?

Заранее спасибо за помощь.

С уважением, Энди.


person MagicAndi    schedule 24.03.2009    source источник


Ответы (6)



Просто добавьте другое решение, используя .Net Framework 4.0 или выше.

Using System.Printing

 var server = new PrintServer();
            var queues = server.GetPrintQueues(new[] { EnumeratedPrintQueueTypes.Local, EnumeratedPrintQueueTypes.Connections });
            foreach (var queue in queues)
            {
                string printerName = queue.Name;
                string printerPort = queue.QueuePort.Name;
             }
person Jay    schedule 04.03.2014

Я знаю, что это старый пост, но у меня была такая же проблема, когда я смог получить имя порта принтера, но не IP. В моем случае я не мог полагаться на то, что имя порта будет IP_[IP-адрес], но нашел, как получить фактический IP-адрес из имени порта.

Windows хранит информацию о портах в реестре под

HKLM\SYSTEM\CurrentControlSet\Control\Print\Monitors\Стандартный порт TCP/IP\Порты\[имя порта]

Этот ключ содержит значения, установленные на странице конфигурации порта, включая IP-адрес и номер порта.

Быстрый пример C# для получения IP-адреса

using Microsoft.Win32;

RegistryKey key = Registry.LocalMachine.OpenSubKey(@"System\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\" + printerPortName, RegistryKeyPermissionCheck.Default, System.Security.AccessControl.RegistryRights.QueryValues);
if (key != null)
{
    String IP = (String)key.GetValue("IPAddress", String.Empty, RegistryValueOptions.DoNotExpandEnvironmentNames);
}
person Michael Ball    schedule 04.02.2011
comment
Спасибо, Майкл. Это фактический ответ, имя порта не является надежным для получения IPAdress. Мне пришлось изменить код на String IP = (String)key.GetValue("HostName", String.Empty, RegistryValueOptions.DoNotExpandEnvironmentNames); для моего требования. - person Kishor; 30.11.2015
comment
Чтобы было ясно, это нужно сделать, как только вы получите порт из других ответов. - person StingyJack; 29.08.2017
comment
это не самый правильный ответ, я проверял на своих компьютерах, но не работал, и я посмотрел регистрационные ключи, тогда имена портов разные. - person SaddamBinSyed; 28.03.2018

использования класса WIN32_Printer здесь недостаточно. Его следует сочетать с Win32_TCPIPPrinterPort.

Ниже приведен код, который должен помочь:

static void Main(string[] args)
        {
            var scope = new ManagementScope(@"\root\cimv2");
            scope.Connect();

            var searcher = new ManagementObjectSearcher("SELECT * FROM Win32_Printer");
            var results = searcher.Get();
            Console.WriteLine("Network printers list:");
            foreach (var printer in results)
            {
                var portName = printer.Properties["PortName"].Value;

                var searcher2 = new ManagementObjectSearcher("SELECT * FROM Win32_TCPIPPrinterPort where Name LIKE '" + portName + "'");
                var results2 = searcher2.Get();
                foreach (var printer2 in results2)
                {
                    Console.WriteLine("Name:" + printer.Properties["Name"].Value);
                    //Console.WriteLine("PortName:" + portName);
                    Console.WriteLine("PortNumber:" + printer2.Properties["PortNumber"].Value);
                    Console.WriteLine("HostAddress:" + printer2.Properties["HostAddress"].Value);
                }
                Console.WriteLine();
            }

            Console.ReadLine();
           }
person Alexander A. Sharygin    schedule 11.04.2014

На основе ссылки Как получить информацию о принтере в .NET? (Спасибо, Панос, я уже смотрел ссылку!), У меня есть следующее решение из ответа Паноса:

using System.Management;

...

string printerName = "YourPrinterName";
string query = string.Format("SELECT * from Win32_Printer WHERE Name LIKE '%{0}'", printerName);
ManagementObjectSearcher searcher = new ManagementObjectSearcher(query);
ManagementObjectCollection coll = searcher.Get();

foreach (ManagementObject printer in coll)
{
    string portName = printer["PortName"].ToString();
    if(portName.StartsWith("IP_"))
    {
        Console.WriteLine(string.Format("Printer IP Address: {0}", portName.Substring(3)));
    }
}

Очевидно, это работает только в том случае, если имя порта для принтера задано в формате «IP_IPAddress», который, я считаю, используется по умолчанию.

person MagicAndi    schedule 24.03.2009

Установлен ли этот принтер в сети с Active Directory? Или это в вашей собственной локальной сети, к которой подключен только коммутатор и принтер?

Если это первое, вы сможете запросить его на основе «имени принтера». В этой статье показано, как заставить c# .net подключаться к AD. Но это требует некоторых знаний о серверах AD в вашей сети.

Это решение кажется мне немного длинным, но может быть хорошей отправной точкой?

person Irfy    schedule 24.03.2009