在C#中确定打印机的IP地址

时间:2009-03-24 10:45:09

标签: c# .net network-programming printing

我想使用C#(.NET 2.0)确定打印机的IP地址。我只有Windows操作系统上设置的打印机共享名称,格式为\\PC Name\Printer Name。打印机是网络打印机,具有与PC不同的IP地址。有没有人有任何指示?

提前感谢您的帮助。

问候,安迪。

6 个答案:

答案 0 :(得分:8)

只需使用.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;
             }

答案 1 :(得分:5)

我知道这是一篇旧帖子,但我遇到了同样的问题,我可以获得打印机端口名称,但不是IP。在我的情况下,我不能依赖端口名称IP_ [IP地址],但发现如何从端口名称获取实际的IP。

Windows在

下存储有关端口的信息

HKLM \ SYSTEM \ CurrentControlSet \ Control \ Print \ Monitors \ Standard TCP / IP Port \ Ports \ [port name]

此键包含端口配置页面中设置的值,包括IP地址和端口号。

获取IP地址的快速C#示例

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);
}

答案 2 :(得分:4)

检查此问题:How to get Printer Info in C#.NET?。我认为您必须从WMI属性中获取属性PortName

答案 3 :(得分:2)

使用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();
           }

答案 4 :(得分:1)

根据链接How to get Printer Info in .NET?(谢谢,Panos,我已经在查看链接!),我从Panos's回答了以下解决方案:

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”格式给出时才有效,我相信这是默认值。

答案 5 :(得分:0)

此打印机是否设置在具有Active Directory的网络中? 或者这是在你自己的本地网络上,只需一个开关,你的打印机插入它?

如果是前者,那么您应该能够根据“打印机名称”查询它。 This article show how to get c# .net to connect to the AD。但这需要您对网络中的AD服务器有所了解。

这个解决方案对我来说似乎有点长,但可能是一个很好的起点?