利用可能なすべてのネットワークプリンターを列挙する.NETの方法はありますか?
-
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#プロジェクト