Printer Driver Isolation

こんにちは、A尾です。

前回の予告通り、今回は Windows 7 よりサポートされた Printer Driver Isolation についてお話しさせていただきます。

 

Windows 7 以前の Windows OS では、プリント プロセッサやプリンタ ドライバはスプーラ サービスのプロセス上にて動作していましたが、Windows 7 以降では、Printer Driver Isolation により、これまでスプーラサービス上で動作していたプリント プロセッサやプリンタ ドライバをスプーラ サービス以外の別プロセス上にて動作させることが出来るようになりました。これまでは印刷時のプリントプロセッサやプリンタ ドライバの動作に起因してスプーラ サービスが落ちてしまっていたような状況においても、この機能にてプロセスを分離させることで、スプーラ サービスが落ちてしまうのを回避できるようになりました。(RAW スプーリングの場合はこれまで通り、プリンタ ドライバはアプリケーション プロセスから呼ばれます。)

開発環境やスタンド アロン環境ではあまり恩恵を受けることはあまりないかもしれませんが、プリント サーバーなどのスプーラ サービスが意図せず終了してしまう状況が許されない環境では重宝される機能かと思います。

 

 

■ プロセス分離モードについて

Printer Driver Isolation には、「なし」「共有」「分離」の3つのモードがあり、プリンタドライバごとに設定が可能です。

 

「なし」

プロセスの分離を行いません。

これまで通りスプーラ サービス上にてプリント プロセッサやプリンタ ドライバが呼び出されます。

 

「共有」

プロセスの分離を行います。

印刷時に PrintIsolationHost.exe が起動し、このプロセス上にてプリントプロセッサやプリンタ ドライバが呼び出されます。

また、他の「共有」モードで動作するプリンタ ドライバが存在する場合、この PrintIsolationHost.exe プロセスを共有して使用します。

 

「分離」

プロセスの分離を行います。

「共有」モードと同様に印刷時に PrintIsolationHost.exe が起動しますが、このプロセス上から複数のプリントプロセッサやプリンタ ドライバが呼び出されることはありません。

 

なお、これらのモードについてはプリンタドライバごとの設定となるため、同じプリンタ ドライバを使用するプリンタ オブジェクトが複数存在する場合には、そのプリンタ オブジェクトは全て同じモードで動作することになります。

また、プリンタ オブジェクトごとの設定はできません。

 

 

■ プロセス分離モードの判定方法

少々複雑で、以下の図のような判定を行っています。

 

clip_image002

 

ひし形が分岐点になります。順番に説明していきますので、このフローと一緒にご確認ください。

 

<GP: Machine DrvIso>

グループ ポリシー [分離プロセスで印刷ドライバーを実行する] の設定となります。グループ ポリシーエディターの [コンピュータの構成] - [管理用テンプレート] - [プリンター] から設定が可能です。ポリシー設定が [無効] の場合にはプロセスの分離を行いませんが、[有効] か [未構成] の場合には上記のフローに沿って判定が行われます。

 

<Per Driver IsoMode Set?> と <Reg: Per Driver IsoMode>

[コントロール パネル] - [管理ツール] - [印刷の管理] の設定となります。[印刷の管理] にて、[プリントサーバー] - [マシン名] - [ドライバー] を開くとインストールされているプリンタ ドライバが一覧で表示され、各プリンタ ドライバのモードを確認・変更することができます。

ここで「システムの規定値(なし)」が設定されていると上記フローの <Per Driver IsoMode Set?> は No となり、それ以外の「なし」「共有」「分離」が設定されていると Yes となります。また、この「なし」「共有」「分離」の設定が <Reg: Per Driver IsoMode> の判定に使用されます。

ちなみにですが、この設定は以下のレジストリに記載されており、SetPrinterDataEx (pValueName=SPLREG_PRINT_DRIVER_ISOLATION_GROUPS) を呼び出すことで変更も可能となっています。

 

  HKLM\SYSTEM\CurrentControlSet\Control\Print\PrintDriverIsolationGroups

 

また、ここに格納される文字列は、以下の規則に則っています。

 

  「なし」のドライバ モデル名 \\ 「共有」のドライバ モデル名 \\ 「分離」のドライバ モデル名

 

※各モードの間には ‘\\’ を配置して区切り、一つのモードに複数のドライバが存在する場合には、モデル名とモデル名の間を '\' で区切ります。

※[印刷の管理] で「システムの規定値(なし)」が設定されている場合、ここにはモデル名が追加されません。

 

例として、ドライバA→なし、ドライバB→共有、ドライバC→分離の場合は以下の通りとなります。

    ドライバA\\ドライバB\\ドライバC

また、ドライバA→共有、ドライバB→共有、ドライバC→分離の場合は以下の通りとなります。

    \\ドライバA\ドライバB\\ドライバC

 

<INF: Driver Compat>

<Per Driver IsoMode Set?> が No だった場合にはこちらの判定が行われます。具体的には、そのドライバが Printer Driver Isolation 互換か否かを INF ファイルに記載されている DriverIsolation の値から判定します。記載例としては、Windows 7 に付属する ntprint.inf を参照していただければと思います。

なお、INF ファイルにて DriverIsolation=2 と指定されている場合は互換性があるものとして判定され、DriverIsolation=0 の場合や何も指定がない場合は互換性がないものとして判定されます。互換性があると判定された場合には「共有」モードにてプロセスの分離を行います。

 

<GP: Override Driver Compat>

上記の <INF: Driver Compat> にて互換性がないと判定された場合、グループ ポリシーの [印刷ドライバーによって報告された印刷ドライバー実行互換性の設定を上書きする] の設定が適用されます。グループポリシー エディターの [コンピュータの構成] - [管理用テンプレート] - [プリンター] から設定が可能です。

ポリシー設定が [有効] の場合には「共有」にてプロセスの分離を行い、[無効] か [未構成] の場合にはプロセスの分離は行いません。

 

 

今回は以上となりますが、いかがでしたでしょうか?

開発とはあまり関係ない内容だったかもしれませんが、Windows 7 からサポートされた機能ということで紹介させていただきました。

お時間あるときにでも実際の動作をご確認いただければと思います。

 

それではまた。