2012-04-11 8 views
2

Ich habe einige Code, der ein Dokument mit dem System.Drawing.Printing Namespace druckt. Dies muss jetzt in einen Windows-Dienst verschoben werden. The documentation gibt an, dass dies nicht möglich ist, was meine bisherigen Ergebnisse unterstützen würde (insofern es nicht funktioniert). Ich arbeite unter der Annahme, dass ich dies mit dem Namespace System.Printing stattdessen arbeiten kann. HierDrucken EMF von einem Windows-Dienst

ist der Code, den ich bisher:

private Metafile myDoc; 

myDoc = GetEmfDoc(); 

PrintServer ps = new PrintServer("\\server1\printer1"); 
EnumeratedPrintQueueTypes[] flags = { EnumeratedPrintQueueTypes.Local }; 
PrintQueueCollection queues = ps.GetPrintQueues(flags); 

PrintQueue pq = queues.First<PrintQueue>();     
pq.AddJob("JobName", ?); 

Deshalb möchte ich myDoc-pq.AddJob() passieren, aber dies scheint nicht möglich zu sein. Unter Verwendung von System.Drawing.Printing war es möglich, dies seitenweise im Ereignis PrintDocument.PrintPage einfach darzustellen.

Ist was ich versuche zu tun, und wenn ja, könnte mir jemand in die richtige Richtung zeigen?

+0

Haben Sie versucht, den Dienst so zu konfigurieren, dass er sich als "Lokales Systemkonto" anmeldet + Aktivieren Sie das Kontrollkästchen "Dienst mit dem Desktop interagieren"? –

+0

Bis jetzt ist dies der nächste, dem ich zu einer Lösung gekommen bin. Die Verwendung von System.Drawing.Printing.PrintDocument funktioniert, wenn dieses Flag gesetzt ist und kein Aufruf von PrintSettings.IsValid erfolgt. –

Antwort

2

Klassen im System.Drawing.Printing-Namespace werden für die Verwendung in einem Windows-Dienst oder einer ASP.NET-Anwendung oder einem Windows-Dienst nicht unterstützt. Wenn Sie versuchen, diese Klassen innerhalb eines dieser Anwendungstypen zu verwenden, können unerwartete Probleme auftreten, z. B. verringerte Serviceleistung und Laufzeitausnahmen.

Es ist wichtig zu verstehen, was "nicht unterstützt" in diesem Zusammenhang bedeutet. Es bedeutet wörtlich, was es sagt, es versucht, von einem Dienst zu drucken und ein Problem zu entdecken, dann können Sie Microsoft Support nicht anrufen und um Hilfe bitten.

Dies ist nicht ein Problem, das durch System.Drawing induziert ist, ist es ein allgemeines Problem mit Druckertreiber. Codeabschnitte, die vom Druckerhersteller und nicht von Microsoft bereitgestellt werden. Ein bedeutendes Problem bei ihnen ist, dass sie ausnahmslos für die Verwendung von einem Desktop-Programm ausgelegt sind. Word, Acrobat und so weiter. Sie nutzen dies gerne aus, oft öffnen sie ein Fenster, um Sie wissen zu lassen, dass sie daran arbeiten. Nicht zuletzt um den Herstellernamen zu spammen und Sie daran zu erinnern, dass die Tonerkartusche halb leer ist. Diese Fahrer werden sich wahrscheinlich in einem Dienst schlecht benehmen. Die in der Anmerkung erwähnte Klausel "Laufzeitausnahmen".

Das schlimmste Problem mit ihnen ist, dass sie ein Popup-Fenster verwenden, um Sie wissen zu lassen, dass ein Problem vorliegt. Diese Fenster sind nicht sichtbar, wenn Sie den Druckertreiber von einem Dienst verwenden. Sie müssen sich also mit Druckaufträgen beschäftigen, die sich ohne erkennbaren Grund nicht drucken lassen. Die Phrase "geminderte Serviceleistung" in der Notiz.Das ist sehr schwierig zu bewältigen, IT-Mitarbeiter sind einfach nicht in der Lage, das Problem zu beheben, wenn sie keine Diagnose sehen können.

Ihr Ansatz löst dieses grundlegende Problem nicht. Wenn Sie dies wirklich weiterverfolgen möchten, wenden Sie sich an den Druckerhersteller und fragen Sie nach einer spezifischen Beratung. Mach dir keine Hoffnungen, gute Antworten aus Hardware-Unternehmen zu bekommen ist ziemlich schwierig.

0

Führen Sie Ihren Dienst in einem Konto aus, das über die erforderlichen Rechte zur Verwendung des Druckers verfügt? Weitere Details in der Windows Services FAQ.

+0

Der Dienst wird als Administrator ausgeführt, ich bin also sicher, dass dies kein Berechtigungsproblem ist. –

+0

@ pm_2 Ich bin ziemlich sicher, dass als Administrator allein wird nicht lösen die Sitzung 0 Probleme ... – Yahia

1

Dies ist eine Kombination von Berechtigungsproblemen und Session 0 Isolation ...

Die folgenden könnte das Problem lösen Sie Gesicht, obwohl ich es nicht empfehlen:

Wenn Sie wirklich wollen/müssen, dies machen arbeiten müssen Sie eine Anmeldung (vorher!) an den Remote-Server (in Ihrem Beispiel) von Sitzung 0 (nicht von der "normalen" Benutzersitzung) - entweder interaktiv (Sie können auf die Sitzung 0 Desktop über rundll32 winsta.dll,WinStationSwitchToServicesSession wechseln ODER über einige Aufrufe (zB mit WNetAddConnection2 mit den richtigen Anmeldeinformationen für den Remote-Rechner, leider ist dies von .NET nur über p/inv nutzbar Ke oder COM mit WScript.Network). Die für diese Anmeldung verwendeten Anmeldeinformationen müssen über vollständige Berechtigungen zum Drucken auf dem Remotecomputer verfügen.

+0

Der Server in Frage ist Windows Server 2003 –

+0

@ pm_2 danke für die Informationen ABER ich nicht zu verstehen, was das ist Informationen sollen mir über das Problem erzählen, das Sie beschrieben haben ... vielleicht können Sie ... – Yahia

+0

Ich habe verstanden, dass Sitzung 0 Isolation nicht für Win Svr 2003 galt –