2009-06-19 3 views
12

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 est que les imprimantes locales sont également affichées (avec XPS Document Writer et autres). Si je peux énumérer les imprimantes réseau moi-même, je peux montrer une boîte de dialogue personnalisée avec seulement ces imprimantes.Existe-t-il une méthode .NET pour énumérer toutes les imprimantes réseau disponibles?

Merci!

+0

AvailablePrinterInfo est dans quel namespace? Get as Error Le type ou le nom de l'espace de noms 'AvailablePrinterInfo' est introuvable (manque-t-il une directive using ou une référence d'assembly –

Répondre

8

trouvé ce code 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]); 
        } 
       } 
      } 

     } 

Mise à jour:

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

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

+0

Merci, je ne peux énumérer que les noms des imprimantes réseau installées avec quelques petits ajustements à ce code. Maintenant, savez-vous si un peut énumérer toutes les imprimantes réseau VISIBLE (pas seulement celles installées) en utilisant une technique similaire – Pwninstein

+0

essayer cet article: http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=741&lngWId= 10 " Cette fonction API peut énumérer toutes les ressources réseau, y compris les serveurs, postes de travail, imprimantes, partages, répertoires distants, etc. " J'espère que ça aide, bravo –

+0

aucune exception dans la dernière instruction. –

2

PrinterSettiings.InstalledPrinters devrait vous donner la collection que vous voulez

+1

PrinterSettings.InstalledPrinters affiche toujours non imprimantes réseau, ainsi que les imprimantes de documents (PDF Writer, XPS Document Writer, etc ..) – Pwninstein

9

en utilisant la nouvelle 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

Cette liste répertorie uniquement les imprimantes locales et non les imprimantes réseau. – awe

+0

awe: essayez le code mis à jour – Simon

+0

Merci, cela a parfaitement fonctionné pour ce dont j'ai besoin +1 –

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

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

Merci Simon - très utile. – PolicyWatcher

1

Dans un autre poste (https://stackoverflow.com/a/30758129/6513653) relationed à celui-ci, Scott Chamberlain a dit: « Je ne crois pas il y a quelque chose dans .NET qui peut le faire, vous devrez faire un appel natif ". Après avoir essayé toutes les ressources .NET possibles, je pense qu'il a raison. Ainsi, j'ai commencé à étudier comment la boîte de dialogue AJOUTER IMPRIMANTE fait votre recherche. En utilisant Wireshark, j'ai découvert que ADD PRINTER envoyait au moins deux types de paquets à tous les hôtes du réseau local: deux requêtes http/xml au port 3911 et trois requêtes SNMP. enter image description here La première requête SNMP est un get-next 1.3.6.1.2.1.43, 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 d'intérêt, car 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 dans le réseau local, donc j'ai fait ce code. Cela fonctionne pour Windows Form Application et dépend de SnmpSharpNet. Edit: J'utilise Ping ARP au lieu de Ping normal pour rechercher des hôtes actifs dans le réseau.Lien pour un exemple de projet: ListNetworks C# Project

Questions connexes