在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服务器有所了解。
这个解决方案对我来说似乎有点长,但可能是一个很好的起点?
- 即使安装和使用了System.IdentityModel.Tokens,也找不到JWTSecurityTokenHandler和SecurityTokenDescriptor
- 如何重用具有略微不同的ProcessStartInfo实例的Process实例?
- 带有entity framework的强类型ASP.NET MVC
- 如何根据加利福尼亚当前时间将UTC转换为PST或PDT?
- RegAsm regfile开关没有提供与codebase开关相同的输出
- 在将字符串加载到XML文档对象之前删除所有hex字符?
- 动态变量名称在C#中用于WinForms
- ArrayList有什么问题?
- 使用filestream从根目录文件夹中读取文件