# Samba2.2.xでの印刷サポート

# 序論

2.2.0のリリース開始とともに、 Sambaは(SPOOLSSという名前付きパイプなどの)MS-RPCを使った Windows NT固有の印刷メカニズムをサポートした。 以前のSambaのバージョンでは、 LanManの印刷関数を利用しているのみであった．

新しいSPOOLSSをサポートすることで、以下のような機能が追加された:

- Windows 95/98/NT/2000で、 要求に応じてプリンタドライバのファイル をダウンロードすることをサポートした。

- Windows NTのプリンタ追加ウイザード (Add Printer Wizard/APW)やImprints(Installation Manager of Printer driver Retreival and Installation for Samba)から プリンタドライバーをアップロードできるようにした。(参照: http://imprints.sourceforge.net).

- MS-RPC固有のプリント関数、StartDocPrinter，EnumJobs()等をサポートした。 Win32の印刷APIに関しては、MSDNのドキュメントを参照:http://msdn.microsoft.com/

- NTのプリンタオブジェクトのアクセス制御リスト(ACL)をサポートした。

- スプールジョブ情報の内部データベース経由のプリンタキュー操作 サポートを改善した。

初期の段階では、Windowsクライアントに印刷機能をサポートするために、Samba ホストにインストールされたプリンタドライバーがどの機能をサポートするべきかどうかで、 混乱があった。 Samba2.2.0では、Windows NT/2000クライアントからの要求にこたえ、指示されたプリンタに対して 間違ったドライバーを処理するというバグが存在していた。 このバグはSamba2.2.1では修正され、再びWindows NT/2000クライアントはSambaプリンタサーバーに対して、APWを使ってドライバーを インストールすることが出来るようになった。Windows9xに関しても同様な挙動を示すことになる。サイドノートにあるように、Sambaは いかなる場合でも、スブールされたデータを処理するために、これらのドライバーを使用していない。 クライアント側の利便性のためだけにに用意されている。

以下のマイクロソフトKBの記事が、Windows 2000クライアントを使用するための助けになる。

http://support.microsoft.com/support/kb/articles/Q189/1/05.ASP

# 設定

[print$] と [printer$]

以前のSambaのバージョンでは、共有名に[printer$]を使うことが推奨されていた。 この名前は、プリンタが共有されるときにWindows9xクライアントが作成するprinter$サービスに 由来している。Windows9xのプリンタサービスは常にprinter$サービスを持っていて、プリンタドライバーの ダウンロードをサポートするために、パスワードなしでリードオンリーのアクセスを提供していた。

しかしながら、初期の実装は`printer driver location`と呼ばれるバラメータに依存していて、 プリンタに対応したドライバーファイルの保存場所を特定するために使用していた。 もう一つのバラメータは`printer driver`で、クライアントに送るべき プリンタドライバー名を指定するために使われていた

`printer driver file`を含む、これらのバラメータは次第に使用されなくなり、 新しいシステムでは使用されなくなった。この変更に関するより詳細な情報は、このドキュメントのMigration sectionを 参照すること。

## [print$] の作成

プリンタドライバーファイルのアップロードをサポートするためには、[print$]と呼ばれる共有ファイルの設定を行う必要がある。 この共有の名前は、Samba内部でハードコーディングされており、非常に重要なものである。(print$はWindows NT印刷サービスが プリンタドライバーのダウンロード機能を実現するために使用している。)

サーバー上のsmb.confファイルを変更して、グローバルパラメータを追加する必要がある。 その後、以下のファイル共有を作成する(もちろん、一部のバラメータ値、たとえば'path'は任意の値を取ることができ、インストール するサイトにあわせて設定すべきである。

    [global]
    	; ntadminグループのメンバーはドライバーを追加したり、
    	; ブリンターブロパティーををセットすることができる。
    	; rootは暗黙のうちに、'printer admin'となる
    	printer admin = @ntadmin

    [print$]
    	path = /usr/local/samba/printers
    	guest ok = yes
    	browseable = yes
    	read only = yes
    	; この共有をread onlyに設定すると、'write list'が必要になる。
    	; ファイルシステムのパーミッションを確認して、このアカウントがこの共有にファイルをコピーすることが
    	; できるかどうかを確認すること。もしこれがroot以外のアカウントに設定されると、
    	; 自動的に 'printer admin'として存在することになる。
    	write list = @ntadmin,root

`write list`を、共有エリアに対して、 (ドライバー)ファイルをアップロードする際に、ユーザーアカウントの管理レベルが適切かどうかを判断するために使用する。 共有ファイルに関してのより詳細な情報は、smb.conf(5) を参照のこと.

guest ok = yesこの設定は、 使用するサイトがどのように設定されているかどうかに関わる。 ユーザーがSambaホストにユーザーがアカウントを持っていることが保証されるのなら、この設定をする必要はない。

> Author's Note: すべてのWindows NTユーザーがSambaサーバーによって認証されることが保証されている場合、 (たとえばドメインメンバーサーバーや、NTユーザーがNTコンソールにログインする際に、すでにドメインコントローラにより 認証されているように)ゲストアクセスは必要ない。 　もちろん、ワークグループを使用する環境で、アカウントやセキュリティーといったことに悩まされることなく、 単に印刷をしたいだけなら、この共有をゲストアカウントに設定することも出来る。 　 ［global］セクションに、map to guest = Bad User と加えることも出来る。ただし、この設定をする前にこのパラメータがどのような働きをするのかを 十分に理解してから行って欲しい。

Windows NTサーバーが複数のアーキテクチャのクライアント用のドライバーファイルをダウンロードする機能を持たせるために、 サポートするアーキテクチャごとに［print$］サービスにおいて、各アーキテクチャごとに サブディレクトリを作成する必要がある。 Sambaはこの機能を再現している。

以下に［print$］共有が、サポートをしたいアーキテクチャごとに作成するディレクトリりツリーを示す。

    [print$]-----
    		|-W32X86		   ; "Windows NT x86"
    		|-WIN40 		   ; "Windows 95/98"
    		|-W32ALPHA		   ; "Windows NT Alpha_AXP"
    		|-W32MIPS		   ; "Windows NT R4000"
    		|-W32PPC		   ; "Windows NT PowerPC"

注意！　パーミッションの設定

Sambaホストに新しいドライバーを追加する場合、以下の2つの条件が成立していなければならない。

- Sambaホストに接続する際に使用するアカウントはuidが0でなければならない。 (つまり、 rootアカウント)

- Sambaホストに接続する際に使用するアカウントは`プリンタ管理者(admin)のメンバーでなければいけない` list.

もちろん、接続に使用したアカウントで、［print$］配下のサブディレクトリにファイルを加える作業を行う。 ディフォルトでは、この共有上のすべてのファイルは'read only'属性に設定してある点に留意して欲しい。

ひとたび［print$］サービスを起動し、サブディレクトリと関連付けをしたら、 後は単純にWinodwsNT4.0クライアントから、rootアカウント (あるいは`printer admin`)でSambaサーバーに ログインしSambaサーバーの”Printers”フォルダーを操作するだけである。 そこにはSambaホスト上で共有定義されたプリンタの一覧が表示されているだろう。

## プリンタドライバーの設定

Sambaホスト上のプリンタフォルダーに表示されるプリンタ一覧は、ホストに実際に接続された プリンタに対するドライバーとは異なっている。 Samba2.2.0のディフォルトの設定では、プリンタドライバーの名前は NO PRINTER DRIVER AVAILABLE FOR THIS PRINTERとなっている。 新しいバージョンでは、この文字列はNULL文字に設定され、NT/2000クライアントの プリンタ追加ウイザードの設定が反映されるようになっている。 この初期値(NULL文字列)のままのプリンタのプロパティーを見ようとすると、エラーメッセージが表示されることになる。

デバイスの設定は表示できない。そのプリンタに対するドライバーがインストールされていなければ、 スプーラーのプロパティーだけが表示される。「ドライバーをインストールしますか」

エラーダイアログの”No”をクリックすると、プリンタプロパティーウインドーが表示される。 プリンタのドライバーを設定するためには、

- "New Driver..."ボタンを押して新しいプリンタドライバーをインストールするか、

- インストール済みのドライバー一覧の中から選択する。(初期状態では、このリストは空) のいずれかの手法をとる

"Windows NT x86"以外のオペレーティングシステム用のプリンタドライバーをインストールしたい場合は、 プリンタプロパティーダイアログの"Sharing(共有)"タブを使用する必要がある。

rootアカウントで接続している場合、ACLやデバイスの設定といったその他のプロパティーをこのダイアログで変更することが出来る。

このセクションのコメントの中で、Windows NTプリントサーバーは、プリンタフォルダー内に 共有指定されていないプリンタを表示させることが可能であると解説した。 Sambaはこのようなことはしない。定義に従い、Sambaは`smb.conf`で公開すると指定されたプリンタのみを公開する。

もう一つの興味深い点は、Windows NTクライアントはSMBプリンタ共有を使用しないが、MS-RPCを使用して Windows NTホストが持つプリンタに対して直接プリントできる点だ。 このことは印刷中のクライアントは、プリンタを公開しているリモートホストに対して、特権をもっているということになる。 Windows NTによって設定されたブリンターのデフォルトのパーミッションとしては、 "Everyone"に対して、"印刷" 権限が与えられる。

## 多数のプリンタのサポート

Samba 2.2の開発フェーズの間、問題点として指摘されていた件の一つに、100個のプリンタ用のドライバー ダウンロードをサポートする必要があるというものがあった。 Windows NT APWを使う際にプリンタリストを用いることが煩雑だといわれている。 もし一つ以上のプリンタが同一のドライバーを使用する場合、rpcclient's setdriver commandでインストール済みのドライバーに関連付けすることが出来る。 以下でこの点をどのように成し遂げたかを解説する。 /para>

    $ rpcclient pogo -U root%secret -c "enumdrivers"
    Domain=[NARNIA] OS=[Unix] Server=[Samba 2.2.0-alpha3]

    [Windows NT x86]
    Printer Driver Info 1:
    	 Driver Name: [HP LaserJet 4000 Series PS]

    Printer Driver Info 1:
    	 Driver Name: [HP LaserJet 2100 Series PS]

    Printer Driver Info 1:
    	 Driver Name: [HP LaserJet 4Si/4SiMX PS]

    $ rpcclient pogo -U root%secret -c "enumprinters"
    Domain=[NARNIA] OS=[Unix] Server=[Samba 2.2.0-alpha3]
    	 flags:[0x800000]
    	 name:[\\POGO\hp-print]
    	 description:[POGO\\POGO\hp-print,NO DRIVER AVAILABLE FOR THIS PRINTER,]
    	 comment:[]

    $ rpcclient pogo -U root%secret \
    >  -c "setdriver hp-print \"HP LaserJet 4000 Series PS\""
    Domain=[NARNIA] OS=[Unix] Server=[Samba 2.2.0-alpha3]
    Successfully set hp-print to driver HP LaserJet 4000 Series PS.

## Windows NTのAPWを使い、新しいプリンタを登録する

初期状態では、Sambaは`smb.conf`で指定されたすべてのプリンタを "Printers..."フォルダー内に公開する。 このフォルダーの中には、Windows NTのプリンタ追加ウイザードアイコンも存在している。 APWは以下の条件が成立する場合、このアイコンを表示する。

- 接続中のユーザーが管理者特権(i.e. root か `printer admin`)を使用して OpenPrinterEx(\\server)を正しく実行できること

- パラメータ

  `show add printer wizard = yes`となっていること(the default).

Sambaサーバーに対して、APWがプリンタの追加を正しく行うためには、 `add printer command` に正しく値が設定されていなければならない。プログラムは、可能ならシステムファイル(i.e. `/etc/printcap` やその他適切なファイル)と`smb.conf`に プリンタを追加することに成功しなければならない。

APWをクライアントから使用する時に、プリンタ共有が存在しないとsmbdは `add printer command`を実行し、`smb.conf`を再設定し、 新しいプリンタ共有が公開されるように試みる。 それでも共有が定義できない場合は、"Access Denied"エラーをクライアントに返却する。 `add printer program`はカレントユーザーのコンテキストの元で実行され、ルートアカウントの 元では実行されないことに留意して欲しい。

補足的なコマンドとして、`delete printer command`が"Printers..."フォルダーからプリンタエントリーを削除するために用意されている。

## Sambaとプリンタポート

Windows NT/2000 プリントサーバーはそれぞれのプリンタに対してポートを関連付けている。 ポートは通常LPT1:，COM1:，FILE:等からなる。Sambaはプリンタに割り当てられたポートという概念をサポートしなければならない。 デフォルトでは、"Samba Printer Port"と命名された一つだけのプリンタポートがシステムに存在している。 Sambaは印字するために必ずしもポートを必要としていないが、Windowsクライアントからの要求にこたえるために用意している。

Sambaは"Printer Pooling"という概念はサポートしていない。この概念は論理プリンタを 複数のポートに対して割り当てることで、負荷を分散したり障害回避のために使用する。

何らかの理由でマルチポートを定義したい場合、`smb.conf`ファイルの `で外部プログラムを指定し、そこで システムのポート一覧を作成することが出来る。`

# Imprints Toolset

ImprintsツールセットはUNIX環境でWinodwsNTのプリンタ追加ウイザード機能を提供する。 詳細な情報は、Imprints web site http://imprints.sourceforge.net/にあるドキュメントと、ソースを参照して欲しい。 このセクションでは、Imprintsの機能の概要だけを解説する。

## Imprintsとは

Imprintsは以下の機能をサポートするためのツール集である。

- Windows NTと95/98プリンタドライバーパッケージの中央集積所機能を提供する。

- Imprintsプリンタドライバーパッケージを作成するために必要なツール郡を提供する。

- リモートにあるSambaやWindows NT4プリンタサーバー上にある プリンタドライバーを取得し、インストールする機能を提供する。

## プリンタドライバーパッケージの作成

プリンタドライバーパッケージを作成する手順はこのドキュメントの範囲を超えている。 ( これ以上の情報は、Samba付属のImprints.txtを参照のこと) 簡単に解説すると、Imprintersドライバーパッケージはgzippedされたtarballで、中には ドライバーファイルとINFファイル、そしてクライアントにインストールする際に必要に なるコントロールファイルが含まれている。

## Imprintsサーバー

Imprintsサーバーは実際にはデータベースサーバーで、標準的なHTTPメカニズムを利用して 問い合わせを受け取るようになっている。 データベース上のそれぞれのプリンタエントリーは実際にダウンロードするパッケージに対応したURLを持っている。 それぞれのパッケージはGnuPGを使ったデジタル署名がされており、ダウンロードされたパッケージが Imprintsデータベースからのものかを比較することが出来るようになっている。 このセキュリティーチェックを無効にすることは薦められない

## クライアントのインストール

Imprintsのクライアントでのインストールに関するより詳しい情報は `Imprints-Client-HOWTO.ps`を参照のこと。 このファイルはimprintsのソースパッケージに含まれている。

Imprints をクライアントにインストールする際の2つの方法

- Perlスクリプトで書かれたコマンドライン

- GTK+ベースのGUI経由でperlスクリプトを呼び出す

これらをクライアントにインストールすると(いずれの方法でも)、Imprintsデータペースサーバーに 既知のプリンタモデル名を問い合わせし、リモートにあるSambaやWindows NTプリントサーバー上にある ドライバーをダウンロードし、インストールすることが出来る。

基本的なインストール手順は、4つの段階に分かれ、perlコードがsmbclientと rpcclientをラップしている。

    foreach (supported architecture for a given driver)
    {
    	 1.  rpcclient: Get the appropriate upload directory
    		 on the remote server
    	 2.  smbclient: Upload the driver files
    	 3.  rpcclient: Issues an AddPrinterDriver() MS-RPC
    }

    4.	rpcclient: Issue an AddPrinterEx() MS-RPC to actually
    	create the printer

Imprintsツールを実装していく上で出くわした問題の一つに、いろいろなクライアントアーキテクチャ 間でのネームスベースの提供の仕方がある。 例をあげると、Windows NTはあるドライバーの名前を"Apple LaserWriter II NTX v51.8"としているが、 Windows 95ではこのドライバーを"AppleLaserWriter II NTX"としている。

この問題は、特定のプリンタに対して、どのクライアント用ドライバーをアップロードすかを どうやって知るかという点である。聡明な読者ならWindows NTプリンタプロパティーダイアログでは 一つのプリンタドライバー名しか指定できないことをご存知のはずだ。 単純にWindows NT4.0のシステムレジストリ上の

`HKLM\System\CurrentControlSet\Control\Print\Environment`

がWindows NTで常に使用するNTドライバーの名称を示してくれる。Windows NTがNTバージョンの プリンタドライバーを問い合わせをする場合に限ってはこれで問題は解決する。 しかしSambaは内部的にこの問い合わせ方法をもっていない。それゆえに、NTドライバーがすでに インストールされていない場合、ドライバー名をどうやって解決するかが問題になる。

この制約事項を回避するために、IntelWindows NTと95/98ドライバーを持っている Imprintsプリンタドライバーパッケージは、まずNTドライバーを最初にインストールする必要がある。

# Samba 2.0.x から 2.2.xへの移行

プリンタドライバーの管理方法が2.2以降、変更された(改善されたことを望んでいる)その為、 以下のようにして現状の設定から2.2への移行パスが設けられた。

Windowsクライアントはしばらくの時間従来接続されていたプリンタサーバーの設定を記憶しつづける傾向がある。 例をあげると、Windows NTクライアントがSamba2.0サーバーに接続されているとき、クライアントは 「LanManで稼動しているプリンタサーバー」として記憶している。Sambaホストを2.2にアップデートして MS-RPCプリントをサポートしたとしても、NTクライアントは古いままの(LanManプリントサーバー)設定を記憶している。

NTクライアントを"amnesia"(記憶喪失)にするためには(新しいMS-RPCプリント機能をSambaで使用したいと思ったときは 、プリントサーバーに対応づけられたレジストリキーの内容 `[HKLM\SYSTEM\CurrentControlSet\Control\Print]`を削除する必要がある。 クライアント上のスプーラーサービスはこの間停止する必要がある。

`C:\WINNT\ >` `net stop spooler`

レジストリ操作に関する通常言われる注意を払うこと。 注意して、何をしているかを十分把握すること。

前述したレジストリエントリの削除が完了したら、先ほどのコマンド例のstopコマンドを startコマンドに置き換えて実行し、スプーラーサービスを再起動すること。

Windows9xクライアントは依然Samba2.2サーバーに対してLanManプリントコールを使用しているので、 NT以外のクライアントはこのような変更をする必要がない。

Achtung!

以下のsmb.confバラメーターは熟慮の結果、利用価値が下がっていると判断されている。近い将来 廃棄されることになると思われる。新規のインストールではこれらのバラメータを使用しないこと。

- `printer driver file (G)`

- `printer driver (S)`

- `printer driver location (S)`

移行作業を行なう上での考えられるシナリオを示す

- Windows NTで新たに加わったプリントドライバーをサポートする必要がなければ、何もする必要はない。 現状あるパラメータが従来どおり働く

- NTプリンタドライバーの拡張された機能を利用したいと考え、9xドライバーを 新しい環境に移行する必要がないのなら、printers.defファイルの使用を中止する。こうすると、smbdがTDBの中に存在するプリンタの 9xドライバーの位置を問い合わせてきて、printers.def(や関連するパラメータ)を使うことに失敗する。 make_printerdefツールが過去との 互換性を保つために残されているが、"this tool is the old way of doing it"と何度も表示されるだろう。

- Windows9xドライバーをSambaホスト(TDBで印刷する)にインストールしたいのなら、この情報が優先され、 3つの印刷に関する古いパラメータは無視されることになる。(including print driver location).

- もし既存の `printers.def`ファイルを新しい環境に移行したいと思うのなら 現状の唯一の解決策は、Windows NTのAPWを使いNTのドライバーと9xのドライバーをインストールすることになる。 この方法は、smbclient and rpcclientでスクリプト化できる。 Imprintsのインストールの詳細はhttp://imprints.sourceforge.net/ に例がある。