有没有.NET方法来枚举所有可用的networking打印机?

有一个简单的方法来枚举所有可见的networking打印机在.NET中? 目前,我正在显示PrintDialog以允许用户select打印机。 问题是,本地打印机也显示(以及XPS文档编写器等)。 如果我能枚举自己的networking打印机,我可以显示一个自定义对话框只有这些打印机。

谢谢!!

在这里find这个代码

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函数可以枚举所有的networking资源,包括服务器,工作站,打印机,共享,远程目录等。”

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

  • LocalPrintServer.DefaultPrintQueue获取默认打印机
  • PrinterSettings.InstalledPrinters获取安装的打印机(从用户的angular度)
  • 通过列表枚举:
  • 任何以\\开头的打印机都是networking打印机 – 因此可以使用new PrintServer("\\UNCPATH").GetPrintQueue("QueueName")获取队列new PrintServer("\\UNCPATH").GetPrintQueue("QueueName")
  • 任何不以\\开头的打印机都是本地打印机,所以使用LocalPrintServer.GetQueue("Name")
  • 您可以通过比较FullName属性来查看哪个是默认值。

注意:networking打印机可以是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); 

使用新的System.Printing API

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

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

在另一篇与此相关的文章( https://stackoverflow.com/a/30758129/6513653 )中,Scott Chamberlain说:“我不相信.NET中有任何东西可以做到这一点,你将需要一个本地调用”。 在尝试了所有可能的.NET资源之后,我认为他是对的。 于是,我开始研究如何在ADD PRINTER对话框中进行search。 使用Wireshark,我发现ADD PRINTER至less向本地networking中的所有主机发送至less两种types的包:两个到3911端口的http / xml请求和三个SNMP请求。 在这里输入图像描述 第一个SNMP请求是一个get-next 1.3.6.1.2.1.43,它是Printer-MIB。 第二个是从PRINTER-PORT-MONITOR-MIB获得的1.3.6.1.4.1.2699.1.2.1.2.1.1.3这是pmPrinterIEEE1284DeviceId。 这是最感兴趣的,因为是从ADD PRINTER取得打印机名称。 第三个是get 1.3.6.1.2.1.1.1.0,它是SNMP MIB-2系统中的sysDescr。 我相信第二个SNMP请求足以在本地networking中find大多数networking打印机,所以我做了这个代码。 它适用于Windows窗体应用程序,它依赖于SnmpSharpNet。

编辑:我使用ARP Ping而不是正常Ping来searchnetworking中的活动主机。 示例项目的链接: ListNetworks C#项目