Определите IP-адрес принтера в C # - PullRequest
3 голосов
/ 24 марта 2009

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

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

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

Ответы [ 6 ]

8 голосов
/ 04 марта 2014

Просто добавьте еще одно решение, используя .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;
             }
5 голосов
/ 04 февраля 2011

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

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

HKLM \ SYSTEM \ CurrentControlSet \ Control \ Print \ Мониторы \ Стандартный порт 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);
}
4 голосов
/ 24 марта 2009

Проверьте этот вопрос: Как получить информацию о принтере в C # .NET? . Я думаю, что вы должны получить свойство PortName из свойств WMI.

2 голосов
/ 11 апреля 2014

использование класса 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();
           }
1 голос
/ 24 марта 2009

По ссылке Как получить информацию о принтере в .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", который, я полагаю, является значением по умолчанию.

0 голосов
/ 24 марта 2009

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

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

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

...