【发布时间】:2009-03-24 10:45:09
【问题描述】:
我想使用 C# (.NET 2.0) 确定打印机的 IP 地址。我只有在 Windows 操作系统上设置的打印机共享名称,格式为 \\PC Name\Printer Name。打印机是网络打印机,与 PC 的 IP 地址不同。有没有人指点一下?
提前感谢您的帮助。
问候,安迪。
【问题讨论】:
标签: c# .net network-programming printing
我想使用 C# (.NET 2.0) 确定打印机的 IP 地址。我只有在 Windows 操作系统上设置的打印机共享名称,格式为 \\PC Name\Printer Name。打印机是网络打印机,与 PC 的 IP 地址不同。有没有人指点一下?
提前感谢您的帮助。
问候,安迪。
【问题讨论】:
标签: c# .net network-programming printing
只需在此处使用 .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;
}
【讨论】:
我知道这是一篇旧帖子,但我遇到了同样的问题,我能够获取打印机端口名称,但不能获取 IP。在我的情况下,我不能依赖端口名称是 IP_[IP 地址],而是找到了如何从端口名称中获取实际 IP 的方法。
Windows 将有关端口的信息存储在注册表中
HKLM\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\[端口名称]
该键包含端口配置页面中设置的值,包括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);
}
【讨论】:
String IP = (String)key.GetValue("HostName", String.Empty, RegistryValueOptions.DoNotExpandEnvironmentNames); 以满足我的要求。
检查这个问题:How to get Printer Info in C#.NET?。我认为您必须从 WMI 属性中获取属性 PortName。
【讨论】:
在这里使用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();
}
【讨论】:
基于链接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”格式给出时才有效,我相信这是默认设置。
【讨论】:
此打印机是否设置在具有 Active Directory 的网络中? 或者这是在您自己的本地网络上,只有一个交换机和您的打印机插入其中?
如果是前者,那么您应该可以根据“打印机名称”进行查询。 This article show how to get c# .net to connect to the AD。但这确实需要您对网络中的 AD 服务器有所了解。
这个解决方案对我来说似乎有点长,但可能是一个很好的起点?
【讨论】: