サービス アカウントからネットワーク共有プリンターへの印刷が時々失敗する

適用対象: Microsoft Windows XP Home EditionMicrosoft Windows XP ProfessionalMicrosoft Windows Server 2003 R2 Datacenter Edition (32-Bit x86)

現象


次のシチュエーションを考えます。

サービス アカウントで動作しているプロセスから、UNC パスを指定してネットワーク共有プリンターへ接続します。
複数回の印刷を行っていると、時々 StartDocPrinter 関数や、DocumentProperties 関数などの実行が失敗します。

このとき、最終エラーコードは ERROR_PRINTER_DELETED です。

原因


ネットワーク サービス アカウントは、ポイント アンド プリントで接続するネットワーク共有プリンターへの恒久的な接続を保持することができません。

すべてのネットワーク共有プリンターへの接続は一時接続となりますため、ClosePrinter が実行され、保持しているハンドル数が 0 になった場合にはプリンター接続の削除が実行されます。削除が完了するまで、ネットワーク共有プリンターへの接続は正しく動作しません。

解決方法


問題を回避するためには、次の回避策をご検討ください。

(1) ネットワーク印刷用のローカル ポートを作成する

[プリンターの追加] 画面から LocalPort を作成し、ポートの名前を UNC パスに設定します。
これにより、ネットワーク共有プリンターに印刷するためのローカル プリンターを作成することができます。
サービス アカウントからの印刷実行時には、上記にて作成したローカル プリンターを指定して印刷することで、一時コネクションであることによる問題の発生を回避することができます。

(2) StartDocPrinter や DocumentProperties 関数の再試行を実装する

ERROR_PRINTER_DELETED のエラーにつきましては、時間の経過によってプリンターの削除が完了し、再度印刷が可能となります。
このため、ERROR_PRINTER_DELETED が検出された場合には、一定時間後に関数の実行を再試行していただくよう、プログラムを変更することについて検討してください。

詳細


サービス アカウントからの、ポイント アンド プリントによるネットワーク共有プリンターへの接続は推奨されておりません。