Domanda

Esiste un modo semplice per enumerare tutte le stampanti di rete visibili in .NET? Attualmente, sto mostrando PrintDialog per consentire all'utente di selezionare una stampante. Il problema è che vengono visualizzate anche le stampanti locali (insieme a XPS Document Writer e simili). Se riesco a enumerare le stampanti di rete, posso mostrare una finestra di dialogo personalizzata solo con quelle stampanti.

Grazie !!

È stato utile?

Soluzione

trovato questo codice qui

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

        }

Aggiornamento:

" Questa funzione API può enumerare tutte le risorse di rete, inclusi server, workstation, stampanti, condivisioni, directory remote ecc. "

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

Altri suggerimenti

  • Ottieni la stampante predefinita da LocalPrintServer.DefaultPrintQueue
  • Ottieni le stampanti installate (dal punto di vista dell'utente) da PrinterSettings.InstalledPrinters
  • Enumera nell'elenco:
  • Qualsiasi stampante che inizia con \\ è una stampante di rete, quindi procurati la coda con new PrintServer (" \\ UNCPATH "). GetPrintQueue (" QueueName ")
  • Qualsiasi stampante che non inizia con \\ è una stampante locale, quindi procuratela con LocalPrintServer.GetQueue("Name")
  • Puoi vedere quale è l'impostazione predefinita confrontando la proprietà FullName .

Nota: una stampante di rete può essere la stampante predefinita da LocalPrintServer.DefaultPrintQueue , ma non appare 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);

utilizzando la nuova 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);
     }
 }

PrinterSettings.InstalledPrinters dovrebbe darti la collezione che desideri

In un altro post ( https://stackoverflow.com/a/30758129/6513653 ) relativo a questo, Scott Chamberlain ha detto "Non credo che ci sia qualcosa in .NET che possa fare questo, dovrai effettuare una chiamata nativa". Dopo aver provato tutte le possibili risorse .NET, penso che abbia ragione. Quindi, ho iniziato a studiare come la finestra di dialogo AGGIUNGI STAMPANTE esegue la ricerca. Usando Wireshark, ho scoperto che ADD PRINTER invia almeno due tipi di pacchetti a tutti gli host nella rete locale: due richieste http / xml alla porta 3911 e tre richieste SNMP. inserisci qui la descrizione dell'immagine La prima richiesta SNMP è una 1.3.6.1.2.1.43 get-next, ovvero Printer-MIB. Il secondo, è un get 1.3.6.1.4.1.2699.1.2.1.2.1.1.3 che è pmPrinterIEEE1284DeviceId di PRINTER-PORT-MONITOR-MIB. Questo è il più interessante perché è dove ADD PRINTER prende il nome della stampante. Il terzo è get 1.3.6.1.2.1.1.1.0, che è sysDescr del sistema SNMP MIB-2. Credo che la seconda richiesta SNMP sia sufficiente per trovare la maggior parte delle stampanti di rete nella rete locale, quindi ho fatto questo codice. Funziona con l'applicazione Windows Form e dipende da SnmpSharpNet.

Modifica: sto usando ARP Ping invece del normale Ping per cercare host attivi in ??rete. Link per un progetto di esempio: Progetto ListNetworks C #

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top