Frage

Gibt es eine einfache Möglichkeit, alle sichtbaren Netzwerkdrucker in .NET aufzuzählen? Derzeit zeige ich die Printdialog dem Benutzer zu ermöglichen, einen Drucker auszuwählen. Das Problem mit diesem ist, werden lokale Drucker als auch angezeigt werden (zusammen mit XPS Document Writer und dergleichen). Wenn ich Netzwerkdrucker selbst aufzählen kann, kann ich nur mit diesen Druckern einen benutzerdefinierten Dialog zeigen.

Danke !!

War es hilfreich?

Lösung

Mit diesem Code hier

 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]);
                    }
                }
            }

        }

Update:

„Diese API-Funktion alle Netzwerk-Ressourcen auflisten kann, einschließlich Server, Workstations, Drucker, Aktien, Remote-Verzeichnisse usw.“

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

Andere Tipps

  • Holen Sie sich den Standarddrucker aus LocalPrintServer.DefaultPrintQueue
  • Holen Sie sich die installierten Drucker (aus Sicht des Anwenders) von PrinterSettings.InstalledPrinters
  • Aufzählen durch die Liste:
  • Jeder Drucker mit \\ beginnt, ist ein Netzwerkdrucker - so die Warteschlange mit new PrintServer("\\UNCPATH").GetPrintQueue("QueueName") bekommen
  • Jeder Drucker nicht mit \\ beginnt, ist ein lokaler Drucker es so bekommen mit LocalPrintServer.GetQueue("Name")
  • Sie können sehen, welche standardmäßig von FullName Eigenschaft zu vergleichen.

Hinweis: ein Netzwerkdrucker als Standarddrucker aus LocalPrintServer.DefaultPrintQueue sein kann, aber nicht erscheint in 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);

Um den neuen 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 sollten Sie die Sammlung, die Sie wollen

In einem anderen Beitrag ( https://stackoverflow.com/a/30758129/6513653 ) zu diesem relationed, Scott Chamberlain sagte: „ich glaube nicht, dass es etwas gibt, in .NET, die dies tun können, müssen Sie eine native Anruf tätigen“. Nach versuchen, die alle möglichen .NET Ressource, ich glaube, er hat recht. Also fing ich an, zu untersuchen, wie ADD Druckerdialog hat seine Suche. Mit Wireshark, fand ich heraus, dass Drucker senden mindestens zwei Arten von Paketen an alle Hosts in lokalem Netzwerk ADD: zwei http / xml Anfrage an 3911-Port und drei SNMP-Anfragen. „eingeben Die erste SNMP-Anforderung ist ein get-next 1.3.6.1.2.1.43, die Drucker-MIB ist. Die zweite, eine bekommen, die 1.3.6.1.4.1.2699.1.2.1.2.1.1.3 pmPrinterIEEE1284DeviceId von PRINTER-PORT-MONITOR-MIB ist. Dies ist der interessanteste, da ist, wo ADD PRINTER Druckernamen nehmen. Der dritte ist ein get 1.3.6.1.2.1.1.1.0, die sysDescr von SNMP MIB-2-System ist. Ich glaube, dass die zweite SNMP-Anforderung genug ist, die meisten von Netzwerkdruckern in lokalem Netzwerk zu finden, so habe ich diesen Code. Es funktioniert für Windows Forms-Anwendung und es hängt von SnmpSharpNet.

Edit: Ich verwende ARP Ping statt normalen Ping aktiven Rechner im Netzwerk zu suchen. Link für ein Beispielprojekt: ListNetworks C # Projekt

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top