【问题标题】:Determine the IP Address of a Printer in C#在 C# 中确定打印机的 IP 地址
【发布时间】:2009-03-24 10:45:09
【问题描述】:

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

提前感谢您的帮助。

问候,安迪。

【问题讨论】:

    标签: c# .net network-programming printing


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      我知道这是一篇旧帖子,但我遇到了同样的问题,我能够获取打印机端口名称,但不能获取 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);
      }
      

      【讨论】:

      • 谢谢迈克尔。这是实际的答案,端口名称对于获取 IPAdress 是不可靠的。我必须将代码更改为 String IP = (String)key.GetValue("HostName", String.Empty, RegistryValueOptions.DoNotExpandEnvironmentNames); 以满足我的要求。
      • 需要明确的是,一旦您从其他答案中获得了端口,就需要这样做
      • 这不是最正确的答案,我已经在我的电脑上测试过但没有工作,我查看了 reg 键然后端口名称不同。
      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

          基于链接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”格式给出时才有效,我相信这是默认设置。

          【讨论】:

            【解决方案6】:

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

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

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-10-16
              • 2019-02-07
              • 2014-05-25
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多