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

问题描述 投票:4回答:7

我想用C#(.NET 2.0)来确定打印机的IP地址。我只有在Windows操作系统上设置的打印机共享名称,格式为 \\PC Name\Printer Name. .打印机是网络打印机,与电脑的IP地址不同。谁有什么好办法?

提前感谢您的帮助。

Regards, Andy.

c# .net network-programming printing
7个回答
4
投票

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


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

5
投票

我知道这是个老帖子,但我有同样的问题,我可以得到打印机端口名,但不能得到IP。在我的情况下,我不能依赖端口名是IP_[IP地址],而是找到了如何从端口名中获取实际IP的方法。

Windows将端口信息存储在注册表中的以下位置

HKLM/SYSTEM/CurrentControlSet/Control/Print/Monitors/Standard TCPIP Port/Ports/[port name]

这个键包含了在端口配置页面中设置的值,包括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);
}

3
投票

在这里使用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
投票

基于这个链接 如何在.NET中获取打印机信息? (谢谢,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 "的格式给出时,这才有效,我相信这是默认的。


0
投票

这台打印机是设置在有活动目录的网络中吗?还是在你自己的本地网络中,只有一个交换机和你的打印机插在上面?

如果是前者,那么你应该可以根据 "打印机名称 "来查询它。本文展示了如何让c#.net连接到AD-------------------。. 但这确实需要对网络中的AD服务器有一定的了解。

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

© www.soinside.com 2019 - 2024. All rights reserved.