Existe uma maneira .NET para enumerar todas as impressoras de rede disponíveis?
-
06-07-2019 - |
Pergunta
Existe uma maneira simples para enumerar todas as impressoras de rede visíveis em .NET? Atualmente, eu estou mostrando o PrintDialog para permitir que o usuário selecione uma impressora. O problema com isto é, impressoras locais são exibidos, bem como (juntamente com XPS Document Writer e similares). Se eu posso enumerar impressoras de rede, posso mostrar um diálogo personalizada com apenas essas impressoras.
Graças !!
Solução
encontrei este código aqui
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:
"Esta função API pode enumerar todos os recursos de rede, incluindo servidores, estações de trabalho, impressoras, ações, diretórios remotos etc."
http: //www.planet- source-code.com/vb/scripts/ShowCode.asp?txtCodeId=741&lngWId=10
Outras dicas
- Obter a impressora padrão do
LocalPrintServer.DefaultPrintQueue
- Obter as impressoras instaladas (do ponto de vista do usuário) a partir
PrinterSettings.InstalledPrinters
- enumerar a lista:
- Qualquer impressora começando com
\\
é uma impressora de rede - de modo a obter a fila comnew PrintServer("\\UNCPATH").GetPrintQueue("QueueName")
- Qualquer impressora não começa com
\\
é uma impressora local para obtê-lo comLocalPrintServer.GetQueue("Name")
- Você pode ver que é padrão, comparando propriedade
FullName
.
Nota: a impressora de rede pode ser a impressora padrão do LocalPrintServer.DefaultPrintQueue
, mas não aparecem em 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);
usando a nova 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);
}
}
PrinterSettiings.InstalledPrinters
deve dar-lhe a coleção que você deseja
Em outro post ( https://stackoverflow.com/a/30758129/6513653 ) relationed a esta, Scott Chamberlain disse: "Eu não acredito que haja qualquer coisa em .NET que pode fazer isso, você vai precisar fazer uma chamada nativa". Depois de tentar todos os possíveis recursos .NET, acho que ele está certo. Então, comecei a investigar como diálogo Adicionar impressora faz a sua pesquisa. Usando Wireshark, eu descobri que ADD impressão Enviar pelo menos dois tipos de pacotes para todos os hosts na rede local: pedido de dois http / xml para 3911 porto e três pedidos SNMP. O primeiro pedido SNMP é um get-próximo 1.3.6.1.2.1.43, que é Printer-MIB. O segundo, é um get 1.3.6.1.4.1.2699.1.2.1.2.1.1.3 que é pmPrinterIEEE1284DeviceId de IMPRESSORA-PORT-MONITOR-MIB. Este é o mais interessante, porque é onde Adicionar impressora leva o nome da impressora. O terceiro é um get 1.3.6.1.2.1.1.1.0, que é sysDescr de SNMP MIB-2 do sistema. Eu acredito que o segundo pedido SNMP é suficiente para encontrar a maioria das impressoras de rede em rede local, então eu fiz este código. Ele funciona para aplicações Windows Form e depende de SnmpSharpNet.
Edit: eu estou usando ARP Ping Ping vez normais para pesquisar hosts ativos na rede. Fazer a ligação para um projeto de exemplo: ListNetworks C # projeto