有没有一种方式.NET枚举所有可用的网络打印机?有没有一种方式.NET枚举所有可用的网络打印机?(I

2019-05-13 13:13发布

有枚举.NET所有可见的网络打印机一个简单的方法? 目前,我展示PrintDialog类,允许用户选择打印机。 但问题是,本地打印机的显示,以及(与XPS文档写入等一起)。 如果我可以枚举网络打印机我自己,我可以证明只有那些打印机的自定义对话框。

谢谢!!

Answer 1:

发现这个代码在这里

 private void btnGetPrinters_Click(object sender, EventArgs e)
        {
// Use the ObjectQuery to get the list of configured printers
            System.Management.ObjectQuery oquery =
                new System.Management.ObjectQuery("SELECT * FROM Win32_Printer");

            System.Management.ManagementObjectSearcher mosearcher =
                new System.Management.ManagementObjectSearcher(oquery);

            System.Management.ManagementObjectCollection moc = mosearcher.Get();

            foreach (ManagementObject mo in moc)
            {
                System.Management.PropertyDataCollection pdc = mo.Properties;
                foreach (System.Management.PropertyData pd in pdc)
                {
                    if ((bool)mo["Network"])
                    {
                        cmbPrinters.Items.Add(mo[pd.Name]);
                    }
                }
            }

        }

更新:

“这个API函数可以枚举所有的网络资源,包括服务器,工作站,打印机,共享,远程目录等。”

http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=741&lngWId=10



Answer 2:

  • 得到默认打印机LocalPrintServer.DefaultPrintQueue
  • 您可以通过安装的打印机(从用户的角度来看) PrinterSettings.InstalledPrinters
  • 在列表中列举:
  • 任何开头打印机\\是网络打印机-所以得到的队列中new PrintServer("\\UNCPATH").GetPrintQueue("QueueName")
  • 任何打印机不开始\\是本地打印机有这么让它LocalPrintServer.GetQueue("Name")
  • 你可以看到这是默认的比较FullName属性。

注:网络打印机可以从默认打印机LocalPrintServer.DefaultPrintQueue ,但不会出现在LocalPrintServer.GetPrintQueues()

    // get available printers
    LocalPrintServer printServer = new LocalPrintServer();
    PrintQueue defaultPrintQueue = printServer.DefaultPrintQueue;

    // get all printers installed (from the users perspective)he t
    var printerNames = PrinterSettings.InstalledPrinters;
    var availablePrinters = printerNames.Cast<string>().Select(printerName => 
    {
        var match = Regex.Match(printerName, @"(?<machine>\\\\.*?)\\(?<queue>.*)");
        PrintQueue queue;
        if (match.Success)
        {
            queue = new PrintServer(match.Groups["machine"].Value).GetPrintQueue(match.Groups["queue"].Value);
        }
        else
        {
            queue = printServer.GetPrintQueue(printerName);
        }

        var capabilities = queue.GetPrintCapabilities();
        return new AvailablePrinterInfo()
        {
            Name = printerName,
            Default = queue.FullName == defaultPrintQueue.FullName,
            Duplex = capabilities.DuplexingCapability.Contains(Duplexing.TwoSidedLongEdge),
            Color = capabilities.OutputColorCapability.Contains(OutputColor.Color)
        };
    }).ToArray();

    DefaultPrinter = AvailablePrinters.SingleOrDefault(x => x.Default);


Answer 3:

使用新的API System.Printing

using (var printServer = new PrintServer(string.Format(@"\\{0}", PrinterServerName)))
{
    foreach (var queue in printServer.GetPrintQueues())
    {
        if (!queue.IsShared)
        {
            continue;
        }
        Debug.WriteLine(queue.Name);
     }
 }


Answer 4:

PrinterSettiings.InstalledPrinters应该给你你想要的集合



Answer 5:

在另一篇文章( https://stackoverflow.com/a/30758129/6513653 relationed这一个),斯科特·张伯伦说:“我不相信这是在.NET中任何可以做到这一点,你将需要一个本地电话”。 经过尝试所有可能的.NET资源,我认为他是对的。 于是,我开始研究添加打印机对话框如何完成其​​搜索。 使用Wireshark的,我发现添加打印机发送至少两种类型的包在本地网络中的所有主机:两个HTTP / XML请求3911端口和三个SNMP请求。 第一个SNMP请求是GET-NEXT 1.3.6.1.2.1.43,这是打印机-MIB。 第二个,是获得1.3.6.1.4.1.2699.1.2.1.2.1.1.3是打印机端口MONITOR-MIB的pmPrinterIEEE1284DeviceId。 这是最有趣的,因为在这里添加打印机需要打印机名称。 三是GET 1.3.6.1.2.1.1.1.0,这是SNMP MIB-2系统的sysDescr。 我相信,第二SNMP请求,就足以发现大多数在本地网络中的网络打印机,所以我做了这个代码。 它适用于Windows窗体应用程序,它依赖于SnmpSharpNet。

编辑:我使用ARP平,而不是正常的平搜索活动主机网络。 链接中的示例项目: ListNetworks C#项目



文章来源: Is there a .NET way to enumerate all available network printers?