利用可能なすべてのネットワークプリンターを列挙する.NETの方法はありますか?

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

  •  06-07-2019
  •  | 
  •  

質問

.NETで表示されているすべてのネットワークプリンターを列挙する簡単な方法はありますか?現在、ユーザーがプリンターを選択できるようにPrintDialogを表示しています。問題は、ローカルプリンターも(XPS Document Writerなどと一緒に)表示されることです。自分でネットワークプリンターを列挙できる場合は、それらのプリンターだけでカスタムダイアログを表示できます。

ありがとう!!

役に立ちましたか?

解決

このコードはこちら

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

        }

更新:

"このAPI関数は、サーバー、ワークステーション、プリンター、共有、リモートディレクトリなどを含むすべてのネットワークリソースを列挙できます。

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

他のヒント

  • LocalPrintServer.DefaultPrintQueue
  • からデフォルトのプリンターを取得します
  • PrinterSettings.InstalledPrinters
  • からインストールされたプリンターを(ユーザーの観点から)取得する
  • リストを列挙します:
  • \\ で始まるプリンターはすべてネットワークプリンターです。したがって、 new PrintServer(" \\ UNCPATH")。GetPrintQueue(" QueueName")でキューを取得してください>
  • \\ で始まらないプリンタはすべてローカルプリンタなので、 LocalPrintServer.GetQueue(" Name")
  • で取得します。
  • FullName プロパティを比較することにより、どちらがデフォルトであるかを確認できます。

注:ネットワークプリンターは、 LocalPrintServer.DefaultPrintQueue のデフォルトプリンターにすることができますが、 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);

新しい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);
     }
 }

PrinterSettings.InstalledPrinters は、必要なコレクションを提供するはずです

この投稿に関連する別の投稿( https://stackoverflow.com/a/30758129/6513653 )では、スコットチェンバレンは、「。NETにはこれを行うことができるものはないと思います。ネイティブコールを行う必要があります」と述べています。考えられるすべての.NETリソースを試した後、彼は正しいと思います。 そこで、「プリンターの追加」ダイアログがどのように検索するかを調査し始めました。 Wiresharkを使用して、ADD PRINTERは少なくとも2種類のパッケージをローカルネットワークのすべてのホストに送信することがわかりました。3911ポートへの2つのhttp / xml要求と3つのSNMP要求です。 ここに画像の説明を入力してください 最初のSNMP要求はget-next 1.3.6.1.2.1.43、つまりPrinter-MIBです。 2つ目はget 1.3.6.1.4.1.2699.1.2.1.2.1.1.3で、これはPRINTER-PORT-MONITOR-MIBのpmPrinterIEEE1284DeviceIdです。 ADD PRINTERがプリンタ名を取得する場所であるため、これが最も興味深いです。 3番目はget 1.3.6.1.2.1.1.1.0です。これは、SNMP MIB-2システムのsysDescrです。 2番目のSNMP要求は、ローカルネットワーク内のほとんどのネットワークプリンターを見つけるのに十分であると考えているため、このコードを実行しました。 Windowsフォームアプリケーションで動作し、SnmpSharpNetに依存します。

編集:通常のPingの代わりにARP Pingを使用して、ネットワーク内のアクティブなホストを検索しています。サンプルプロジェクトのリンク: ListNetworks C#プロジェクト

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top