【问题标题】:Using the new .net printing API (System.Printing.dll) how do you get the IPAddress of a network printer?使用新的 .net 打印 API (System.Printing.dll) 如何获取网络打印机的 IPAddress?
【发布时间】:2009-11-09 05:35:03
【问题描述】:

使用新的 .net 打印 API (System.Printing.dll) 如何获取网络打印机的 IPAddress?

我正在看的课程是

这是一些示例代码

PrintServer printServer = new PrintServer(@"\\PrinterServerName");
foreach (PrintQueue queue in printServer.GetPrintQueues())
{
   Debug.WriteLine(queue.Name);
   Debug.WriteLine(queue.QueuePort.Name);
   //how do i get the ipaddress of the printer attached to the queue?
} 

【问题讨论】:

    标签: .net .net-3.5 printing


    【解决方案1】:

    您可以使用打印机的机器名获取 IPAddress:

    IPHostEntry hostInfo = Dns.GetHostByName("MachineName");    
    string IPAddress = hostInfo.AddressList[0].ToString();
    

    【讨论】:

    • 如何获取打印机的名称? PrintQueue.Name 不是机器名称,因为它是用户可设置的
    • 这不是 (@"\\PrinterServerName") 打印机服务器名称吗?
    • 那是打印服务器。但该服务器上的每台打印机都可以有自己的 IP 地址
    【解决方案2】:

    到目前为止,我有这个。我不得不求助于 ManagementObjectSearcher 来获取端口的 IP 地址。

    我现在会接受这个答案。如果有人知道没有 ManagementObjectSearcher 的方法,我会接受这个答案。

    public virtual IEnumerable<Printer> GetPrinters()
    {
        var ports = new Dictionary<string, IPAddress>();
        var selectQuery = new SelectQuery("Win32_TCPIPPrinterPort");
        selectQuery.SelectedProperties.Add("CreationClassName");
        selectQuery.SelectedProperties.Add("Name");
        selectQuery.SelectedProperties.Add("HostAddress");
        selectQuery.Condition = "CreationClassName = 'Win32_TCPIPPrinterPort'";
    
        using (var searcher = new ManagementObjectSearcher(Scope, selectQuery))
        {
            var objectCollection = searcher.Get();
            foreach (ManagementObject managementObjectCollection in objectCollection)
            {
                var portAddress = IPAddress.Parse(managementObjectCollection.GetProperty<string>("HostAddress"));
                ports.Add(managementObjectCollection.GetProperty<string>("Name"), portAddress);
            }
        }
    
    
        using (var printServer = new PrintServer(string.Format(@"\\{0}", PrinterServerName)))
        {
            foreach (var queue in printServer.GetPrintQueues())
            {
                if (!queue.IsShared)
                {
                    continue;
                }
                yield return new Printer
                             {
                                Location = queue.Location,
                                Name = queue.Name,
                                PortName = queue.QueuePort.Name,
                                PortAddress = ports[queue.QueuePort.Name]
                             };
            }
        }
    }
    

    【讨论】:

    猜你喜欢
    • 2011-04-12
    • 2013-01-22
    • 1970-01-01
    • 2023-03-13
    • 2017-04-21
    • 1970-01-01
    • 2011-06-26
    • 1970-01-01
    • 2011-06-24
    相关资源
    最近更新 更多