2009-06-19 13 views
12

Czy istnieje prosty sposób wyliczenia wszystkich widocznych drukarek sieciowych w .NET? Obecnie wyświetlam PrintDialog, aby umożliwić użytkownikowi wybór drukarki. Problem polega na tym, że drukarki lokalne są również wyświetlane (wraz z XPS Document Writer i tym podobne). Jeśli mogę samemu wyliczyć drukarki sieciowe, mogę wyświetlić niestandardowe okno dialogowe z tymi właśnie drukarkami.Czy istnieje sposób .NET do wyliczenia wszystkich dostępnych drukarek sieciowych?

Dzięki!

+0

AvailablePrinterInfo w którym jest coraz nazw jako błąd typu lub obszaru nazwy „AvailablePrinterInfo” nie można odnaleźć (czy brakuje using dyrektywa lub odwołania do zestawu –

Odpowiedz

8

znaleźć ten kod 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]); 
        } 
       } 
      } 

     } 

Aktualizacja:

„Ta funkcja API można wyliczyć wszystkich zasobów sieciowych, w tym serwery, stacje robocze, drukarki, udziały, zdalne katalogi itp. "

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

+0

+1 Dzięki! Mogę wymienić tylko nazwy zainstalowanych drukarek sieciowych za pomocą kilku drobnych poprawek tego kodu. można wymienić wszystkie drukarki sieciowe VISIBLE (nie tylko zainstalowane) przy użyciu podobnej techniki: – Pwninstein

+0

spróbuj tego artykułu: http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=741&lngWId= 10 " Ta funkcja API może wyliczyć wszystkie zasoby sieciowe, łącznie z serwerami, stacjami roboczymi, drukarkami, udziałami, zdalnymi katalogami itp. " Mam nadzieję, że pomaga, okrzyki –

+0

null wyjątek w ostatnim oświadczeniu. –

2

PrinterSettiings.InstalledPrinters powinno dać wam kolekcję chcesz

+1

PrinterSettings.InstalledPrinters nadal pokazuje nie- drukarki sieciowe, a także drukarki dokumentów (PDF Writer, XPS Document Writer, itp.) – Pwninstein

9

użyciu nowego 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); 
    } 
} 
+0

Zawiera listę tylko lokalnych drukarek, a nie drukarek sieciowych. – awe

+0

resp: spróbuj zaktualizowanego kodu – Simon

+0

Dziękuję, to działało idealnie na to, czego potrzebuję +1 –

13
  • Uzyskaj domyślną drukarkę z LocalPrintServer.DefaultPrintQueue
  • uzyskać zainstalowane drukarki (z punktu widzenia użytkownika) z PrinterSettings.InstalledPrinters
  • Enumerate poprzez lista:
  • Każda drukarka począwszy \\ to drukarka sieciowa - tak dostać kolejkę z new PrintServer("\\UNCPATH").GetPrintQueue("QueueName")
  • Każda drukarka nie rozpoczynające \\ to drukarka lokalna więc się go z LocalPrintServer.GetQueue("Name")
  • Można zobaczyć, który jest domyślnym porównując FullName nieruchomości.

Uwaga: drukarka sieciowa może być domyślną drukarką z LocalPrintServer.DefaultPrintQueue, ale nie pojawiają się w 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); 
+0

Dzięki Simon - bardzo przydatne. – PolicyWatcher

1

W innym poście (https://stackoverflow.com/a/30758129/6513653) relationed do tego, Scott Chamberlain powiedział: „Nie wierzę, jest coś w .NET, które może to zrobić, będziesz musiał wykonać połączenie natywne ". Po wypróbowaniu wszystkich możliwych zasobów .NET, myślę, że ma rację. Tak więc zacząłem badać, w jaki sposób dialog ADD DRUKARKA przeprowadza wyszukiwanie. Korzystając z Wiresharka, dowiedziałem się, że ADD PRINTER wysyła co najmniej dwa typy pakietów do wszystkich hostów w sieci lokalnej: dwa żądania http/xml do 3911 portów i trzy żądania SNMP. enter image description here Pierwszym żądaniem SNMP jest następny 1.3.6.1.2.1.43, który jest Printer-MIB. Drugi to get 1.3.6.1.4.1.2699.1.2.1.2.1.1.3, który jest pmPrinterIEEE1284DeviceId z PRINTER-PORT-MONITOR-MIB. Jest to najbardziej interesujące, ponieważ pochodzi z nazwy drukarki ADD PRINTER. Trzeci to get 1.3.6.1.2.1.1.1.0, który jest sysDescr z SNMP MIB-2 System. Wierzę, że drugie żądanie SNMP wystarczy, aby znaleźć większość drukarek sieciowych w sieci lokalnej, więc zrobiłem ten kod. Działa dla aplikacji Windows Form i zależy od SnmpSharpNet.

Edytuj: Używam Pinga ARP zamiast zwykłego Ping do wyszukiwania aktywnych hostów w sieci.Link do przykładowego projektu:? ListNetworks C# Project

Powiązane problemy