Existe-t-il un moyen .NET pour énumérer toutes les imprimantes réseau disponibles?

StackOverflow https://stackoverflow.com/questions/1018001

  •  06-07-2019
  •  | 
  •  

Question

Existe-t-il un moyen simple d’énumérer toutes les imprimantes réseau visibles dans .NET? Actuellement, je montre le PrintDialog pour permettre à l'utilisateur de sélectionner une imprimante. Le problème, c’est que les imprimantes locales sont également affichées (avec XPS Document Writer, etc.). Si je peux énumérer moi-même les imprimantes réseau, je peux afficher une boîte de dialogue personnalisée avec ces imprimantes uniquement.

Merci !!

Était-ce utile?

La solution

a trouvé ce code ici

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

        }

Mise à jour:

"Cette fonction API peut énumérer toutes les ressources réseau, y compris les serveurs, les postes de travail, les imprimantes, les partages, les répertoires distants, etc."

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

Autres conseils

  • Obtenir l'imprimante par défaut à partir de LocalPrintServer.DefaultPrintQueue
  • Obtenez les imprimantes installées (du point de vue de l'utilisateur) à partir de PrinterSettings.InstalledPrinters
  • Énumérez la liste:
  • Toute imprimante commençant par \\ est une imprimante réseau. Obtenez donc la file d'attente avec new PrintServer ("\\ UNCPATH"). GetPrintQueue ("QueueName")
  • Toute imprimante ne commençant pas par \\ est une imprimante locale. Vous devez donc l'obtenir avec LocalPrintServer.GetQueue (" nom ")
  • Vous pouvez voir quelle est la valeur par défaut en comparant la propriété FullName .

Remarque: une imprimante réseau peut être l'imprimante par défaut à partir de LocalPrintServer.DefaultPrintQueue , mais ne pas apparaître dans 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);

utilisant la nouvelle 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 devrait vous fournir la collection souhaitée

.

Dans un autre article ( https://stackoverflow.com/a/30758129/6513653 ) lié à celui-ci, Scott Chamberlain a déclaré: "Je ne pense pas que rien dans .NET puisse le faire, vous devrez passer un appel natif". Après avoir essayé toutes les ressources .NET possibles, je pense qu’il a raison. J'ai donc commencé à étudier comment la boîte de dialogue ADD PRINTER (ADD IMPRIMANTE) effectue sa recherche. En utilisant Wireshark, j'ai découvert que ADD PRINTER envoyait au moins deux types de packages à tous les hôtes du réseau local: deux requêtes http / xml sur le port 3911 et trois requêtes SNMP. entrer la description de l'image ici La première demande SNMP est un 1.3.6.1.2.1.43 get-next, qui est Printer-MIB. Le second est un get 1.3.6.1.4.1.2699.1.2.1.2.1.1.3 qui est pmPrinterIEEE1284DeviceId de PRINTER-PORT-MONITOR-MIB. C’est le plus intéressant, car c’est là que ADD PRINTER prend le nom de l’imprimante. Le troisième est un get 1.3.6.1.2.1.1.1.0, qui est sysDescr du système SNMP MIB-2. Je crois que la deuxième requête SNMP est suffisante pour trouver la plupart des imprimantes réseau sur le réseau local, alors j'ai créé ce code. Cela fonctionne pour Windows Form Application et cela dépend de SnmpSharpNet.

Edit: J'utilise ARP Ping à la place de Ping normal pour rechercher des hôtes actifs dans le réseau. Lien vers un exemple de projet: Projet C # de ListNetworks

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top