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 !!

Foi útil?

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 com new PrintServer("\\UNCPATH").GetPrintQueue("QueueName")
  • Qualquer impressora não começa com \\ é uma impressora local para obtê-lo com LocalPrintServer.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. enter descrição da imagem aqui 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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top