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

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

在此先感谢您的帮助。

此致,安迪。

检查这个问题: 如何在C#.NET中获取打印机信息? 。 我认为你必须从WMI属性获取属性PortName

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

我知道这是一个旧post,但我遇到了同样的问题,我可以获得打印机端口名称,但不是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); } 

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

基于链接如何在.NET中获取打印机信息? (谢谢,Panos,我已经在看链接了!),我从Panos的答案中得到以下解决方案:

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

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

如果是前者,那么您应该能够根据“打印机名称”查询它。 本文介绍如何使c#.net连接到AD 。 但这需要您对网络中的AD服务器有所了解。

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