2012-04-11 3 views
2

System.Drawing.Printing名前空間を使用して文書を印刷するコードがあります。これは今、Windowsサービスに移動する必要があります。 The documentationはこれが不可能であると述べています。これはこれまでのところ私の知見を裏付けています。私は代わりにSystem.Printing名前空間を使用することによってこれを動作させることができるという前提のもとで作業しています。ここでWindowsサービスからのEMFの印刷

は、私がこれまで持っているコードです:

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", ?); 

だから私はpq.AddJob()myDocを渡したいが、これは可能ではないようです。 System.Drawing.Printingを使用すると、単にPrintDocument.PrintPageイベントのページ単位でこれをレンダリングすることができました。

私は可能なことをしようとしていますか?その場合、誰かが正しい方向に私を向けることができますか?

+0

"ローカルシステムアカウント"としてログオンするようにサービスを設定しました+ "サービスとデスクトップとの対話を許可する"チェックボックスをオンにしましたか? –

+0

これまでのところ、これは私が解決策に来た最も近いものです。このフラグが設定されていればSystem.Drawing.Printing.PrintDocumentを使用し、PrintSettings.IsValidを呼び出すことはありません。 –

答えて

2

System.Drawing.Printing名前空間内のクラスは、WindowsサービスまたはASP.NETアプリケーションまたはサービス内で使用することはできません。これらのアプリケーションタイプのいずれかからこれらのクラスを使用しようとすると、サービスパフォーマンスの低下や実行時例外のような予期しない問題が発生する可能性があります。

この文脈で「サポートされていない」とは何かを理解することが重要です。文字通り、サービスから印刷して問題を発見しようとすると、マイクロソフトサポートに電話して助けを求めることはできません。

これはない System.Drawingによって誘発されています問題であり、それはプリンタドライバと一般的な問題です。マイクロソフトではなく、プリンタの製造元によって提供されるコードの塊。それらの重要な問題は、それらが常にデスクトッププログラムから使用されるように設計されていることです。 Word、Acrobatなど。彼らはすぐにそれを利用し、彼らは彼らが働いていることを知らせるために窓を開くことがよくあります。少なくともメーカー名をスパムして、トナーカートリッジが半分空であることを忘れないようにしてください。これらのドライバは、サービスで誤動作する可能性があります。ノート内で言及された「ランタイム例外」句。

それらの最悪の問題は、ポップアップウィンドウを使用して問題があることを知らせることです。これらのウィンドウは、サービスからプリンタドライバを使用すると表示されません。それで、あなたは、目に見えない理由が印刷を拒否する印刷ジョブに対処しなければならないでしょう。ノート内の「サービスパフォーマンスの低下」句。それは非常に扱いにくいです、ITスタッフは、診断を見ることができないときに問題を解決するための撃墜をするだけで無力です。

あなたのアプローチは、その基本的な問題を解決しません。本当にこれを追求したい場合は、プリンタの製造元に連絡し、具体的なアドバイスを求めてください。あなたの希望を手に入れてはいけません。ハードウェア会社から良い答えを得ることはかなり難しいです。

0

サービスを使用するために必要な権限を持つアカウントでサービスを実行していますか?詳細はWindows Services FAQを参照してください。あなたが本当にこれを行うために/必要性をしたい場合は

+0

サービスは管理者として実行されているため、これはアクセス権の問題ではないと確信しています。 –

+0

@ pm_2私は管理者として実行してもセッション0の問題は解決しないと確信しています... – Yahia

1

これは、権限の問題の組み合わせとセッション0分離である...

次は、私はそれをお勧めしませんが、あなたが直面している問題を解決する可能性がありますあなたは対話的に(セッション0のデスクトップにrundll32 winsta.dll,WinStationSwitchToServicesSessionで切り替えることができます)セッション0の中からリモートサーバ(あなたの例では)にログオンする必要があります)またはいくつかの呼び出しを介して(例えば、WNetAddConnection2を使用してリモートマシンに適切な資格情報を渡すと、残念ながらこれはp/invo経由でのみ.NETから使用できますkeまたはCOMを使用してWScript.Network)。このログオンに使用される資格情報には、リモートマシンでの印刷に関する完全なアクセス許可が必要です。

+0

問題のサーバーはWindows Server 2003です –

+0

@ pm_2情報をいただきありがとうございます。あなたが説明した問題に関して私に教えてください... – Yahia

+0

Win Svr 2003 –

関連する問題