Ein herzliches Hallo an alle,
aktuell befasse ich mich mit der Frage, wie ich am einfachsten erfahren kann, ob ein Netzwerkdrucker erreichbar ist oder nicht? Ganz ohne Dialoge etc. also einfach anhand der Adresse im Netzwerk: \RechnerA\DruckerA
Das ganze soll in einer Assembly verpackt werden und dann auf einem MSSQL Server 2005 eingebunden werden.
Eine Lösung hatte ich schon:
PrintDocument printDocument = new PrintDocument();
printDocument.PrinterSettings.PrinterName = pathToFile;
isOnline = printDocument.PrinterSettings.IsValid;
Jedoch meckert hier der SQL-Server, da diese Lösung auf .NET 1.1 basiert und der möchte doch gerne was von .NET 2.0 😕
Gibt es hierfür eine einfache Lösung?
Viele Grüße
Also ich bin inzwischen selbst auf folgende Methode gestoßen:
Man bindet den winspool Treiber ein
[DllImport("winspool.Drv", EntryPoint = "OpenPrinterA", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
public static extern bool OpenPrinter([MarshalAs(UnmanagedType.LPStr)] string szPrinter, out IntPtr hPrinter, IntPtr pd);
Die Abfrage ob ein Drucker Online ist oder nicht sieht dann folgendermaßen aus:
public bool PrinterIsOnline(string PrinterName)
{
bool isOnline = false;
IntPtr hPrinter = new IntPtr(0);
if(OpenPrinter(PrinterName.Normalize(), out hPrinter, IntPtr.Zero))
isOnline = true;
return isOnline;
}
Nach ein paar Versuchen kann ich sagen, dass es wirklich funktioniert. Falls jemand noch Anmerkungen, Kritik hat etc. bitte raus damit! Es funktioniert zwar, doch das dies der gängige Weg ist, wage ich zu bezweifeln.
Viele Grüße
Wäre anpingen nicht noch ne Möglichkeit?
Die OpenPrinter Methode prüft nur lokale drucker, also keine verfügbarkeit von Netzwerkdruckern, die noch nicht verbunden sind.