Esiste un modo .NET per enumerare tutte le stampanti di rete disponibili?
-
06-07-2019 - |
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 !!
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 connew PrintServer (" \\ UNCPATH "). GetPrintQueue (" QueueName ")
- Qualsiasi stampante che non inizia con
\\
è una stampante locale, quindi procuratela conLocalPrintServer.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.
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 #