2009-06-19 78 views
12

有沒有一種簡單的方法來枚舉.NET中所有可見的網絡打印機?目前,我正在顯示PrintDialog以允許用戶選擇打印機。問題在於,本地打印機也會顯示(以及XPS Document Writer等)。如果我可以自己枚舉網絡打印機,則只需使用這些打印機即可顯示自定義對話框。有沒有.NET方法來枚舉所有可用的網絡打印機?

謝謝!

+0

AvailablePrinterInfo是在命名空間越來越爲錯誤的類型或命名空間名稱「AvailablePrinterInfo」找不到(是否缺少using指令或程序集引用 – 2011-11-03 07:42:00

回答

8

發現這個代碼here

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

+0

+1謝謝!我可以通過對此代碼進行一些小的調整來列舉已安裝的網絡打印機的名稱。可以使用類似技術枚舉所有VISIBLE網絡打印機(不僅僅是安裝的打印機)。 – Pwninstein 2009-06-19 14:59:13

+0

試試這篇文章: http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=741&lngWId= 10 「此API函數可以枚舉所有網絡資源,包括服務器,工作站,打印機,共享,遠程目錄等。「 我希望它有幫助,歡呼 – 2009-06-19 15:13:22

+0

null異常在最後一個語句中。 – 2013-11-20 07:50:34

2

PrinterSettiings.InstalledPrinters應該給你收集你想

+1

PrinterSettings.InstalledPrinters仍顯示非網絡打印機以及文檔打印機(PDF Writer,XPS Document Writer等) – Pwninstein 2009-06-19 14:57:34

9

使用新的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); 
    } 
} 
13
  • 獲得從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); 
1

在relationed這一個另一篇文章(https://stackoverflow.com/a/30758129/6513653),斯科特·張伯倫說:「我不相信有任何.NET可以做到這一點,你將需要進行本地調用「。在嘗試所有可能的.NET資源之後,我認爲他是對的。 因此,我開始研究如何在ADD PRINTER對話框中進行搜索。使用Wireshark,我發現ADD PRINTER至少向本地網絡中的所有主機發送至少兩種類型的包:兩個到3911端口的http/xml請求和三個SNMP請求。 enter image description here 第一個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請求足以在本地網絡中找到大多數網絡打印機,所以我做了這個代碼。它適用於Windows窗體應用程序,它取決於SnmpSharpNet。

編輯:我使用ARP Ping而不是普通Ping來搜索網絡中的活動主機。鏈接中的示例項目:?ListNetworks C# Project

相關問題