Gibt es eine .NET Möglichkeit, alle verfügbaren Netzwerkdrucker aufzuzählen?
-
06-07-2019 - |
Frage
Gibt es eine einfache Möglichkeit, alle sichtbaren Netzwerkdrucker in .NET aufzuzählen? Derzeit zeige ich die Printdialog dem Benutzer zu ermöglichen, einen Drucker auszuwählen. Das Problem mit diesem ist, werden lokale Drucker als auch angezeigt werden (zusammen mit XPS Document Writer und dergleichen). Wenn ich Netzwerkdrucker selbst aufzählen kann, kann ich nur mit diesen Druckern einen benutzerdefinierten Dialog zeigen.
Danke !!
Lösung
Mit diesem Code hier
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:
„Diese API-Funktion alle Netzwerk-Ressourcen auflisten kann, einschließlich Server, Workstations, Drucker, Aktien, Remote-Verzeichnisse usw.“
http: //www.planet- source-code.com/vb/scripts/ShowCode.asp?txtCodeId=741&lngWId=10
Andere Tipps
- Holen Sie sich den Standarddrucker aus
LocalPrintServer.DefaultPrintQueue
- Holen Sie sich die installierten Drucker (aus Sicht des Anwenders) von
PrinterSettings.InstalledPrinters
- Aufzählen durch die Liste:
- Jeder Drucker mit
\\
beginnt, ist ein Netzwerkdrucker - so die Warteschlange mitnew PrintServer("\\UNCPATH").GetPrintQueue("QueueName")
bekommen - Jeder Drucker nicht mit
\\
beginnt, ist ein lokaler Drucker es so bekommen mitLocalPrintServer.GetQueue("Name")
- Sie können sehen, welche standardmäßig von
FullName
Eigenschaft zu vergleichen.
Hinweis: ein Netzwerkdrucker als Standarddrucker aus LocalPrintServer.DefaultPrintQueue
sein kann, aber nicht erscheint 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);
Um den neuen 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);
}
}
PrinterSettiings.InstalledPrinters
sollten Sie die Sammlung, die Sie wollen
In einem anderen Beitrag ( https://stackoverflow.com/a/30758129/6513653 ) zu diesem relationed, Scott Chamberlain sagte: „ich glaube nicht, dass es etwas gibt, in .NET, die dies tun können, müssen Sie eine native Anruf tätigen“. Nach versuchen, die alle möglichen .NET Ressource, ich glaube, er hat recht.
Also fing ich an, zu untersuchen, wie ADD Druckerdialog hat seine Suche. Mit Wireshark, fand ich heraus, dass Drucker senden mindestens zwei Arten von Paketen an alle Hosts in lokalem Netzwerk ADD: zwei http / xml Anfrage an 3911-Port und drei SNMP-Anfragen.
Die erste SNMP-Anforderung ist ein get-next 1.3.6.1.2.1.43, die Drucker-MIB ist. Die zweite, eine bekommen, die 1.3.6.1.4.1.2699.1.2.1.2.1.1.3 pmPrinterIEEE1284DeviceId von PRINTER-PORT-MONITOR-MIB ist. Dies ist der interessanteste, da ist, wo ADD PRINTER Druckernamen nehmen. Der dritte ist ein get 1.3.6.1.2.1.1.1.0, die sysDescr von SNMP MIB-2-System ist.
Ich glaube, dass die zweite SNMP-Anforderung genug ist, die meisten von Netzwerkdruckern in lokalem Netzwerk zu finden, so habe ich diesen Code. Es funktioniert für Windows Forms-Anwendung und es hängt von SnmpSharpNet.
Edit: Ich verwende ARP Ping statt normalen Ping aktiven Rechner im Netzwerk zu suchen. Link für ein Beispielprojekt: ListNetworks C # Projekt