Chapter 21. 旧式の印刷サポート
Prev | Part III. 詳細な設定方法 | Next

## Chapter 21. 旧式の印刷サポート

### Kurt Pfeifle

Danka Deutschland GmbH

`<kpfeifle@danka.de>`

### Gerald (Jerry) Carter

Samba Team

`<jerry@samba.org>`

### John H. Terpstra

Samba Team

`<jht@samba.org>`

May 31, 2003

## 機能と利便性

印刷はユーザに取ってしばしばミッションクリティカルなサービスである。Sambaは、Windows ワークステーションからなるクライアントネットワークのために、信頼性があり、シームレスなこのサービスを提供出来る。

Samba印刷サービスは、ファイルサービス機能と並列に、あるいは専用のサーバ上で、スタンドアロンかドメインメンバサーバで動かす事が出来る。これは、必要に応じて強力に、あるいは比較的穏やかにセキュアにすることが出来る。設定は簡単になることも複雑になることもある。有効な認証スキームは、以前の章にあるようなファイルサービス用に説明されたのと基本的に同じである。全体的に、現在、Sambaの印刷サポートは、多くの場合、付加機能を付けた上で、Windows NTまたはWindows2000印刷サーバと完全に対等で、置き換えることが出来る。クライアントはクライアント上でなじみのある`ポイント アンド プリント`メカニズムを通して、ドライバをダウンロードし、プリンタをインストールできる。`ログオンスクリプト`で実行されるプリンタのインストールは何の問題もない。管理者はおなじみの`プリンタ追加ウィザード`を使ってクライアントで使うことによって、ドライバのアップロードと管理ができる。更に追加の便利な機能としては、ドライバとプリンタ管理はコマンド行かスクリプトを通して実行でき、これは、大量のプリンタがある場合により効率的である。もしも、集中した印刷ジョブの利用状況管理(訳注:原文はaccount)(すべての単一ページの追跡といろいろな統計レポートに生データを供給すること)が必要とされる場合、この機能は、Sambaサーバ下の印刷サブシステムとして、新しい共通UNIX印刷システム(CUPS)によって最もよくサポートされている。

この章では、より現代的なUNIXのBSDとSystem V形式の印刷システムによって実装された、Sambaの印刷機能の基礎を概観する。この章中の情報の大多数はCUPSにも適用出来る。もしもCUPSを使っているならば、次の章に飛んでも良いが、すべきことのうち少なくともいくつかはきっと取りこぼすだろう。さらなる情報は、CUPS 印刷環境を参照のこと。

### Note

ほとんどの以下の例はWindows XP Professionalクライアントで評価されている。この文書でコマンドを発行した結果を記述しているところは、Windows 200x/XPクライアントでほとんど同じだが詳細では多少違っている事を心に留めておくこと。Windows NT4は更に多少異なる。

## 技術的な序論

Sambaの印刷サポートは、常時それが動作しているUNIX OS上の、インストールされている印刷サブシステム上に依存している。Sambaは`仲介者`である。Windows(か他のSMB)クライアントから印刷ファイルを受け取り、それをさらなる処理のために実際の印刷システムに渡す。そのため、両方に接続する必要がある。すなわち、Windows印刷クライアントとUNIX印刷システムである。それゆえ、異なった機能と異なった形でアクセスされる、種々のUNIX印刷サブシステムと同様、おのおのが異なって振る舞う種々のクライアントOSの間での違いを認める必要がある。

この章では伝統的なUNIX印刷方式について取り扱う。次の章では、より最新のCUPSについて、より詳しく説明する。

### Important

CUPSユーザに注意:次の章まで飛ばないこと。ここのみで説明がある重要な情報を読み飛ばすことになる!

現在、Samba管理の側面において、最も問題があることの一つは印刷の設定であることは、Sambaメーリングリスト上で投稿されたことでも明らかである。多くの新しいSamba管理者は、Sambaがある種の印刷処理を実行しているというような印象を持っている。保証するが、Sambaは何らの印刷処理をも実行しない。何らの印刷フィルタリングも行わない。

Sambaは、ローカルスプール領域にスプールされる、クライアントからデータストリーム(印刷ジョブ)を受け取る。印刷ジョブ全部を受け取ると、SambaはローカルのUNIX/Linux印刷コマンドを起動し、それに対してスプールされたファイルを渡す。それはローカルの印刷サブシステムを起動し、正しく印刷ジョブを処理し、プリンタに対してデータを渡す。

### クライアントからSambaへの印刷ジョブの処理

Sambaサーバ経由でWindowsクライアントからUNIXプリンタへの印刷がうまくいくためには、6つ(潜在的には7つ)のステージがある:

1. プリンタ共有に対してWindowsがコネクションをオープンする。

2. Sambaはユーザを認証しなければならない。

3. Windowsがネットワーク経由でSambaのスプール領域に印刷ファイルの コピーを送る。

4. Windowsはコネクションをクローズする。

5. Sambaは、UNIX印刷サブシステムの印刷領域経由でファイルを扱う ために印刷コマンドを起動する。

6. UNIX印刷サブシステムが印刷ジョブを処理する。

7. 印刷ファイルはSambaスプール領域から明示的に削除される必要がある。 これの要素は使用しているマシンのプリントスプーラの構成の設定に依存する。

### 印刷に関連する設定パラメータ

Sambaの印刷動作を制御するための設定パラメータは多数ある。それらの概要については`smb.conf`のマニュアルページを参照してほしい。他のパラメータと同様、グローバルレベル(一覧上でGとタグが付いているもの)とサービスレベル(S)パラメータがある。

グローバルパラメータ

  これらは明示的に共有定義に記述しなくても良い。 もしもエラーになったならば、(もしも動作させたならば)`testparm` ユーティリティでそれを見つけることが出来、そのことを表示する。

サービスレベルパラメータ

  これらは`smb.conf`中の`[global]` セクションで指定しても良い。この場合、個人毎すべてかサービスレベルの 共有の既定値の動作を定義する(同じパラメータに対して異なった設定の定義を を持たない形で提供されるので、グローバルの既定値を上書きする)。

## 簡単な印刷設定

BSD印刷環境での簡単な設定は、簡単な印刷の設定を示している。もしも現在使っている環境と比較して、OSベンダによってあらかじめ設定されている追加のパラメータを見つけるかもしれない。以下は、パラメータについての議論と説明である。この例は多くのパラメータを使っていない。しかし、多くの環境において、すべてのクライアントに対して印刷を有効にする有効な`smb.conf`ファイルを提供するためには、これは十分である。

Example 21.1. BSD印刷環境での簡単な設定

`[global]`
`printing = bsd`
`load printers = yes`
`[printers]`
`path = /var/spool/samba`
`printable = yes`
`public = yes`
`writable = no`

これは単に例としての設定である。Sambaはすべての設定パラメータに対して既定値を割り当てている。既定値は保守的でかつ賢明な値となっている。パラメータが`smb.conf`ファイル中で指定されたならば、それは既定値を上書きする。rootで`testparm`ユーティリティを実行すると、`smb.conf`ファイルの設定のように両方の既定値とすべての設定を報告する機能がある。`Testparm`は間違った設定のすべてに対して警告を表示する。完全な出力は360行を軽く超えるので、その結果をページャプログラムに渡しても良いだろう。

設定ファイルの文法は理解するのが簡単である。その文法について細かいことを知らなくてもよい。この文書のどこかで説明されているが、Sambaはある種の綴りミスには寛容であり(たとえば、browsableの代わりにbrowseableなど)、綴りは大文字小文字を無視する。論理値に対して、`Yes/No`か`True/False`を使うことも出来る。名前のリストは、カンマ、空白かタブで分離できる。

### `testparm`による設定の検査

暗黙で使えるものを含む、Samba中で印刷に関連したすべての(あるいはほとんど全部)を見るためには、以下で概要を説明しているコマンドを使う。このコマンドは`testparm`の出力中に現れるすべての`lp`、`print`、`spool`、`driver`,`ports`と`[`を検出する。これは、動作している`smbd`の印刷設定の簡便な概要を提供する。このコマンドは個別に作成されたプリンタ共有かそれが使えるスプールパスを表示しない。上記の例で示される設定で設定したSambaの出力は以下のようになる:

    root# testparm -s -v | egrep "(lp|print|spool|driver|ports|\[)" Load smb config files from /etc/samba/smb.conf Processing section "[homes]" Processing section "[printers]"  [global]        smb ports = 139 445        lpq cache time = 10        load printers = Yes        printcap name = /etc/printcap        disable spoolss = No        enumports command =        addprinter command =         deleteprinter command =         show add printer wizard = Yes        os2 driver map =        printer admin =        min print space = 0        max print jobs = 1000        printable = No        printing = bsd        print command = lpr -r -P'%p' %s        lpq command = lpq -P'%p'        lprm command = lprm -P'%p' %j        lppause command =        lpresume command =        printer name =        use client driver = No [homes] [printers]        path = /var/spool/samba        printable = Yes

Sambaの既定値の動作によって暗黙で追加される設定を検査するのは簡単である。確認:Sambaの将来の関係で重要かもしれない。

### Note

Samba-3中の`testparm`は2.2.xのものとは動作が異なる。“-v”スイッチなしで使うと、実際に書かれた設定のみを表示する。使用している完全な設定を見るためにはtestparmに“-v”オプションを追加する。

### 手っ取り早い設定の検証

どのようなステージでもトラブルシュートをする必要があるので、常時、最初にこの点に戻り、`testparm`が期待しているパラメータを表示するかを検査する。個人的な経験から忠告すると、load printersパラメータをコメントアウトすることを試すこと。もしも2.2.xシステムの動作が、私の環境のようであれば、以下のような表示が出る:

    root# grep "load printers" /etc/samba/smb.conf        #  load printers = Yes        # This setting is commented out!! root# testparm -v /etc/samba/smb.conf | egrep "(load printers)"        load printers = Yes

この設定をコメントアウトするとSambaが自分のプリンタを公開させなくすると仮定したが、実際には引き続き公開している。理由を理解するのには時間がかかった。少なくともこれによって、もはや馬鹿にされることはない。

    root# grep -A1 "load printers" /etc/samba/smb.conf        load printers = No        # The above setting is what I want!        #  load printers = Yes        # This setting is commented out!root# testparm -s -v smb.conf.simpleprinting | egrep "(load printers)"        load printers = No

パラメータを明示的にload printers = Noに設定する時にのみ、Sambaは意向にかなう。そのため、以下を強く推奨する:

- コメントアウトしたパラメータには決して頼らない。

- 常時、そう動作させたいと意図するものについては、明示的に パラメータを設定する。

- 意向を反映しないかもしれない隠れた設定を、見える化するために `testparm`を使う。

以下は最小の設定ファイルである:

    root# cat /etc/samba/smb.conf-minimal        [printers]

この例は、任意のSamba構成ファイルをテストするために、`testparm`を使って表示すべきである。実際、現在動いているシステム(正確に何をやっているか知っている限り)を変更しないことを勧める。smbd再起動後にのみ変更の影響が反映されるという仮定に頼ってはいけない!これは本当ではない。Sambaは60秒ごととクライアントからの接続時に再読込を行う。適用する事を意図しない製品のクライアントのために､変更に直面しなければならないかもしれない。そのほか、いくつかの興味深いことに注意するとよい。`testparm`は、この最低限の構成を使う時にSambaの印刷設定がどうあるかを識別するために便利である。以下では、見つけようと思っているものがある:

    root# testparm -v smb.conf-minimal | egrep "(print|lpq|spool|driver|ports|[)" Processing section "[printers]" WARNING: [printers] service MUST be printable! No path in service printers - using /tmp        lpq cache time = 10        load printers = Yes        printcap name = /etc/printcap        disable spoolss = No        enumports command =        addprinter command =        deleteprinter command =        show add printer wizard = Yes        os2 driver map =        printer admin =        min print space = 0        max print jobs = 1000        printable = No        printing = bsd        print command = lpr -r -P%p %s        lpq command = lpq -P%p        printer name =        use client driver = No [printers]        printable = Yes

`testparm`は2つの警告を表示する:

- `[printers]`セクションが印刷可能と指定していない。

- どのスプールディレクトリを使うかをSambaに指定していない。

しかし、これは致命的ではなく、Sambaは動作するように既定値を設定する。が、この例を頼らず、使わないでほしい。これは、自分が何を要求しているかを正確にわかっている設定と注意深い設計を手助けするために用意された。使用しているシステムからの結果は、異なったコンパイル時オプションによって構築されたSambaで、いくつかのパラメータによっていろいろと変わる。警告:有効な行の行末にコメントサインを置いてはいけない。この場合、パラメータは無視される(行頭にコメントサインを置いたのと同じになる)。最初にこれは使用しているSambaのバージョンのバグではないかと思った。しかし、マニュアルページには明確に`パラメータ値の内部の空白は、正確にその通りに保持される`と書いてある。これは、たとえば以下のような行があると

# これはLPRngを印刷システムとして定義する。
`printing = lprng`

定義したい値として`=`記号の後の文字列すべてを尊重する。これは、不正な値なので無視され、この場所では既定値が使われる。

## 拡張印刷設定

拡張BSD印刷環境の設定は、BSD形式の印刷設定中の印刷に関連した設定のためのより詳細な設定を表示する。下記は、いろいろなパラメータの議論と説明である。昔からのUNIX/Linuxマシン上で最も一般的に使われているので、BSD形式の印刷環境を使う事をした。主に新しいシステムでは、別の章で議論されているCUPSを使うだろう。例は、既定値で設定されていないという理由で、指定するのが不要なたくさんのパラメータを明示的にリストアップする。よりスリムな`smb.conf`を使うことも、`testparm`を使う事も、既定値に設定されているすべてのパラメータを`smb.conf`から削除して最適化するために、`SWAT`を使う事もできる。

Example 21.2. 拡張BSD印刷環境設定

`[global]`
`printing = bsd`
`load printers = yes`
`show add printer wizard = yes`
`printcap name = /etc/printcap`
`printer admin = @ntadmin, root`
`max print jobs = 100`
`lpq cache time = 20`
`use client driver = no`
`[printers]`
`comment = All Printers`
`printable = yes`
`path = /var/spool/samba`
`browseable = no`
`guest ok = yes`
`public = yes`
`read only = yes`
`writable = no`
`[my_printer_name]`
`comment = Printer with Restricted Access`
`path = /var/spool/samba_my_printer`
`printer admin = kurt`
`browseable = yes`
`printable = yes`
`writable = no`
`hosts allow = 0.0.0.0`
`hosts deny = turbo_xp, 10.160.50.23, 10.160.51.60`
`guest ok = no`

これは設定の例である。OSベンダによって提供されている設定ファイル中でのすべての設定はここにはない。明示的に設定されていないSamba設定パラメータは、既定値で賢明な値に設定されている。すべての設定を見るには、`root`になり、`testparm`ユーティリティを使う。`testparm`は設定の間違いを指摘する。

### 設定の説明詳細

以下は拡張BSD印刷環境の設定についての議論である。

#### [global]セクション

`[global]`セクションは4つの特別なセクションの1つであり(残りは`[homes]`, `[printers]`と `[print$]`)、これらはサーバ全体に適用されるすべてのパラメータを含んでいる。ここにはグローバルな意味を持つパラメータのみが配置される。すべての他のセクションと共有に対しての既定値の設定を定義する、サービスレベルのパラメータを含むこともできる。この方法は設定を簡単化し、同じ値を繰り返し設定することを防ぐ(設定できる個別のセクションか共有内で行えるが、グローバルに設定した共有の設定と他の値の指定を上書きする)。

printing = bsd

  BSD(RFC 1179形式かLPR/LPD)として知られてもいる)BSDのために適用出来る Sambaが使う既定値の印刷コマンドを指定する。一般的に、 `printing`パラメータは、仮定している印刷サブシステム をSambaに告げる。SambaはCUPS, LPD, LPRNG, SYSV, HPUX, AIX, QNXと PLPを サポートしている。各システムは異なったprint command (と他のキュー制御コマンド)を既定値としている。

  ### Caution

  printingパラメータは通常サービスレベルの パラメータである。`[global]`セクション中のここに 含まれた後、異なった設定をしていないすべてのプリンタ共有に効果が及ぶ。 Samba-3はもはやSOFTQ印刷サービスをサポートしない。

load printers = yes

  Sambaにすべての有効なプリンタ共有を自動的に作成させる。有効なプリンタ 共有はprintcapファイルをスキャンすることで調べる。作成されたすべての プリンタ共有はブラウジングでも表示される。もしもこのパラメータを使う 場合、各プリンタ毎に分割する必要はない。自動的に作成されたプリンタ 共有のおのおのは、`[printers]`セクション中に ある設定オプションの設定の複製である (`load printers = no`の設定は、 誰でも見えて使えるようにしたくないいくつかのものをする(leaving out)、 各UNIXプリンタを指定できるようにする)。

show add printer wizard = yes

  設定は通常既定値によって有効になっている(たとえパラメータが`smb.conf` 中で指定されていなくても)。これは、Sambaホストの共有リストの中での プリンタフォルダ中に プリンタ追加ウィザードが出る原因である( ネットワークコンピュータか `net view`コマンドで見られる)。これを無効にするには、 明示的に`no`と設定する必要がある(コメントアウトは 十分ではない)。`プリンタ追加ウィザード`は `[print$]`共有にプリンタドライバをアップロード させ、それをプリンタに関連づけるか(もしもそれぞれのキューが動作の前に 存在するならば)、以前にアップロードされたドライバとプリンタドライバを 交換する)。

max print jobs = 100

  ある時間にSambaサーバ上で有効な印刷ジョブを最大100までに設定する。この数よりも 大きなジョブをクライアントが投稿すると、"サーバ上に容量がありません"という エラーメッセージがSambaサーバからクライアントに返す。ゼロという設定(既定値) は全く制限がない事を意味する。

printcap name = /etc/printcap

  Sambaに有効なプリンタ名ののリストがどこにあるかを告げる。CUPSを使って いる場合、printcapファイルが書かれているかを確認する。これは `cupsd.conf`ファイル中の`Printcap` ディレクティブによって制御される。

printer admin = @ntadmin

  ntadminグループメンバはドライバを追加するためとプリンタプロパティを設定することが 出来るようにすべきである(`ntadmin`は単なる例としての名前で ある。有効なUNIXグループ名が必要である)。rootは暗黙的にいつでも printer adminである。グループ名の前に付く `@`記号は`/etc/group`中の名前である。 printer adminは、MS-RPC (Samba-2.2からの印刷環境開発を参照) によって提供されるリモート管理インタフェース経由でプリンタのすべてを操作出来る。 より大きなシステムでは、printer adminパラメータは 通常共有単位に存在するパラメータである。こうすると、各プリンタ共有の管理者に 異なったグループを割り当てる事ができる。

lpq cache time = 20

  lpqコマンドの結果のキャッシュ時間を制御する。これは、過度にlpqコマンドが 呼ばれる事を防ぎ、高負荷のプリントサーバの負荷を減少させる。

use client driver = no

  もしも`yes`に設定されると、Windows NT/200x/XPクライアント のみに(Windows 95/98/MEには関係ない)影響する。このパラメータの既定値は `No`で(あるいは`False`)である。 これは、Sambaサーバ上で有効なドライバがインストールされているプリント共有 では(`yes`か`true`を設定して) 決して有効にしてはならない。より詳細な説明は、 `smb.conf`マニュアルページを参照のこと。

#### [printers]セクション

printersセクションは2つめの特別なセクションである。もしもこの名前のセクションが`smb.conf`中に現れると、Samba起動時に、printcapファイル中で見つかるすべてのプリンタ名に対してプリンタ共有を作成するので、ユーザはSambaホスト上のprintcapファイル中で定義されている任意のプリンタに接続できる。このセクションを最低の設定ですべてのプリンタを共有するための、便利なショートカットとして見なすことができる。これはまた、すべてのプリンタに対する既定値として適用すべき設定のためのコンテナでもある(より詳細は、`smb.conf`マニュアルページを参照)。この内側にあるコンテナの設定は共有レベルパラメータでなければならない。

comment = All printers

  commentは、クライアントが ネットワークコンピュータか`net view` コマンド経由でサーバに問い合わせた時、有効な共有一覧を表示する時に、 共有のそばに表示される。

printable = yes

  `[printers]`サービスはprintableとして 定義されねばならない。もしもそれ以外を指定すると、 smbdは起動時にロードを停止する。このパラメータは、このサービスに対して pathパラメータで指定したディレクトリ中に、 オープン、書き込みとスプールファイルの投稿を、接続したクライアントに 許可する。これは、ファイル共有とプリンタ共有とを区別するために、 Sambaによって使われる。

path = /var/spool/samba

  入力された印刷ファイルをSambaによってスプールするためのディレクトリを 指定しなければならない。UNIX印刷サブシステムの設定中で指定された スプールディレクトリと同じに設定してはならない!パスは通常 stickyビットを設定した、その他に書き込み可能な ディレクトリを指定する。

browseable = no

  printable = yesのときは常時 `no`に設定する。これは、共有それ自身が、 `net view`コマンドか、エクスプローラのブラウズリスト 中で有効な共有の一覧中で不可視にする(もちろん個々のプリンタを見る ことは出来る)。

guest ok = yes

  もしも、このプリンタが`yes`に設定されているならば、 印刷サービスに接続する時にパスワードを必要としない。アクセスは、 guest accountの権限で許可される。多くのシステム では、ゲストアカウントは"nobody"という名前にマップされる。このユーザは 通常空白のパスワード尾持つUNIXのpasswdファイルにあるが、UNIXログインは 無効である。いくつかのシステムでは、ゲストアカウントユーザは印刷権限を 持たないかもしれない。`su - guest`を使い、以下の システムの印刷コマンドを動かし、使用するシステムのguestユーザ中で ロギングすることでこれをテストする:

  `lpr -P printername /etc/motd`

public = yes

  guest ok = yesの同義語である。 guest ok = yesを設定すると、 これは本当にここにある必要はない(これは “同じ共有に対して2つの矛盾している設定が偶然あるときはどうなるか?” という興味深い質問を導く。答えはSambaが最後に見つけたものが使われる。 `testparm`は同じ共有に対して同じパラメータに対する 異なった設定に対しては注意を喚起しない。異なったユーザ名で `guest account`パラメータに対して複数の行を 設定することでこれをテストでき、次にtestparmを動作させて、どの行が Sambaによって本当に使われるかを見る事ができる)。

read only = yes

  通常(共有の他のタイプのために)サービスのディレクトリ中で、ユーザによる ファイルの作成と変更を防止する。しかし、printable サービス中では、常時ディレクトリへの書き込みが許可 されるが(もしもユーザの権限として接続が許可されているならば)、 それは印刷スプール操作経由でのみである。通常の書き込み操作は許可 されない。

writable = no

  これはread only = yesの同義語である。

#### 任意の[my_printer_name]セクション

もしも、`[my_printer_name]`セクションが、printable = yesを含んで`smb.conf`ファイル中にある場合、Sambaはこれをプリンタ共有と見なして設定する。Windows 9x/Meクライアントは、共有名が8文字以上の場合、接続かプリンタドライバのロードで問題が発生するかもしれない。存在するユーザかファイル共有の名前と競合する、プリンタ共有名を付けてはならない。クライアントからの接続時に、Sambaは常時その名前を最初に持つものを見つけようとする。もしもそれが見つかると、これに対して接続を行い、同じ名前を持つプリンタ共有には接続できない!

comment = Printer with Restricted Access

  上記で書いたとおりのコメントである。

path = /var/spool/samba_my_printer

  このプリンタに対するスプール領域のディレクトリを既定値の代わりに設定する。 これは異なって設定する必要はないが、オプションは有効である。

printer admin = kurt

  printer admin定義は、この一般的な`[printers]`共有から 明示的に定義されたプリンタ共有と違う。もし要求がなければ、可能であればそれを 表示しない。

browseable = yes

  これは、クライアントが、ネットワークコンピュータで ブラウズするのが便利なように、プリンタをブラウズ可能にする。

printable = yes

  20.4.1.2節を参照。

writable = no

  20.4.1.2節を参照。

hosts allow = 10.160.50.,10.160.51.

  hosts allowとhosts deny パラメータを使って特定の数値でのアクセス制御を試す。これは、決して安全な 賭けではない。これは使用しているプリンタをセキュアにする方法ではない。この 行は、最初に評価されるアクセス制御中での特定のサブネットからの、すべての クライアントを許可する。

hosts deny = turbo_xp,10.160.50.23,10.160.51.60

  すべての一覧表示されたホストはここでは許可されない(たとえ許可された サブネットにあったとしても)。見ての通り、NetBIOSホスト名をここに書くのと 同様にIPアドレス名前を付けることが出来る。

guest ok = no

  このプリンタはゲストアカウントには公開していない。

#### 印刷コマンド

各セクション(か`[printers]`セクション中で)はプリンタを定義し、`print command`は定義されるかもしれない。これは、そのプリンタに対するSambaの印刷スプールディレクトリ中に位置するファイルを処理するコマンドを設定する。(もしも覚えているならば、このスプールディレクトリはpathパラメータで設定される)。通常、このコマンドはSambaが動いているホストの印刷サブシステムに、適切なシステムの印刷コマンドを使ってスプールファイルを渡す。しかし、もしもこの必要性に要求がなければ、たぶんそうだろう。デバッグかその他の理由で、ファイルの印刷より何かが完全に異なることを行う事を望んでも良い。例は、プリンティングをデバッグするために必要とする時、さらなる調査のために一時的な場所に印刷ファイルをコピーするだけのコマンドである。もしも、固有の印刷コマンドを作る場合(か印刷コマンドシェルスクリプトの開発)、Sambaスプールディレクトリからファイルを削除する必要があることに注意をはらうこと。そうしないと、すぐにディスクがいっぱいになってしまうだろう。

#### 既定値のUNIXシステム印刷コマンド

設定ファイル中で明示的に設定されていない場合、Sambaがほとんどの場合、多くのパラメータについて、内蔵の値を使うということは、以前の説明で理解されているかと思う。print commandでも同じである。既定値の印刷コマンドはprintingパラメータの設定に依存して変わる。既定値の印刷設定に一覧があるコマンド中で、Xがp,s,Jのようなものである、%X形式を持ついくつかのパラメータに気がつくだろう。これらの文字は、それぞれプリンタの名前、スプールファイルとジョブIDを表す。これらは、キーとなる印刷オプションの概要を提供する既定値の印刷設定中に詳細が説明されているが、CUPSの場合は特別で、CUPS印刷サポートで説明があるので、ここに記述はない。

Table 21.1. 既定値の印刷設定

設定 | 既定値の印刷コマンド
--- | ---
printing = bsd|aix|lprng|plp | 印刷コマンドは`lpr -r -P%p %s`
printing = sysv|hpux | 印刷コマンドは`lp -c -P%p %s; rm %s`
printing = qnx | 印刷コマンドは`lp -r -P%p -s %s`
printing = bsd|aix|lprng|plp | lpq コマンドは`lpq -P%p`
printing = sysv|hpux | lpq コマンドは`lpstat -o%p`
printing = qnx | lpq コマンドは`lpq -P%p`
printing = bsd|aix|lprng|plp | lprm コマンドは`lprm -P%p %j`
printing = sysv|hpux | lprm コマンドは`cancel %p-%j`
printing = qnx | lprm コマンドは`cancel %p-%j`
printing = bsd|aix|lprng|plp | lppause コマンドは`lp -i %p-%j -H hold`
printing = sysv|hpux | lppause コマンド(...は存在しない)
printing = qnx | lppause コマンド(...は存在しない)
printing = bsd|aix|lprng|plp | lpresume コマンドは`lp -i %p-%j -H resume`
printing = sysv|hpux | lpresume コマンド(...は存在しない)
printing = qnx | lpresume コマンド(...は存在しない)

`printing = CUPS`用に、もしもSambaがlibcupsを使うようにコンパイルされたならば、ジョブの投稿にCUPS APIを使用する(通常使わない位置に自動生成されたprintcap ファイルに書き込むために、使用しているシステム中の`cupsd.conf`ファイルが設定されている場合、printcap = cupsを設定するのはよい方法である)。ほかの場合は、Sambaは印刷処理のために、-orawオプションを付けて、System Vの印刷コマンドにマップする。これはすなわち、`lp -c -d%p -oraw; rm %s`を使うことである。`printing = cups`の場合と、もしもSambaがlibcupsを使うようにコンパイルされた場合、手動で設定したprint commandは何であっても無視される!

#### カスタム印刷コマンド

サービスに対して印刷ジョブのスプーリングが終了後、print commandはスプールファイルを処理するためにsystem()呼び出し経由でSambaによって使われる。通常指定されたコマンドはホストの印刷サブシステムにスプールファイルを投稿する。しかし、これが本当にそうであるというべき要求は全くない。印刷サブシステムはそれ固有のスプールファイルを削除しないかもしれないので、指定したコマンドは何であっても、それが処理された後にスプールファイルは消去されるようにすべきである。

伝統的な印刷システムに対して作成した固有の印刷コマンドを使うことについては何ら違いはない。しかし、固有のものを動かしたくないのであれば(訳注:to roll your own)、各印刷サブシステムに対してSambaが使う既定値の内蔵コマンドについて熟知すべきである(既定値の印刷設定を参照)。最後のパラグラフに一覧表示されているすべてのコマンドには%Xという形式のパラメータがある。これらはマクロかショートカットで、真のオブジェクトの名前のためのプレースフォルダとして使われる。このようなプレースフォルダを使って、コマンドを動かしたとき、Sambaは自動的に適切な値に置き換える。印刷コマンドはすべてのSambaマクロ置換を扱える。印刷に関しては、以下の以下のものは特別に扱われる:

- `%s, %f` スプールファイル名へのパス。

- `%p` 適切なプリンタ名。

- `%J` クライアントから送られたジョブ名。

- `%c` (もしも分かるならば)スプールされたジョブのページ数。

- `%z` スプールされた印刷ジョブのサイズ(バイト単位)。

印刷コマンドは少なくとも`%s`か`%f`のどちらか1つを使っている必要がある。`%p`の使用は任意である。もしもプリンタ名が指定されないと、`%p`は印刷コマンドから何のメッセージもなしに取り去られる。この場合、ジョブは既定値のプリンタに送られる。

`[global]`セクション中で指定されると、指定されたprint commandは固有のprint commandを持たない任意の印刷サービスに対して使われる。もしも、印刷サービスのためのprint commandも、グローバルのprint commandも指定されない場合、スプールファイルは作成されるが処理されない!最も重要なことは、印刷ファイルは削除されず、そのため、ディスクスペースを消費してしまうと言うことである。

印刷は、nobodyアカウントを使うとき、ある種のUNIXでは失敗するかもしれない。もしもそのような事態に遭遇したら、代替のゲストアカウントを作成し、印刷権限を付与する。このゲストアカウントを、`[global]`セクション中に、`guest account`パラメータを使って設定する。

非常に複雑な印刷コマンドを構成することも出来る。印刷コマンドはUNIXシェルに渡されるようにする必要がある。シェルは通常のように指定されている環境変数を展開できる(UNIXの環境変数`$variable`を、Sambaの印刷コマンドの中で指定するための形式は`%$variable`である)。下記の動作するprint commandの例では、以下は印刷ジョブのログを`/tmp/print.log`に取り、ファイルを印刷し、次にそれを削除する。セミコロン(“;”)は通常通り、シェルスクリプト中でのコマンドの分離符号である:

`print command = echo Printing %s >> /tmp/print.log; lpr -P %p %s; rm %s`

動作させるシステム上で、通常どのようにファイルを印刷するかに例が依存することを考慮して、固有のコマンドを変更しなければならないかもしれない。既定値のprint commandパラメータは、printingの設定状態に依存して代わる。他の例は下記の通り:

`print command = /usr/local/samba/bin/myprintscript %p %s`

## Samba-2.2からの印刷環境

Samba-2.2.xより前は、Windowsクライアントへの印刷サーバサポートは、LanMan印刷機能に限定されていた。これは、Windows 9x/Me PCがプリンタを共有するときのものと同じプロトコルレベルである。2.2.0リリースの最初から、SambaはネイティブなWindows NTの印刷方式のサポートを開始した。これらはMS-RPC (Remote Procedure Call)経由で実装されている。MS-RPCはすべての印刷のために、SPOOLSSという名前付きパイプを使用する。

新しいSPOOLSSサポートによって提供される追加の機能は以下を含む:

- オンデマンドでWindows 95/98/NT/2000クライアントにプリンタドライバのダウンロードを サポートする(Point'n'Print)。

- Windows NTのAdd Printer Wizard (APW)か Imprintsツールセット経由で プリンタドライバをアップロードする。

- StartDocPrinter, EnumJobs()のような、ネイティブなMS-RPC印刷呼び出しをサポートする (Win32印刷APIについてのより詳細な情報は MSDN documentationを参照のこと)。

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

- スプールされたジョブ情報のための、内部データベースを使用することによる、プリンタ キュー操作のサポートの改善(種々の`*.tdb`ファイルによって 実装された)。

Samba-3へのアップデートによって便利になることは、そのプリンタをActive Directory(かLDAP)に公開できることである。

Microsoft Windows NTサーバとSambaでの操作の間には基本的な違いが存在する。Windows NTは共有しないローカルプリンタのインストールを許可する。これは任意のWindows NTマシン(サーバかクライアント)はユーザがワークステーションとして使えるという不自然な結果となる。Sambaは、既定値か、プリンタ固有の共有経由での特定の定義のどちらかで、有効にしたすべてのプリンタを公開する。

Windows NT/200x/XP Professionalクライアントは標準SMBプリンタ共有を使ってはならない。それらはMS-RPCを使って他のWindows NTホスト上の任意のプリンタに直接印刷が出来る。これは、もちろん、クライアントがプリンタリソースを提供しているリモートホスト上で必要な権限を持っていることを仮定している。プリンタに対してWindows NTによって割り当てられている既定値のパーミッションは、よく知られたEveryoneグループに印刷のパーミッションを与える(Windows 9x/Meタイプの古いクライアントは、共有されたプリンタへの印刷のみ出来る)。

### Sambaサーバ上でのポイントアンドプリントによるクライアントドライバ

このことが意味することについて多くの混乱がある。次のような疑問がしばしば質問される。“Windowsクライアントからの印刷をサポートするためにSambaホスト上にプリンタドライバをインストールすることは必要か否か?”答えは No で不必要である。

もちろん、Windows NT/2000クライアントではドライバをローカルに(次にSambaベースの印刷キューに繋ぎ)インストールするためにそれらのAPWも動かすこともできる。これはWindows 9x/Meクライアントによって使われるのと同じ手法である(しかし、Samba 2.2.0では、プリンタに対する有効なドライバをSambaサーバが処理することをWindows NT/2000クライアントが要求させる、というバグがある。これはSamba 2.2.1で修正されている)。

しかし、これはSambaサーバの`[print$]`共有中にプリンタドライバをインストールする新しい機能であり、これはとても便利である。次に、すべてのクライアント(95/98/MEを含む)はこのプリンタ共有に最初に接続した時にインストールされているドライバを入手する。この`[print$]`中へのドライバのアップロードまたは供託と、以下の存在するSambaプリンタ共有へ、このドライバを結びつけることは異なった手段で達成できる:

- NT/200x/XP Professionalクライアント上でAPWを動かす(これは95/98/MEクライアントでは動かない)。

- Imprintsツールセットを使う。

- smbclientとrpcclientコマンド行ツールを使う。

- cupsaddsmbを使う(CUPS印刷システムのみ動作し、LPR/LPD、LPRngなどでは動かない)。

Sambaはスプールされたファイルに対してどのような方法でも、これらのアップロードされたドライバを使わない。これらのドライバは、Sambaによってサポートされている“ポイントアンドプリント”メカニズム経由でダウンロード、インストールするクライアントによって完全に使われる。クライアントは、プリンタ(かUNIX印刷システム)が要求する形式に印刷ファイルを生成するためにこれらドライバを使う。Sambaが受け取る印刷ファイルは、必要に応じてすべてのさらなる処理のために責任のある、UNIX印刷システムに渡される。

### 無効になった [printer$]セクション

2.2より前のSambaのバージョンでは`[printer$]`という名前の 共有を使う事が出来た。この名前はWindows 9x/Meクライアントがそれによって共有される プリンタによって作成された、同じ、名前付きのサービスから取られている。 Windows 9x/Meプリンタサーバは、プリンタドライバのダウンロードをサポートするために、 ードオンリのアクセス(かつパスワードなし)のサービスを常時用意している。しかし、 Sambaの最初の実装では、`printer driver location`という名前の、 共有単位で使われるパラメータが使えた。これはそのプリンタに関連するドライバ ファイルの位置を指定した。`printer driver`という名前の他の ラメータは、クライアントに送られるプリンタドライバ名を定義する手段を提供した。

`printer driver file`を含むこれらのパラメータは、Samba-3 では取り除かれ、使う事は出来ない。共有名`[print$]`は ダウンロード可能なプリンタドライバの位置のために使われる。これは、Windows NT が動いているPCが、それによって共有されるプリンタによって作成された、 `[print$]`という共有名から取られている。Windows NTの 印刷サーバは、プリンタドライバのダウンロードとアップロードをサポートするために、 読み書きアクセス(そのACLのコンテキスト中で)を提供する、 `[print$]`というサービスを常時提供している。これは Windows 9x/Meクライアントがこの時点で捨てられるという事を意味するわけではない。 それらにはSambaの`[print$]`共有がきちんとサポートする ものを使える。

### [print$]共有の作成

プリンタドライバファイルのアップロード/ダウンロードをサポートするために、まずはじめに`[print$]`という名前のファイル共有を作成しなければならない。この共有の公開される名前は、Microsoft Windowsクライアント中で埋め込まれている。これは、プリンタドライバファイルを検索しようとした時に、正確にこの前のサービスを探すように、Windowsクライアントがプログラムされているため、改名することは出来ない。

グローバルパラメータを追加するためにサーバのファイルを変更し、`[print$]`ファイル共有を作成すべきである(もちろん、たとえばpathのようないくつかのパラメータの値は、サイトによって適切な値に置き換えるべきである)。[print\$] の例を参照。

Example 21.3. [print$] の例

`[global]`
# ドライバの追加と設定を可能にすべき、ntdomainグループのメンバ
# プリンタのプロパティ。rootは常時'printer admin'と仮定される。
`printer admin = @ntadmin`
# ...
`[printers]`
# ...
`[print$]`
`comment = プリンタドライバのダウンロード領域`
`path = /etc/samba/drivers`
`browseable = yes`
`guest ok = yes`
`read only = yes`
`write list = @ntadmin, root`

もちろん、pathパラメータによって名付けられたディレクトリが、UNIXファイルシステム上に存在するようにしておく必要もある。

### [print$]セクションのパラメータ

`[print$]`は`smb.conf`中で特別なセクションである。これは、潜在的なプリンタドライバダウンロードに関連する設定を含み、ローカルプリンタドライバのインストールのためにWindowsクライアントによって使われる。以下のパラメータはこの共有セクションでしばしば必要とされるものである:

comment = プリンタドライバダウンロード領域

  共有リスト中に一覧表示された時に、共有のそばにあるコメント(通常Windows クライアントはそれを見る事ができないが、 `smbclient -L sambaserver`の出力中にも表示される)。

path = /etc/samba/printers

  UNIXの観点からのWindowsドライバファイルの保存場所の位置のパス。

browseable = no

  ネットワークコンピュータでクライアントに `[print$]`共有を見せないようにさせる。 `cmd`シェルで以下を実行すると:

      C:\>  net use g:\\sambaserver\print$

  任意のクライアントから引き続き見る事ができる。これは、Windows エクスプローラからネットワークドライブの割り当て からでも行う事が出来る。

guest ok = yes

  すべてのゲストユーザにこの共有をリードオンリにする。クライアント上への ダウンロードとプリンタのドライバのインストールを行うためのアクセスは 許可される。`guest ok = yes`が必要かどうかは、 どのようにサイトが設定されているかに依存する。もしもユーザがSamba ホスト上のアカウントを持つことを許可されているならば、これは何の 問題もない。

  ### Note

  もし、Sambaサーバによって認証されることを、すべてのWindows NTユーザが 保証されているならば(たとえば、もしも、NTドメインサーバ経由でSambaが 認証するとき、ユーザはすでにWindows NTセッションのためにログオンするために ドメインコントローラによって認証されていた場合)、ゲストアクセスは 不要である。もちろん、ばかげたアカウントとセキュリティについて 心配せずに、ワークグループ環境で印刷を行いたいのであれば、ゲストアクセス のための共有を設定する。同じように、`[global]` セクション中で、 map to guest = Bad User を追加することを考えるべきである。これを使う前に、このパラメータが 行う事を理解しておくこと。

read only = yes

  誰でもがドライバファイルをアップロード(あるいはドライバの設定の変更)する ことは望まないので、この共有を書き込み不可にする。

write list = @ntadmin, root

  `[print$]`は以前の設定によってリードオンリになって いるので、`write list`も一緒に作成すべきである。UNIX グループは先頭に“@”が付いたものである。共有上にファイルの アップデートを必要とするこの一覧にあるユーザは、(一般的にパブリックな リードオンリアクセスの例外として)書き込みが許可される。 通常この設定中で管理者レベルのユーザのみ指名したいであろう。もしもこれが 非rootアカウントである場合、アカウントはグローバルの printer adminパラメータ中で言及されるべきである。 ファイル共有上の設定についてのより詳細な情報は、`smb.conf`マニュアル ページを参照のこと。

### [print$]共有ディレクトリ

Windows NT印刷サーバが、複数のクライアントアーキテクチャによってドライバのダウンロードが出来るようにするために、`[print$]`サービス内にいくつかのサブディレクトリを作成しなければならない(すなわち、pathパラメータによって指定されたUNIXのディレクトリ)。これらはサポートされる各クライアントアーキテクチャに一致する。Sambaは同様にこのモデルに追従する。`[print$]`共有それ自身の名前と同じように、サブディレクトリは下記に一覧表示された名前と正確に一致しなければならない(サポートする必要のないアーキテクチャのサブディレクトリはなくてもよい)。

すなわち、下記のように、`[print$]`共有配下に、サポートしたい各アーキテクチャのためのディレクトリを作成する。

    [print$]--+          |--W32X86           # serves drivers to Windows NT x86          |--WIN40            # serves drivers to Windows 95/98          |--W32ALPHA         # serves drivers to Windows NT Alpha_AXP          |--W32MIPS          # serves drivers to Windows NT R4000          |--W32PPC           # serves drivers to Windows NT PowerPC

### 必要とされるパーミッション

Sambaホスト上に新しいドライバを追加するためには、2つの条件のうちの1つを真にしておかねばならない:

- Sambaホストに接続する時に使われるアカウントはUIDが0でなければならない(すなわちrootアカウント)。

- Sambaホストに接続する時に使われるアカウントはprinter adminリスト中に列挙されねばならない。

もちろん、接続されたアカウントは`[print$]`下のサブ ディレクトリファイルを追加するための書き込み許可が必要である。すべてのファイル 共有は既定値で“リードオンリ”に設定されていることを覚えておくこと。

要求された`[print$]`サービスと関連したサブディレクトリを作成した後、Windows NT 4.0/200x/XPクライアントワークステーションの所に行く。ネットワークコンピュータかマイネットワークを開き、Sambaホストをブラウズする。所定のサーバを選択後、そのプリンタとFAXフォルダに移動する。そうすると、Sambaホスト上で定義されたプリンタ共有にい位置するプリンタの一覧の初期値を見る事ができる。

## [print$]へのドライバのインストール

`smb.conf`中に`[print$]`共有を無事作成でき、`smb.conf`ファイルを強制的にSambaに再読込させただろうか?であれば問題はない。しかし、新しい機能を使うにはまだもう少し手間がかかる。この共有中にクライアントドライバファイルをインストールする必要がある。そのため、まだこの共有は空の状態である。不幸にも、そこにドライバファイルをコピーするだけでは十分ではない。正しくインストールする必要があり、そうすると、各ドライバに対する適切なレコードがSamba内部データベース中に存在するようになり、Microsoft Windowsクライアントから要求された正しいドライバを提供することが出来るようになる。さらに、控えめに言ってもそれは厳重さが必要である。下記では`[print$]`中にドライバをインストールする2つの代替方法について説明する:

- 任意のUNIXワークステーションから、Sambaのコマンドラインユーティリティ `rpcclient`を、種々のサブコマンド (`adddriver`と`setdriver`など)を組み合わせて 使う。

- 任意のWindows NT/200x/XPクライアントワークステーションから、GUI (プリンタのプロパティとプリンタの追加ウィザード) を走らせる。

後者のオプションが、おそらくより易しいであろう(たとえプロセスが最初多少奇妙に振る舞うとしても)。

### プリンタの追加ウィザードによるドライバのインストール

プリンタは、最初、実際のプリンタドライバがそれに割り当てられていない状態で、クライアントのエクスプローラからアクセスされる、Sambaホストのプリンタフォルダに一覧表示される。既定値で、このドライバの名前は空の文字列に設定されている。これは変更しなければならない。NT/2000/XPクライアントから、ローカルのプリンタ追加ウィザード(APW)を動かすことで、この作業ができる。

有効なプリンタドライバのインストールは簡単である。ドライバを割り当てたいプリンタに対するプリンタのプロパティを表示させなければならない。Windowsのエクスプローラを起動し、ネットワークコンピュータを開き、Sambaホストをブラウズし、Sambaのプリンタフォルダを開き、プリンタアイコンを右クリックし、プロパティを選択する。これでプリンタと既定値の`NULL`ドライバが割り当てられているキューのためのドライバプロパティが見えるようになる。そして、“デバイス設定が表示できません。指定されたプリンタのドライバがインストールされていません。スプーラのプロパティのみ表示されます。ドライバを今インストールしますか?”というエラーメッセージが表示される。

ここで、Yesをクリックしてはいけない!その代わり、エラーダイアログでNoをクリックする。これで、プリンタプロパティウインドウが表示される。ここから、プリンタへのドライバの割り当ての手順は公開されている。以下を選べる:

- インストール済みのポップアップリストからドライバを選択。通常は最初リストは空である。

- 新しいプリンタドライバをインストールするために新しいドライバ をクリック(これはAPWを起動する)。

一度APWが起動すると、Windows中でなじみがある、ものと手続きは正確に同じである(Windows NT上のプリンタドライバインストール手続きに慣れていることを仮定している)。接続を確認し、printer admin権限を持つユーザとしてセットアップ(ユーザが権限を持つか分からない場合は`smbstatus`でチェックしてみる)。クライアントOSに対してWindows NT x86の代わりのプリンタドライバをインストールしたい場合、プリンタプロパティダイアログの共有タブを使う必要がある。

管理者(root)アカウント(printer adminパラメータで指定されたもの)で接続していると仮定すると、さらに、このダイアログを使ってACLと既定値のデバイスの設定のようなプリンタのプロパティをも修正できる。既定値のデバイス設定のためには、`rpcclient`を使った印刷ドライバのインストールに助言が書いてあることを考慮してほしい。

### `rpcclient`を使った印刷ドライバのインストール

`[print$]`にプリンタドライバをインストールし、有効な方法でそれを設定するための2番目の方法は、UNIXコマンドラインから行う方法である。これは、4つの異なったステップを必要とする。

1. 要求されたドライバファイルについての情報を集め、ファイルを収集する。

2. `[print$]`共有の正しいサブディレクトリ中にドライバ ファイルを置く(おそらく`smbclient`を使うだろう)。

3. `rpcclient`コマンドラインユーティリティを起動し、その `adddriver`サブコマンドを使う。

4. `rpcclient`をもう一度起動し、`setdriver` サブコマンドを使う。

以下の節で、これらのステップのおのおのについて詳細な説明を行う。

#### ドライバファイルの識別

ドライバファイルを見つけるためには2つのオプションがある。プリンタに付属のドライバCD-ROMの内容を検査することが出来る。CD-ROM上にある`*.inf`ファイルの位置を覚えておく。これは`*.inf`ファイルが無いかもしれないので、出来ない場合もある。残念なことに、最近ではベンダ固有のインストールプログラムを使う傾向がある。これらのインストールパッケージはしばしば何らかのWindows上での書庫形式を使っている。更に追加で、インストール処理中にファイル名が改名されるかもしれない。これは、必要とされるドライバファイルの識別がとても難しくなることを意味する。

次に、2番目のオプションがある。ドライバをWindowsクライアント上にローカルにインストールし、インストール後にそれが使うファイル名とパスを調査する(サポートしたい各クライアントプラットフォーム毎にこの手続きを繰り返さなければならない。ここでは、すべてのWindows NT/200x/XPクライアントのためにMicrosoftによって使われる名前である、W32X86プラットフォームのみを表示する)。

ドライバファイルを認識する良い方法は、ドライバのプロパティダイアログでテストページを印刷してみることである(全般タブ)。次に、印刷されたドライバファイルのリストを見てみる。Windows(とSamba)がドライバファイル、データファイル、設定ファイルと(オプションの)依存するドライバファイル(これはWindows NTでは若干変わる)の何を呼び出しているかを認識する必要がある。次のステップのためにすべてのファイル名を記録する必要がある。

ドライバファイル名と関連するパスを迅速にテストする別の方法は、`rpcclient`ユーティリティによって提供される。`enumdrivers`か`getdriver`サブコマンドを指定し、infoレベルを`3`にしてこれを動かす。以下の例では、TURBO_XPがWindows PCの名前である(この場合、これはWindows XP Professionalラップトップ)。`KDE-BITSHOP`という名前のSambaサーバからTURBO_XPにローカルにドライバをインストールしたとする。次に対話的な`rpcclient`を動かす。そうすると、`rpcclient />`が表示され、このプロンプトの状態でサブコマンドが入力出来るようになる。これは練習として残しておこう。次に、1つのサブコマンド行を実行し、すぐに終了するような`-c`オプションをつけて`rpcclient`を起動する。これは大量のプリンタとドライバのために自動作業を行うスクリプトを作成する時に使う手法である。異なる引用符を使い分けて単語間の異なった空白を解決するように注意:

    root# rpcclient -U'Danka%xxxx' -c \	'getdriver "Heidelberg Digimaster 9110 (PS)" 3' TURBO_XPcmd = getdriver "Heidelberg Digimaster 9110 (PS)" 3[Windows NT x86]Printer Driver Info 3:  Version: [2]  Driver Name: [Heidelberg Digimaster 9110 (PS)]  Architecture: [Windows NT x86]  Driver Path: [C:\WINNT\System32\spool\DRIVERS\W32X86\2\HDNIS01_de.DLL]  Datafile: [C:\WINNT\System32\spool\DRIVERS\W32X86\2\Hddm91c1_de.ppd]  Configfile: [C:\WINNT\System32\spool\DRIVERS\W32X86\2\HDNIS01U_de.DLL]  Helpfile: [C:\WINNT\System32\spool\DRIVERS\W32X86\2\HDNIS01U_de.HLP]    Dependentfiles: [C:\WINNT\System32\spool\DRIVERS\W32X86\2\Hddm91c1_de.DLL]  Dependentfiles: [C:\WINNT\System32\spool\DRIVERS\W32X86\2\Hddm91c1_de.INI]  Dependentfiles: [C:\WINNT\System32\spool\DRIVERS\W32X86\2\Hddm91c1_de.dat]  Dependentfiles: [C:\WINNT\System32\spool\DRIVERS\W32X86\2\Hddm91c1_de.cat]  Dependentfiles: [C:\WINNT\System32\spool\DRIVERS\W32X86\2\Hddm91c1_de.def]  Dependentfiles: [C:\WINNT\System32\spool\DRIVERS\W32X86\2\Hddm91c1_de.hre]  Dependentfiles: [C:\WINNT\System32\spool\DRIVERS\W32X86\2\Hddm91c1_de.vnd]  Dependentfiles: [C:\WINNT\System32\spool\DRIVERS\W32X86\2\Hddm91c1_de.hlp]  Dependentfiles: [C:\WINNT\System32\spool\DRIVERS\W32X86\2\HDNIS01Aux.dll]  Dependentfiles: [C:\WINNT\System32\spool\DRIVERS\W32X86\2\HDNIS01_de.NTF]    Monitorname: []  Defaultdatatype: []

このドライバは大量の依存ファイル(しかしながらこれは悪い場合である)を持つことに気がついても良いだろう。また、不思議なことに、ドライバファイルはここでドライバファイルにタグ付けされている。インストールされた、いわゆるWIN40アーキテクチャに対してまだサポートをしていない。この名前は、MicrosoftによってWindows 9x/Meプラットフォームに使われる。もしもこれらをサポートしたいならば、W32X86(すなわち、Windows NT/2000クライアント)Windows PC上に、それらのために追加でWindows 9x/Meドライバをインストールしなければならない。このPCは、Windows NT,2000あるいはXPで動いたとしても、Windows 9x/Meへの機能提供も出来る。

`[print$]`共有が通常ネットワークコンピュータ経由でアクセス出来るので、そこにアクセスするためにWindowsエクスプローラからUNC記述を使う事が出来る。Windows 9x/Meドライバファイルは`WIN40`ディレクトリの`0`というサブディレクトリで終わる。これらに対するフルパスアクセスは`\\WINDOWSHOST\print$\WIN40\0\`である。

### Note

Windows 2000とWindowsXP上のより最新のドライバは、“2”の代わりに“3”というサブディレクトリ中にインストールされる。Windows NT中で使われるバージョン2のドライバはカーネルモードで動作する。Windows2000ではこれを変更した。それは引き続きカーネルモードのドライバを使えるが(もしAdminによって有効にされれば)、そのネイティブモードのプリンタドライバはユーザモードで動作する。これは、この目的のために設計されたドライバを要求する。これらのタイプのドライバは“3”サブディレクトリにインストールされる。

#### Windowsクライアントの[print$]共有からのドライバファイルの取得

ここで、以前のステップで認識したすべてのドライバファイルを収集する必要がある。さて、どこからそれを得ればよいだろうか?最後のファイルを識別する手段中で調査した、同じ`[print$]`共有とそのPCからそれを検索しないのだろうか?これを行うのに`smbclient`が使える。`getdriver`によって分かったパスと名前を使える。下記のコマンドライン業は、可読性向上のために、継続行文字を入れて編集できる:

    root# smbclient //TURBO_XP/print\$ -U'Danka%xxxx' \    -c 'cd W32X86/2;mget HD*_de.* hd*ppd Hd*_de.* Hddm*dll HDN*Aux.DLL'added interface ip=10.160.51.60 bcast=10.160.51.255 nmask=255.255.252.0Got a positive name query response from 10.160.50.8 ( 10.160.50.8 )Domain=[DEVELOPMENT] OS=[Windows 5.1] Server=[Windows 2000 LAN Manager]Get file Hddm91c1_de.ABD? nGet file Hddm91c1_de.def? ygetting file \W32X86\2\Hddm91c1_de.def of size 428 as Hddm91c1_de.defGet file Hddm91c1_de.DLL? ygetting file \W32X86\2\Hddm91c1_de.DLL of size 876544 as Hddm91c1_de.DLL[...]

このコマンドが完了すると、カレントローカルディレクトリにファイルが置かれる。この時点で、セミコロンで分離した、`-c`パラメータのためにいくつかのコマンドが渡されることにおそらく気がつくだろう。これは、`smbclient`コマンドが再度終了する前にリモートのWindowsサーバ上で順番にすべてのコマンドを実行するようにさせる。

WIN40アーキテクチャが、Windows 9x/Me/XPクライアントをサポートしなければならないために、手続きを繰り返すことを忘れないこと。さらに、それらのアーキテクチャは`WIN40/0/`サブディレクトリにあることを忘れないこと。これがいったん終わると、Sambaサーバの`[print$]`共有にある、収集されたファイルを格納するために`smbclient. ..put`を動作させることができる。

#### [print$]へのドライバファイルインストール

次は、`[print$]`共有にドライバファイルを配置する作業である。この共有へのUNIXパスは`smb.conf`ファイル中で以前に定義した事を忘れないこと。また、サポートしたい異なったWindowsクライアントタイプのためには、サブディレクトリを作成する。たとえばもしも、`[print$]`が`/etc/samba/drivers/`というUNIXパスにマップされているならば、ドライバファイルは以下のように配置すべきである:

- すべてのWindows NT, 2000,と XPクライアント用は `/etc/samba/drivers/W32X86/` だが、`2`サブディレクトリ中ではない。

- すべてのWindows 95, 98,とMeクライアント用は `/etc/samba/drivers/WIN40/` だが、`0`サブディレクトリ中ではない。

再度、ネットワーク経由で、ドライバファイルを転送するためにsmbclientを使う。オリジナルのWindowsインストールに対して`getdriver`を走らせた事により情報を得た同じファイルとパスを指定する。しかし、ここでは、Samba/UNIX印刷サーバの`[print$]`共有中にファイルを格納する。

    root# smbclient //SAMBA-CUPS/print\$ -U'root%xxxx' -c \  'cd W32X86; put HDNIS01_de.DLL; \  put Hddm91c1_de.ppd; put HDNIS01U_de.DLL;        \  put HDNIS01U_de.HLP; put Hddm91c1_de.DLL;        \  put Hddm91c1_de.INI; put Hddm91c1KMMin.DLL;      \  put Hddm91c1_de.dat; put Hddm91c1_de.dat;        \  put Hddm91c1_de.def; put Hddm91c1_de.hre;        \  put Hddm91c1_de.vnd; put Hddm91c1_de.hlp;        \  put Hddm91c1_de_reg.HLP; put HDNIS01Aux.dll;     \  put HDNIS01_de.NTF'added interface ip=10.160.51.60 bcast=10.160.51.255 nmask=255.255.252.0Got a positive name query response from 10.160.51.162 ( 10.160.51.162 )Domain=[CUPS-PRINT] OS=[UNIX] Server=[Samba 2.2.7a]putting file HDNIS01_de.DLL as \W32X86\HDNIS01_de.DLLputting file Hddm91c1_de.ppd as \W32X86\Hddm91c1_de.ppdputting file HDNIS01U_de.DLL as \W32X86\HDNIS01U_de.DLLputting file HDNIS01U_de.HLP as \W32X86\HDNIS01U_de.HLPputting file Hddm91c1_de.DLL as \W32X86\Hddm91c1_de.DLLputting file Hddm91c1_de.INI as \W32X86\Hddm91c1_de.INIputting file Hddm91c1KMMin.DLL as \W32X86\Hddm91c1KMMin.DLLputting file Hddm91c1_de.dat as \W32X86\Hddm91c1_de.datputting file Hddm91c1_de.dat as \W32X86\Hddm91c1_de.datputting file Hddm91c1_de.def as \W32X86\Hddm91c1_de.defputting file Hddm91c1_de.hre as \W32X86\Hddm91c1_de.hreputting file Hddm91c1_de.vnd as \W32X86\Hddm91c1_de.vndputting file Hddm91c1_de.hlp as \W32X86\Hddm91c1_de.hlpputting file Hddm91c1_de_reg.HLP as \W32X86\Hddm91c1_de_reg.HLPputting file HDNIS01Aux.dll as \W32X86\HDNIS01Aux.dllputting file HDNIS01_de.NTF as \W32X86\HDNIS01_de.NTF

ヒュー;これはとても大量なタイプ量である!ほとんどのドライバはより小さい。多くはたった3つの汎用Postscriptドライバファイルと1つのPPDのみを持つ。Windowsマシンからの`W32X86`の`2`サブディレクトリからファイルを検索した時、Sambaサーバの同じサブディレクトリ中に(今は)それらを置かない。この再配置は、間もなく動く(そして、それらを必要とすべき場合、`WIN40/`サブディレクトリ中に、Windows 9x/Meアーキテクチャのためのファイルを置くことを忘れない)、`adddriver`によって自動的に行われる。

#### `smbclient`によるドライバインストールの確認

次は、所定の場所にファイルがあるかどうかを確認する。これは、`smbclient`で行える(が、もちろん、SSH経由でログインし、標準のUNIXシェルアクセスを通して行える)。

    root# smbclient //SAMBA-CUPS/print\$ -U 'root%xxxx' \	-c 'cd W32X86; pwd; dir; cd 2; pwd; dir' added interface ip=10.160.51.60 bcast=10.160.51.255 nmask=255.255.252.0Got a positive name query response from 10.160.51.162 ( 10.160.51.162 )Domain=[CUPS-PRINT] OS=[UNIX] Server=[Samba 2.2.8a]Current directory is \\SAMBA-CUPS\print$\W32X86\.                                  D        0  Sun May  4 03:56:35 2003..                                 D        0  Thu Apr 10 23:47:40 20032                                   D        0  Sun May  4 03:56:18 2003HDNIS01Aux.dll                      A    15356  Sun May  4 03:58:59 2003Hddm91c1KMMin.DLL                   A    46966  Sun May  4 03:58:59 2003HDNIS01_de.DLL                      A   434400  Sun May  4 03:58:59 2003HDNIS01_de.NTF                      A   790404  Sun May  4 03:56:35 2003Hddm91c1_de.DLL                     A   876544  Sun May  4 03:58:59 2003Hddm91c1_de.INI                     A      101  Sun May  4 03:58:59 2003Hddm91c1_de.dat                     A     5044  Sun May  4 03:58:59 2003Hddm91c1_de.def                     A      428  Sun May  4 03:58:59 2003Hddm91c1_de.hlp                     A    37699  Sun May  4 03:58:59 2003Hddm91c1_de.hre                     A   323584  Sun May  4 03:58:59 2003Hddm91c1_de.ppd                     A    26373  Sun May  4 03:58:59 2003Hddm91c1_de.vnd                     A    45056  Sun May  4 03:58:59 2003HDNIS01U_de.DLL                     A   165888  Sun May  4 03:58:59 2003HDNIS01U_de.HLP                     A    19770  Sun May  4 03:58:59 2003Hddm91c1_de_reg.HLP                 A   228417  Sun May  4 03:58:59 2003              40976 blocks of size 262144. 709 blocks availableCurrent directory is \\SAMBA-CUPS\print$\W32X86\2\.                                  D        0  Sun May  4 03:56:18 2003..                                 D        0  Sun May  4 03:56:35 2003ADOBEPS5.DLL                        A   434400  Sat May  3 23:18:45 2003laserjet4.ppd                       A     9639  Thu Apr 24 01:05:32 2003ADOBEPSU.DLL                        A   109568  Sat May  3 23:18:45 2003ADOBEPSU.HLP                        A    18082  Sat May  3 23:18:45 2003PDFcreator2.PPD                     A    15746  Sun Apr 20 22:24:07 2003              40976 blocks of size 262144. 709 blocks available

`2`サブディレクトリ(おそらく以前のインストールで)中に、すでにドライバファイルが存在することに注意。いったん新しいドライバのためのファイルがそこにあると、クライアント上からそれらを使うことが出来るようにするためからは違ういくつかのステップを処理することになる。この時点で行うべき唯一のことは、Windowsエクスプローラからprint$共有を開いて、ファイル共有から普通のファイルを検索するのと同じように、クライアントから、それらを検索することである。しかし、それはポイントアンドプリント単位でそれらをインストールしない。その理由は、Sambaはまだそれらのファイルが特別か、すなわち、プリンタドライバファイルかどうかを知らないのと、それらのドライバファイルが属する印刷キューがどれかを知らないということによる。

#### `adddriver`を付けたprinter driver filesの実行

次に、`[print$]`共有中に今アップロードしたファイルの特別なカテゴリについてSambaに通知する必要がある。これは、`adddriver`で行える。これは、Samba内部のTDBデータベースファイルにドライバを登録するように表示してくる。以下のコマンドと出力は、可読性向上のために編集してある:

    root# rpcclient -Uroot%xxxx -c 'adddriver "Windows NT x86" \  "dm9110:HDNIS01_de.DLL: \  Hddm91c1_de.ppd:HDNIS01U_de.DLL:HDNIS01U_de.HLP:   \  NULL:RAW:Hddm91c1_de.DLL,Hddm91c1_de.INI,          \  Hddm91c1_de.dat,Hddm91c1_de.def,Hddm91c1_de.hre,   \  Hddm91c1_de.vnd,Hddm91c1_de.hlp,Hddm91c1KMMin.DLL, \  HDNIS01Aux.dll,HDNIS01_de.NTF,                     \  Hddm91c1_de_reg.HLP' SAMBA-CUPScmd = adddriver "Windows NT x86" \  "dm9110:HDNIS01_de.DLL:Hddm91c1_de.ppd:HDNIS01U_de.DLL:   \  HDNIS01U_de.HLP:NULL:RAW:Hddm91c1_de.DLL,Hddm91c1_de.INI, \  Hddm91c1_de.dat,Hddm91c1_de.def,Hddm91c1_de.hre,          \  Hddm91c1_de.vnd,Hddm91c1_de.hlp,Hddm91c1KMMin.DLL,        \  HDNIS01Aux.dll,HDNIS01_de.NTF,Hddm91c1_de_reg.HLP"Printer Driver dm9110 successfully installed.

このステップの後、ドライバはプリントサーバ上のSambaによって認識される。このコマンドを入力するときには特別に注意を払う必要がある。フィールドの順番を交換しないこと。それは明白である。他の変更は、ドライバファイルのインストールが成功するかもしれないが、ドライバの実行が不可能になる。そのため、注意を払うこと!adddriverコマンドの文法に関するヒントはマニュアルページにあり、必要ならばより詳細な記述を見ておくこと。

#### `adddriver`処理完了の確認

ファイルをドライバファイルとしてSambaが認識したことを示す表示の1つは、`successfully installed`というメッセージである。他のものは、`adddriver`コマンドによってファイルが`2`サブディレクトリ中に動かされた、という事実である。これは再度`smbclient`コマンドで確認できる:

    root# smbclient //SAMBA-CUPS/print\$ -Uroot%xx \	-c 'cd W32X86;dir;pwd;cd 2;dir;pwd' added interface ip=10.160.51.162 bcast=10.160.51.255 nmask=255.255.252.0 Domain=[CUPS-PRINT] OS=[UNIX] Server=[Samba 2.2.7a]  Current directory is \\SAMBA-CUPS\print$\W32X86\  .                                  D        0  Sun May  4 04:32:48 2003  ..                                 D        0  Thu Apr 10 23:47:40 2003  2                                   D        0  Sun May  4 04:32:48 2003                40976 blocks of size 262144. 731 blocks available   Current directory is \\SAMBA-CUPS\print$\W32X86\2\  .                                  D        0  Sun May  4 04:32:48 2003  ..                                 D        0  Sun May  4 04:32:48 2003  DigiMaster.PPD                      A   148336  Thu Apr 24 01:07:00 2003  ADOBEPS5.DLL                        A   434400  Sat May  3 23:18:45 2003  laserjet4.ppd                       A     9639  Thu Apr 24 01:05:32 2003  ADOBEPSU.DLL                        A   109568  Sat May  3 23:18:45 2003  ADOBEPSU.HLP                        A    18082  Sat May  3 23:18:45 2003  PDFcreator2.PPD                     A    15746  Sun Apr 20 22:24:07 2003  HDNIS01Aux.dll                      A    15356  Sun May  4 04:32:18 2003  Hddm91c1KMMin.DLL                   A    46966  Sun May  4 04:32:18 2003  HDNIS01_de.DLL                      A   434400  Sun May  4 04:32:18 2003  HDNIS01_de.NTF                      A   790404  Sun May  4 04:32:18 2003  Hddm91c1_de.DLL                     A   876544  Sun May  4 04:32:18 2003  Hddm91c1_de.INI                     A      101  Sun May  4 04:32:18 2003  Hddm91c1_de.dat                     A     5044  Sun May  4 04:32:18 2003  Hddm91c1_de.def                     A      428  Sun May  4 04:32:18 2003  Hddm91c1_de.hlp                     A    37699  Sun May  4 04:32:18 2003  Hddm91c1_de.hre                     A   323584  Sun May  4 04:32:18 2003  Hddm91c1_de.ppd                     A    26373  Sun May  4 04:32:18 2003  Hddm91c1_de.vnd                     A    45056  Sun May  4 04:32:18 2003  HDNIS01U_de.DLL                     A   165888  Sun May  4 04:32:18 2003  HDNIS01U_de.HLP                     A    19770  Sun May  4 04:32:18 2003  Hddm91c1_de_reg.HLP                 A   228417  Sun May  4 04:32:18 2003                40976 blocks of size 262144. 731 blocks available

他の検査方法は、印刷関連のTDBファイルのタイムスタンプが更新されたという事(と、もしも条件がそろえば、そのファイルサイズが増えたこと)である。

#### Sambaがドライバを認識したかの確認

この時点で、ドライバはSambaによって登録された。ほんの少しの時間でこのことを確認できる。しかし、このドライバはまだ特定のプリンタに対して関連づけられていない。少なくとも3つの方法で、ドライバファイルのステータスを確認できる:

- 任意のWindowsクライアントの、ネットワークコンピュータによるブラウズから、Samba ホストを検索し、SambaのプリンタとFAXフォルダを開く。任意の プリンタアイコンを選択し、右クリックしてプリンタの プロパティを選択する。詳細タブを クリックする。そのプリンタに対するドライバを示すフィールドがここにある。ドロップ ダウンメニューでそのドライバを変更できる(知らずにこれをしないように気をつける こと)。Sambaが理解しているすべてのドライバの一覧を、これを使うことで見ることが できる。新しいものがその中にあるべきである(クライアントの各タイプはこの固有の アーキテクチャリストの中にのみ見ることができる。もしも各プラットフォーム用に インストールされた各ドライバが無いならば、Windows95/98/MEかWindows NT/2000/XP を見たときとは、このリストは違っている)。

- Windows 200x/XPクライアント(Windows NTではなく)の ネットワークコンピュータによるブラウズから、Sambaサーバを 探し、サーバのプリンタフォルダを開き、空白の部分(プリンタが ハイライトされていないようにして)を右クリックする。 サーバのプロパティを選択する。 ドライバタブ上で、新しいドライバが一覧表示されていることが 確認できる。この表示は、そのドライバに属するファイルの一覧を調べるのにも使える (これはWindows NTでは動作せず、Windows 2000とWindows XPでのみ動作する。 Windows NTはドライバタブを提供しない)。この ダイアログをより簡単に起動するための代替の方法は、DOSプロンプトで入力する方法 である(もちろん、`SAMBA-CUPS`の代わりに使用している Sambaサーバの名前を使わなければならない)。

      	rundll32 printui.dll,PrintUIEntry /s /t2 /n\\SAMBA-CUPS

- UNIXプロンプトから、`SAMBA-CUPS`になっている場所を 使用しているSambaホストの名前にして、xxxxは、rootに割り当てられている実際の Sambaのパスワードにして以下のコマンド(かあるいはその変形)を動かす:

      	rpcclient -U'root%xxxx' -c 'enumdrivers' SAMBA-CUPS

  これで、Sambaが知っているすべてのドライバが表示される。新しいものはこの中に あるべきである。しかし、`[Windows NT x86]`ヘッデイング 配下のもののみが一覧表示され、その部分をインストールしていないため、 `[Windows 4.0]`配下はない。3番目のカラムは、他に インストールされたドライバを、各サポートしたアーキテクチャ用に、一度に 2度表示する。新しいドライバはWindows NT 4.0 or 2000 のみに表示される。Windows 95, 98, と Meに存在 しているようにするためには、WIN40アーキテクチャとサブディレクトリに対する 完全な手続きを繰り返さなければならない。

#### 指定したドライバ名の自由度

ドライバに好みの名前を付けることが出来る。前と同じファイルではあるが、異なったドライバ名を付けて`adddriver`ステップを繰り返したいのならば、以下のように行う:

    root# rpcclient -Uroot%xxxx         \  -c 'adddriver "Windows NT x86"                     \  "mydrivername:HDNIS01_de.DLL:              \  Hddm91c1_de.ppd:HDNIS01U_de.DLL:HDNIS01U_de.HLP:   \  NULL:RAW:Hddm91c1_de.DLL,Hddm91c1_de.INI,          \  Hddm91c1_de.dat,Hddm91c1_de.def,Hddm91c1_de.hre,   \  Hddm91c1_de.vnd,Hddm91c1_de.hlp,Hddm91c1KMMin.DLL, \  HDNIS01Aux.dll,HDNIS01_de.NTF,Hddm91c1_de_reg.HLP' SAMBA-CUPS  cmd = adddriver "Windows NT x86" \ "mydrivername:HDNIS01_de.DLL:Hddm91c1_de.ppd:HDNIS01U_de.DLL:\  HDNIS01U_de.HLP:NULL:RAW:Hddm91c1_de.DLL,Hddm91c1_de.INI,           \  Hddm91c1_de.dat,Hddm91c1_de.def,Hddm91c1_de.hre,                    \  Hddm91c1_de.vnd,Hddm91c1_de.hlp,Hddm91c1KMMin.DLL,                  \  HDNIS01Aux.dll,HDNIS01_de.NTF,Hddm91c1_de_reg.HLP"Printer Driver mydrivername successfully installed.

任意のプリントキューにそのドライバをバインドすることが出来る(しかし、ターゲットのプリンタに関して意味をなすキューへのドライバを連携させる事については、責任を追わねばならない)。繰り返し`rpcclient` `adddriver`コマンドを実行することは出来ない。おのおのの実行は、それぞれのサブディレクトリ中にそれらを移動することで、`[print$]`共有中にファイルを配置してしまったので、各`rpcclient ... adddriver`コマンドの前に`smbclient ... put`を1回実行させなければならない。

#### `setdriver`を付けた`rpcclient`の実行

Sambaはどのプリンタがどのドライバに対応しているかを知る必要がある。ドライバからプリンタへのマッピングを作成し、この情報をSambaのTDBファイルに格納する。`rpcclient setdriver`はこれを正しく処理する:

    root# rpcclient -U'root%xxxx' -c 'setdriver dm9110 mydrivername' SAMBA-CUPS cmd = setdriver dm9110 mydrivernameSuccessfully set dm9110 to driver mydrivername.

これはまずい、こういう事は期待していない。この時点では、指定する名前を繰り返す:

    root# rpcclient -U'root%xxxx' -c 'setdriver dm9110 dm9110' SAMBA-CUPS cmd = setdriver dm9110 dm9110Successfully set dm9110 to driver dm9110.

コマンドの文法は下記の通り:

    rpcclient -U'root%sambapassword' -c 'setdriver printername \ drivername' SAMBA-Hostname.

これで、ほとんどの仕事が完了したが、まだ全部ではない。

### Note

`setdriver`コマンドは、Sambaがそのプリンタをすでに知っているときにのみ成功する。2.2.x中にあるバグは、新しくインストールされたプリンタの認識を妨害する。Sambaを再起動するか、少なくともこれに対応するために、動作中のすべてのsmbdに対してHUPシグナルを`kill -HUP `pidof smbd``のように送信する必要がある。

## クライアントドライバのインストール方法

Don Quixote曰く、“論より証拠”。印刷することでセットアップした内容の証明ができる。そのため、クライアントPC上にプリンタドライバをインストールしてみよう。が、これは思ったよりも簡単ではない。以下で説明する。

### 最初のクライアントドライバインストール

特に重要なことは、最初のクライアントPCへのインストール(各アーキテクチャプラットフォームごとに)である。一度これが正常に終わると、その後他のクライアントへは、簡単にセットアップでき、さらなる注意事項は必要ない。以下でフォローすることは、推奨する最初の手順の説明である。ここから先はクライアントワークステーションで作業する。そのクライアントからの接続が書き込みできないbad user nobodyにマップされていないことを確認する。DOSプロンプトで以下を入力する:

`net use \\`SAMBA-SERVER`\print$ /user:root`

必要であれば、printer adminで定義している他の有効なユーザにrootを置き換える。異なったユーザですでに接続しているならば、エラーメッセージが表示される。Windowsは共有の接続からログオフする概念が内容に見えるので、その接続のridを取得するのに簡単な方法はない(ローカルワークステーションからのログオフと混同しないように。それは別の事柄である)。Windows NT/200x上では、workstationサービスを再起動することで、すべての smb/cifs接続から強制的にログオフすることができる。Windows ファイルエクスプローラとWindows用のMSIEのすべてを閉じることを試みることができる。苦肉の策として、再起動しても良い。自動的な再接続の設定が無いことを理解すること。別のワークステーションに行ってそこからつなぐ方が簡単かもしれない。printer adminユーザとして接続出来た後(Samba上の`smbstatus`コマンドでこれを確認できる)、Windowsワークステーションから以下を実行する:

1. ネットワークコンピュータを開く。

2. Sambaサーバをブラウズする。

3. そのプリンタとFAXフォルダを開く。

4. プリンタを選択して右クリックする。

5. 接続を選択(Windows NT4/200xでは おそらくそれはインストールであろう)。

新しいプリンタ(Sambaサーバ上で`printername`という名前の)がローカルのプリンタフォルダ中に現れるはずである(スタート -> 設定 -> コントロールパネル -> プリンタとFAXで確認)。

おそらくは、印刷テストページを出力しようとしているだろう。全部終わった後、プリンタのプロパティを開き、全般タブ上に、これを行うためのボタンがある。しかし、やってみると"`印刷テストページを印刷できませんでした`"というエラーメッセージが表示される。これは、そのドライバに対して有効なデバイスモードセットがないか、“プリンタドライバデータ”セットが引き続き不完全状態という理由による。

有効な`デバイスモード`を、ドライバのために設定する必要がある。それがどういう意味かはこれから説明する。

### 新しいプリンタに対するデバイスモードの設定

Windows NT/200x/XPクライアントからプリンタが完璧に使えるようにするには、以下の作業が必要である:

- 有効なデバイスモードは、プリンタ用のドライバによって生成 される(紙のサイズ、方向と両面印刷の設定などを定義)。

- ドライバによって生成されるプリンタドライバデータの完全なセット。

これらのどれかが不完全だと、クライアントはせいぜい最適な出力以下しか作成できない。最悪の場合、プリンタから読めないゴミが出力されたり、何も出なかったりするか、印刷時にエラーメッセージが出る。Sambaは名前つきの値と、すべての印刷に関連する情報をその内部TDBデータベースファイル(`ntprinters.tdb`, `ntdrivers.tdb`,`printing.tdb`,と `ntforms.tdb`)に格納する。

デバイスモードとプリンタドライバデータのセットはすべてのプリントキュープロパティのための基本的な設定の集合体であり、賢明な方法で初期化される。デバイスモードとプリンタドライバデータは、印刷サーバ(Sambaホスト)上で健全な値に初期化されるべきであり、そして、クライアントは直接それらを使い始めることが出来る。どのように初期の健全な値を設定したらよいだろうか?これは、以下の節で説明されるように、あるNT(か200x/XPクライアント)からドライバをリモートでアクセスすることで行える。

有効なデバイスモードはprinter adminかrootによってのみ初期化できる(理由は明白であろう)ことに気がつくこと。デバイスモードはプリンタドライバプログラムそれ自身を実行することのみで正しく設定できる。SambaはこのWin32プラットフォームドライバプログラムを実行できないので、この設定は初期状態ではNULLになる(クライアントが使うためには有効な設定ではない)。幸いなことに、ほとんどのドライバは、APWの助けかrpcclientで`[print$]`にアップロードされた時、必要であれば、自動的にプリンタドライバデータを生成する。

最初の有効なデバイスモードの生成と設定は、しかし、Sambaサーバ上にそれをクライアントから設定するには若干のトリックを必要とする。最も簡単な方法は、サーバのプリンタ上のページの方向を単純に変更することである。これは求められる効果を起こすために、クライアント上でプリンタドライバプログラムを実行することで十分であり、Sambaサーバに新しいデバイスモードを戻す。これを行うためには、Windowsクライアントから、ネイティブなWindows NT/200x/XPプリンタプロパティを、下記のようにして使うことが出来る:

Procedure 21.1. プリンタドライバ設定の初期化手続き

1. ネットワークコンピュータをブラウズする。

2. Sambaサーバを見つける。

3. SambaサーバのプリンタとFAXフォルダを開く。

4. 問い合わせ中の共有プリンタを選択する。

5. プリンタ上で右クリックする(最後の節の説明に従っているならすでにここにいるはずである)。

6. コンテキストメニューの下部にあるプロパティを選択する(もっと上に 引き続き接続エントリを表示しているなら、直近の節で説明 したように、ドライバのインストールを完了するためにそれをクリックする必要がある)。

7. 詳細タブに移動し、印刷の定義をクリックする。

8. ページの設定を縦から横に変更する(そして戻す)。

9. 変更が実際に効果を引き起こすように、ページ方向の変更の確定を確実に行う。

10. そこに居る間、他のクライアントにおけるドライバインストール時に適用される、 印刷の既定値を設定してもよい。

この手続きは、クライアントプラットフォーム上でプリンタドライバプログラムを動かし、正しいデバイスモードをSambaにフィードバックし、そして、それをTDBファイルに格納する。一度ドライバがクライアント上にインストールされると、もしもSambaのprinter adminユーザであれば、localのプリンタフォルダにアクセスすることによって、類似したステップを行うことも出来る。ここから、印刷作業は期待した通りに動作する。

Sambaには、プリンタのための既定値のデバイスモードを生成するための、サービスレベルの`default devmode`という名前のパラメータがある。ある種のドライバ機能は既定値のプロパティの値でうまく機能する。その他はクライアントのスプーラサービスをクラッシュするかもしれない。そのたえm、このパラメータの使用には注意が必要である。プリンタに対する有効なデバイスモードをクライアントに作成させることと、使用しているサーバにそれを格納することは、常時よりよい方法である。

### 追加のクライアントドライバインストール

各追加ドライバは、今説明してきたことと同じ方法でインストールできる。`ネットワークコンピュータ`をブラウズし、Sambaサーバ上のプリンタアイコンを開き、プリンタを右クリックし、接続を選択する。一度これが完了すると(数秒以上はかからないが、ネットワークに依存するので、分単位でかかるときもある)、クライアントワークステーションの、ローカルのプリンタとFAXフォルダ中に新しいプリンタが現れる。

Windows 200x/XP Professionalワークステーション上で以下のコマンドを使うことによって、ローカルのプリンタとFAXフォルダを開くことが出来る。

    rundll32 shell32.dll,SHHelpShortcuts_RunDLL PrintersFolder

一方Windows NT 4.0ワークステーションでは以下のように行う:

    rundll32 shell32.dll,Control_RunDLL MAIN.CPL @2

DOS プロンプトウィンドウ内か、スタートメニュー中のコマンドを指定して実行のどちらかで入力できる。

### 常時最初のクライアントからの接続はrootか“printer admin”で行う

Sambaサーバ上にドライバをインストール後(その`[print$]`共有中に)、常時最初のクライアントインストールを正しく完了させねばならない。クライアントからprinter adminとして、まさしくその最初の接続を確立することを習慣づけるようにすること。これは、以下のように行う:

- 最初の有効なデバイスモードが実際に初期化される(詳細な説明は 新しいプリンタ上のデバイスモードの設定を参照)。

- 今後のすべてのクライアントインストールのための、使用しているプリンタの既定値の プリンタ設定は期待するようになる。

上の方向を横に変更し、適用をクリックし、再度戻すことでこれを行う。次に、他の設定を変更する(たとえば、常時 A4を使っているときに、紙のサイズをレターに既定値を変更したくないであろう?既定値として両面印刷にプリンタを設定したいかもしれないなど)。

Sambaプリンタにrootとして接続するためには、以下のコマンドをWindows 200x/XPのDOSプロンプトから実行する:

    C:\> runas /netonly /user:root "rundll32 printui.dll,PrintUIEntry /p /t3 /n 	\\SAMBA-SERVER\printername"

`root`のSambaパスワードを入力し、しばらく待ち、印刷の既定値をクリックし、すべてのクライアントで使われる既定値とすべきジョブオプションを設定する。代替として、printer adminの設定中のメンバの中の名前をrootの代わりとして使うことが出来る。

これで、他のすべてのユーザは同じ方法でドライバのダウンロードとインストールが(`ポイントアンドプリント`を使って)出来るようになり、既定値も同じように設定される。もしも、このステップに失敗したら、ユーザからたくさんの問い合わせが来ることになるが、たくさんおしゃべりが出来て楽しいことになるだろう。

## その他のテクニック

ドライバはインストールされた。クライアントによるポイントアンドプリントインストールは準備ができた。最初のクライアントマシンでダウンロードして使ってみてもよいが、ちょっと待ってほしい。その前に、有用だと思われる、ちょっとした助言とこつをここで伝授する。たとえば、前の節で助言したような、プリンタに既定値を設定しなかったとする。利用者は多くの問題に不満を言うだろう(たとえば、“各ジョブにレターからA4への紙のサイズの変更を必要とし、それが格納できない”など)。

### クライアントドライバのための既定値の印刷操作の設定

最後の文は、若干のユーザと管理者には複雑な気持ちになるかもしれない。何時間もかけて苦労したのに、設定をセーブできると思ったらそれが出来なかった。それはやった人の問題ではない。混乱する点は、プリンタ名上で右クリックをした時にポップアップされる複数のタブを持つダイアログ中でプロパティを選択したとき、同一であるように見える2つのダイアログが現れ、それぞれは3つの異なった方法でプリンタのオプション設定を手助けすると言ってくるということである。これの完璧な答えは、Sambaの既定値のドライバ設定FAQにある:

“Windows 200x/XP上ですべてのユーザで既定値のプリンタオプションを設定しセーブできない。なぜ?”. どのようにそれを行っている?操作を間違っているのではないか(確かにそれを見つけるのは簡単ではないが)。すべてを設定するダイアログを起動するのに3つのやり方がある。すべての3つのダイアログは同じように見えるが、そのうちの1つが意図したものである。すべてのユーザのためにAdministratorかPrint Administratorでこれを行う必要がある。XP Professionalでどのようにこれを再現したかは以下の通り:

1. 最初の“間違った”方法:

   1. Open the Printers folder.

   2. プリンタ(cupshost上のリモートプリンタ)を右クリックし、 コンテキストメニューの印刷のプリファレンス...を選択する。

   3. しっかりとこのダイアログを見て、どのように見えるかを覚えておくこと。

2. 2番目の“間違った”方法:

   1. プリンタフォルダを開く。

   2. プリンタ(cupshost上のリモートプリンタ) を右クリックし、コンテキストメニューの プロパティ

      を選択する。

   3. 全般タブをクリックする。

   4. 印刷のプリファレンス... ボタンをクリックする。

   5. 新しいダイアログが開く。このダイアログを開いたままにして 親のダイアログに戻る。

3. 3番目の正しい方法(これを最初に行うべきであり、そのあと上記で説明した2番目の方法の ステップ1と2を行う):

   1. 詳細タブをクリックする (もしもすべてが“灰色で選択できない”ならば、十分な 権限を持つユーザでログインしていない)。

   2. 印刷の既定値ボタンを クリックする。

   3. 2つの新しいタブ上のどれかで、 詳細ボタンをクリックする。

   4. 新しいダイアログが開く。これを他と比較する。これらは “B.5”からのものとA.3からのものと比較したときに同じか?

2つの設定ダイアログで何らかの違いがあっただろうか?そうではないはずであろう。しかし、最後のもののみ、ステップC.1からC.6までの処理は、新しいユーザのために既定値となる、任意の設定を恒常的に保存する。もしも全クライアントに同じ既定値を設定したいならば、クライアントがドライバをダウンロードする前に(上記のAまたはBの手順に従うことで、クライアントはユーザ毎の既定値を後で設定出来る)、管理者(printer admin)としてそれらのステップを行う必要がある。Windows 200x/XPはユーザ毎の既定値設定が出来、その管理者はそれら固有の設定を行う前にそれを提供する。同一に見えるダイアログの親は、そのウィンドウ名が微妙に違っている。1つは`サーバBar上のプリンタFoo用の既定値の印刷値`(これが必要なもの)と呼ばれ、もう1つは、“`サーバBar上のプリンタFooの用の印刷設定`”と呼ばれる。最後のものは、プリンタを右クリックし、印刷設定...を選択した時に現れるものである。これは、Windows NTの時代に使うことを教わったものであり、Windows 200x/XPはで同じように試すのはとても自然である。同じように見えるものに到達する異なったパスがあるとは夢にも思わないだろうが、機能は異なり、すべてのユーザに既定値を設定するダイアログである。

### Tip

(Windows 200x/XP上で)このコマンドを動かしてみる(正しい権限を持つユーザで):

`rundll32 printui.dll,PrintUIEntry /p /t3 /n\\`SAMBA-SERVER`\`printersharename``

印刷の既定値ボタン(必要としているもの)があるタブを見るには以下のコマンドを実行する:

`rundll32 printui.dll,PrintUIEntry /p /t0 /n\\`SAMBA-SERVER`\`printersharename``

印刷のプリファレンスボタンを持つタブを見るには(システム全体の既定値を設定しない)、DOSプロンプト内でコマンドを実行するか、スタート -> 実行を選択する。

### 大量のプリンタのサポート

昨今のSamba 開発フェーズにおいて浮かび上がった問題は、さまざまな種類のプリンタに関してドライバのダウンロードサポートが必要なことである。Windows NT の APW(Add Printer Wizard)を使うやり方は(控えめに言っても)筋が良いとはいえない。一人でクリック祭りをやりながらプリンタのインストールをやりつつ反復性緊張症候群(RSS)の苦痛をを味わいたくなければ、非会話的なスクリプトについて検討する必要があるだろう。

複数のプリンタが同じドライバを使う場合、`rpcclient setdriver`コマンドはインストールされたキューに結合されたドライバを設定するために使える。もしもドライバが`[print$]`で一度更新され、印刷用TDBファイルに登録されると、複数の印刷キューによって使うことができる。この場合、すべてのキューに対して(`adddriver`を繰り返し実行する必要なしに)`rpcclient`の`setprinter`サブコマンドを繰り返す必要がある。以下はどのようにこれを達成するかの例である:

    root# rpcclient SAMBA-CUPS -U root%secret -c 'enumdrivers' cmd = enumdrivers  [Windows NT x86] Printer Driver Info 1:   Driver Name: [infotec  IS 2075 PCL 6]  Printer Driver Info 1:   Driver Name: [DANKA InfoStream]  Printer Driver Info 1:   Driver Name: [Heidelberg Digimaster 9110 (PS)]  Printer Driver Info 1:   Driver Name: [dm9110] Printer Driver Info 1:   Driver Name: [mydrivername] [....]

    root# rpcclient SAMBA-CUPS -U root%secret -c 'enumprinters' cmd = enumprinters   flags:[0x800000]   name:[\\SAMBA-CUPS\dm9110]   description:[\\SAMBA-CUPS\dm9110,,110ppm HiVolume DANKA Stuttgart]   comment:[110 ppm HiVolume DANKA Stuttgart] [....]

    root# rpcclient SAMBA-CUPS -U root%secret -c \  'setdriver dm9110 "Heidelberg Digimaster 9110 (PS)"' cmd = setdriver dm9110 Heidelberg Digimaster 9110 (PPD) Successfully set dm9110 to driver Heidelberg Digimaster 9110 (PS).

    root# rpcclient SAMBA-CUPS -U root%secret -c 'enumprinters' cmd = enumprinters   flags:[0x800000]   name:[\\SAMBA-CUPS\dm9110]   description:[\\SAMBA-CUPS\dm9110,Heidelberg Digimaster 9110 (PS),\     110ppm HiVolume DANKA Stuttgart]   comment:[110ppm HiVolume DANKA Stuttgart] [....]

    root# rpcclient SAMBA-CUPS -U root%secret -c 'setdriver dm9110 mydrivername' cmd = setdriver dm9110 mydrivername Successfully set dm9110 to mydrivername.

    root# rpcclient SAMBA-CUPS -U root%secret -c 'enumprinters' cmd = enumprinters   flags:[0x800000]   name:[\\SAMBA-CUPS\dm9110]   description:[\\SAMBA-CUPS\dm9110,mydrivername,\     110ppm HiVolume DANKA Stuttgart]   comment:[110ppm HiVolume DANKA Stuttgart] [....]

(説明フィールドの2つのカンマの間に)ドライバが一覧表示される、空の文字列がある“dm9110”プリンタが表示される最初の`enumprinters`呼び出しを認識するのは簡単ではないかもしれない。`setdriver`コマンドの成功後、すべてはうまくいく。

### Windows NT APWによる新しいプリンタの追加

既定値では、Sambaは`smb.conf`中で定義されているすべてのプリンタ共有を、プリンタフォルダに表示する。また、このフォルダ中にWindows NTのプリンタ追加ウィザードアイコンも配置される。APWは下記の条件の時にのみ表示される:

- 接続したユーザは管理者権限つきで`OpenPrinterEx(\\server)`を 正常に実行できる(すなわち、root又はprinter admin)。

  ### Tip

  Windows 200x/XP DOSプロント内で下記を試してみる:

  `runas /netonly /user:root rundll32 printui.dll,PrintUIEntry /p /t0 /n \\`SAMBA-SERVER`\`printersharename``

  印刷のプリファレンスをクリックする。

- ... は下記の設定を含む show add printer wizard = yes (既定値) default)。

APWではいろいろなことが出来る:

- 新しいドライバをSambaの`[print$]`共有にアップロードする。

- 存在している印刷キューに(ただしまだドライバがない)アップロードされたドライバを関連づける。

- 存在する印刷キューに対して、以前にアップロードされたものと、現在使っているドライバを、交換する。

- Sambaホストに、完全な形で新しいプリンタを追加する(動作する add printer commandと組み合わせる場合のみ。 プリンタフォルダからエントリを削除するための delete printer commandも提供してもよい)。

最後のもの(プリンタの追加)はその前のものよりもより多くの努力を必要とする。Sambaサーバに正しくプリンタを追加するのにAPWを使うためには、add printer commandに値が定義されている必要がある。プログラムホックは、正しくUNIX印刷システム(すなわち`/etc/printcap`、`/etc/cups/printers.conf`か他の適切なファイル)と、必要であれば`smb.conf`にプリンタを追加しなければならない。

クライアントからAPWを使うとき、名前が付いたプリンタ共有が存在しない場合、smbdはadd printer commandを実行し、新しいプリンタ共有を配置するために、再度検索する。もしも共有がやはり定義されていないのであれば、クライアントに"アクセスが拒否されました"が返る。ユーザが接続している状態においてのadd printer commandの実行は、rootアカウントの必要はない。map to guest = bad userは間違った権限で書き込みが出来なくなる接続をしてしまうだろう。`smbstatus`コマンドを使ってこのことを検査すべきである。

### エラーメッセージ: “異なった名前で接続できない”

間違った認証情報で接続してしまった場合、すべてのエクスプローラ画面を閉じ、リブートする以外に、この状況を解決する方法はない。

- `net use \\SAMBA-SERVER\sharename /user:root`を使うと以下の エラーメッセージが表示される: “サーバか共有リソースへの、複数の接続か、同じユーザによっていくつかの ユーザ名を使う事は許可されない。特にサーバ、共有リソースへのすべての接続を 切断し再度試してみる。”

- “ネットワークドライブへの割り当て”-> `\\SAMBASERVER\\print$`->`z:`へのすべての 試みは、以下のようなメッセージがしつこく表示される: “このネットワークフォルダは現在異なった認証情報(ユーザ名とパスワード)の元で 接続されている。異なったユーザ名とパスワードで再度接続するために、この ネットワーク共有への接続まず初めに切断する。”

そのためすべての接続をクローズする。そして再実行する。そうすると同じメッセージが出る。`smbstatus`を使ってSamba側でチェックを行う。するといくつか接続されているのが分かる。それらをkillする。そうしてもクライアントは同じメッセージを出す。デバッグレベルを上げて、再接続してsmbd.logをチェックする。ログ中に1行ではない、いくつかのエラーメッセージがある事が分かる。何らかの接続があったかどうかを考えて見始める。接続するときの状況を見るため、wiresharkかtcpdumpを走らせてみる。結果はこうなる:たくさんのデータがネットワーク上に出ている。Windowsは引き続きエラーメッセージを表示している。エクスプローラのウィンドウをクローズして、再度起動する。再度接続すると今回はうまくいった!Windowsは接続情報をどこかにキャッシュしているように見え、それは最新状態にしていない(不幸な場合、エラーメッセージを除去するためにリブートの必要があるかもしれない)。

クライアントからサーバへのすべての接続を強制的に終了する最も簡単な方法は以下を実行する:

    C:\>  net use * /delete

これは、マップされたドライバすべても切断し、要求に応じて新しい接続が出来るようにする。

### ドライバファイルを集めるときに気をつけること

特定のドライバに帰属するファイルについて注意するときにはきわめて注意深くする必要がある。ドライババージョン“0”(Windows 9x/Me用で`[print$]/WIN/0/`に入るもの)とドライババージョン`2`(Windows NTのカーネルモードドライバで、`[print$]/W32X86/2/`に入るもので、Windows 200x/XPでも使われる)と、ドライババージョン“3”(非カーネルモードドライバで、`[print$]/W32X86/3/`に入るもので、Windows NTでは使われない)のためのファイルを混同してはならない。これら異なったドライバのバージョンは同じ名前のファイルを含んでいるが実際には全く異なることがとても多い。Sambaから`enumdrivers`コマンドで、大小文字が混じったか、小文字のみで表示されている間、もしもそれらをWindowsエクスプローラ(`%WINDOWS%\system32\spool\drivers\W32X86\`内にある)で見る時、大文字で名前を見ることになるので、とてもこれらを混同しやすくなる。もしも、`rpcclient`とサブコマンドを使い、手動でそれらをインストールした場合、何のエラーメッセージもなしに成功する。その後、クライアント上にインストールしようとしたとき、`このサーバはプリンタに対する適切なドライバを持っていない`というエラーメッセージを受け取ることになる。

以下は例である。しっかりと数多くのファイルに対して、その名前と綴りを確認し、バージョン2と3の構成において、その違いを見いだすことが求められる。注意:バージョン0には40の`依存するファイル`があるので、紙面節約のためにそれらは削除してある:

    root# rpcclient -U 'Administrator%secret' -c 'enumdrivers 3' 10.160.50.8  Printer Driver Info 3:         Version: [3]         Driver Name: [Canon iR8500 PS3]         Architecture: [Windows NT x86]         Driver Path: [\\10.160.50.8\print$\W32X86\3\cns3g.dll]         Datafile: [\\10.160.50.8\print$\W32X86\3\iR8500sg.xpd]         Configfile: [\\10.160.50.8\print$\W32X86\3\cns3gui.dll]         Helpfile: [\\10.160.50.8\print$\W32X86\3\cns3g.hlp]          Dependentfiles: [\\10.160.50.8\print$\W32X86\3\aucplmNT.dll]         Dependentfiles: [\\10.160.50.8\print$\W32X86\3\ucs32p.dll]         Dependentfiles: [\\10.160.50.8\print$\W32X86\3\tnl32.dll]         Dependentfiles: [\\10.160.50.8\print$\W32X86\3\aussdrv.dll]         Dependentfiles: [\\10.160.50.8\print$\W32X86\3\cnspdc.dll]         Dependentfiles: [\\10.160.50.8\print$\W32X86\3\aussapi.dat]         Dependentfiles: [\\10.160.50.8\print$\W32X86\3\cns3407.dll]         Dependentfiles: [\\10.160.50.8\print$\W32X86\3\CnS3G.cnt]         Dependentfiles: [\\10.160.50.8\print$\W32X86\3\NBAPI.DLL]         Dependentfiles: [\\10.160.50.8\print$\W32X86\3\NBIPC.DLL]         Dependentfiles: [\\10.160.50.8\print$\W32X86\3\cpcview.exe]         Dependentfiles: [\\10.160.50.8\print$\W32X86\3\cpcdspl.exe]         Dependentfiles: [\\10.160.50.8\print$\W32X86\3\cpcedit.dll]         Dependentfiles: [\\10.160.50.8\print$\W32X86\3\cpcqm.exe]         Dependentfiles: [\\10.160.50.8\print$\W32X86\3\cpcspl.dll]         Dependentfiles: [\\10.160.50.8\print$\W32X86\3\cfine32.dll]         Dependentfiles: [\\10.160.50.8\print$\W32X86\3\cpcr407.dll]         Dependentfiles: [\\10.160.50.8\print$\W32X86\3\Cpcqm407.hlp]         Dependentfiles: [\\10.160.50.8\print$\W32X86\3\cpcqm407.cnt]         Dependentfiles: [\\10.160.50.8\print$\W32X86\3\cns3ggr.dll]          Monitorname: []         Defaultdatatype: [] Printer Driver Info 3:         Version: [2]         Driver Name: [Canon iR5000-6000 PS3]         Architecture: [Windows NT x86]         Driver Path: [\\10.160.50.8\print$\W32X86\2\cns3g.dll]         Datafile: [\\10.160.50.8\print$\W32X86\2\IR5000sg.xpd]         Configfile: [\\10.160.50.8\print$\W32X86\2\cns3gui.dll]         Helpfile: [\\10.160.50.8\print$\W32X86\2\cns3g.hlp]          Dependentfiles: [\\10.160.50.8\print$\W32X86\2\AUCPLMNT.DLL]         Dependentfiles: [\\10.160.50.8\print$\W32X86\2\aussdrv.dll]         Dependentfiles: [\\10.160.50.8\print$\W32X86\2\cnspdc.dll]         Dependentfiles: [\\10.160.50.8\print$\W32X86\2\aussapi.dat]         Dependentfiles: [\\10.160.50.8\print$\W32X86\2\cns3407.dll]         Dependentfiles: [\\10.160.50.8\print$\W32X86\2\CnS3G.cnt]         Dependentfiles: [\\10.160.50.8\print$\W32X86\2\NBAPI.DLL]         Dependentfiles: [\\10.160.50.8\print$\W32X86\2\NBIPC.DLL]         Dependentfiles: [\\10.160.50.8\print$\W32X86\2\cns3gum.dll]          Monitorname: [CPCA Language Monitor2]         Defaultdatatype: []

もしも“バージョン 2”ファイルと“バージョン 3”ファイルを異なったテキストファイルに書き込み、その結果を比較すると以下のようになる:

    root# sdiff 2-files 3-files cns3g.dll                     cns3g.dll iR8500sg.xpd                  iR8500sg.xpd cns3gui.dll                   cns3gui.dll cns3g.hlp                     cns3g.hlp AUCPLMNT.DLL                | aucplmNT.dll                             > ucs32p.dll                             > tnl32.dll aussdrv.dll                   aussdrv.dll cnspdc.dll                    cnspdc.dll aussapi.dat                   aussapi.dat cns3407.dll                   cns3407.dll CnS3G.cnt                     CnS3G.cnt NBAPI.DLL                     NBAPI.DLL NBIPC.DLL                     NBIPC.DLL cns3gum.dll                 | cpcview.exe                             > cpcdspl.exe                              > cpcqm.exe                             > cpcspl.dll                             > cfine32.dll                             > cpcr407.dll                             > Cpcqm407.hlp                             > cpcqm407.cnt                             > cns3ggr.dll

だまされてはいけない!各バージョン用の、同一の名前のドライバファイルは、サイズを比較して分かるように、その内容が異なっているかもしれない:

    root# for i in cns3g.hlp cns3gui.dll cns3g.dll; do                  \           smbclient //10.160.50.8/print\$ -U 'Administrator%xxxx' \           -c "cd W32X86/3; dir $i; cd .. ; cd 2; dir $i";      \		   done  CNS3G.HLP               A   122981  Thu May 30 02:31:00 2002  CNS3G.HLP               A    99948  Thu May 30 02:31:00 2002  CNS3GUI.DLL             A  1805824  Thu May 30 02:31:00 2002  CNS3GUI.DLL             A  1785344  Thu May 30 02:31:00 2002  CNS3G.DLL               A  1145088  Thu May 30 02:31:00 2002  CNS3G.DLL               A    15872  Thu May 30 02:31:00 2002

多くの例では、上記の例よりももっと違っている。結論:各ドライババージョン用の正しいドライバファイルを注意深く選択しなければならない。名前だけに頼っても、異なったドライババージョンに属するファイルを交換してもいけない。

### Sambaとプリンタポート

Windows NT/2000印刷サーバは各プリンタに対してポートを結びつける。これらは通常、`LPT1:`、`COM1:`、`FILE:`のような形式である。Sambaもプリンタに結びついたポートという概念をサポートせねばならない。既定値では、システム上“Sambaプリンタポート”という名前の1つのプリンタポートのみが存在する。Sambaは印刷するために、“ポート”のようなものは実際に必要はしていない。むしろ、これはWindowsクライアントの要求である。この情報を要求する時、有効なポートについて告知されることを強く要求する。それ以外だとエラーメッセージを表示する。そのため、SambaはWindowsクライアントに支障がないよう、ポート情報を偽装する。

Sambaは内部的に同等の`プリンタプーリング`という概念をサポートしていない。プリンタプーリングは論理プリンタを複数のポートに、ロードバランシングかフェイルオーバのように割り当てるものである。

もしも何らかの理由か、他の理由で(Sambaでそういうことが出来るか、ユーザと管理者は知るべきではないが)複数のポートを定義する要望がある場合、システム上のポートの一覧を生成する外部プログラムを定義するために使えるenumports commandを設定する。

### 共通クライアントドライバの間違った設定の防止

印刷はうまくいっているが、まだ問題がある。ほとんどのジョブの印刷はうまくいくが、いくつかは全く印刷できない。いくつかのジョブはうまくいっていないように見えるフォントの問題を抱えている。いくつかのジョブは速やかに印刷するが、いくつかはとても遅い。それら全部について触れることは出来ないが、CUPSによる印刷の章の“間違ったPostscriptドライバ設定の防止”、クライアント上の危険なPostscriptドライバ設定の防止の短い節を読むことを推奨する。

## Imprintsツールセット

ImprintsツールセットはWindows NT APWの同等品をUNIXで提供する。完全な情報は、Imprintsのソースディストリビューションを含むドキュメントがある、ImprintsのWebサイトを参照してほしい。この節は、Imprintsの機能について簡単な紹介を提供するのみ行う。

不幸にも、Imprintsツールセットはもはやメンテナンスされていない。2000年12月からプロジェクトは新しいメンテナを必要としている。持つべきスキルのうち最も重要なものはPerlのコーディングとSambaで使うMS-RPCベースの印刷についての興味である。もしもボランティアを希望するならば、Sambaテクニカルメーリングリストで希望を調整してほしい。ツールセットはいまだに便利であるが、使うために準備されているパッケージは古いプリンタモジュールに対してのもののみである。Imprintsが持つべきであるならば、より更新されたプリンタドライバのパッケージが必要である。Imprintsにツールセットに関する情報はImprintsホームページから得ることが出来る。

### Imprintsとは何か?

Imprintsは以下をサポートするためのツールの集合体である:

- Windows NTと 95/98プリンタドライバパッケージに関連する集中した情報のリポジトリを提供する。

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

- 中央のインターネット(又はイントラネット)Imprintsサーバリポジトリからプリンタドライバを 得、リモートのSambaとWindows NT印刷サーバ上にそれをインストールする事を提供する。

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

プリンタドライバパッケージの作成手順はこのドキュメントの範囲外である(より詳細は、Sambaのディストリビューションに含まれているImprints.txtを参照)。簡単に言うと、Imprintsドライバパッケージは、ドライバファイル、関連するINFファイルとクライアントがインストールするのに必要な制御ファイルを含む、gzipされたtar形式ファイルである。

### Imprintsサーバ

Imprintsサーバは、実際には、標準HTTPメカニズム経由で問い合わせを受けることが出来るデータベースサーバである。データベース中の各プリンタエントリは、実際にダウンロードするパッケージを示すURLに関連づけられている。各パッケージは、実際にダウンロードしたものが、Imprintsデータベース中で参照されるものかどうかを検査できるよう、GnuPGを使ってデジタル署名されている。このセキュリティ検査を無効にしないことを強く推奨する。

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

Imprintsクライアントに関連するさらなる情報は、Imprintsソースパッケージ中にある、`Imprints-Client-HOWTO.ps`という文書ファイルに書いてある。Imprintsクライアントインストールは以下の2つの形式がある:

- コマンドラインPerlスクリプト一式。

- コマンドラインPerlスクリプトへのGTK+ベースのグラフィカルインタフェース

(両方の形式による)クライアントのインストールは、リモートSambaとWindows NTプリントサーバ上へのダウンロードとドライバのインストールという意味と同じような、既存のプリンタモデル名の一致リストのための、Imprintsデータベースサーバに問い合わせる手段を提供する。

基本的なインストール手順は4つのステップがあり、Perlコードはsmbclientとrpcclientを包みこんでいる。

- 与えられたドライバがサポートする各アーキテクチャに対して:

  1. rpcclient: リモートサーバ上の適切なアップロードディレクトリを取得する。

  2. smbclient: ドライバファイルをアップロードする。

  3. rpcclient: AddPrinterDriver() MS-RPCを発行する。

- rpcclient: 実際にプリンタの作成を行うためにAddPrinterEx() MS-RPCを発行する。

Imprintsツールセットを実装するときに発生した問題の1つは、数多くサポートされているクライアントアーキテクチャ間での名前空間の問題であった。例えば、Windows NTには“Apple LaserWriter II NTX v51.8”という名前のドライバを含んでいるが、Windows 95はこのドライバの対応するバージョン“Apple LaserWriter II NTX”を呼び出す。

問題は、プリンタに対してどんなクライアントドライバをアップロードするかということをどのようにして知るかと言うことである。抜け目がない読者は、Windows NTのプリンタプロパティのダイアログのみが、そのプリンタドライバ名に空白を含んでいることを覚えているだろう。下記のWindows NT 4.0システムレジストリを簡単に見てみると、

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

これは、Windows NTが常時 NTドライバ名を使うことを明白にしている。これは、Windows NTが少なくともWindows NTバージョンのプリンタドライバが存在することを常時要求しているので問題はない。Sambaは内部的にはそれを要求しない。そのため、“すでにインストールされていないのに、なぜNTドライバ名を使うことが出来るのか?”という疑問が生じるだろう。

この限界を回避する方法は、すべてのImprintsドライバパッケージがIntel Windows NTと95/98プリンタドライバを含み、そのNTドライバが最初にインストールされることを要求することである。

## ユーザによるインストールなしにネットワークプリンタを追加する

以下のMS Knowledgeベースの記事は、Windows 2000クライアントを扱う必要がある場合に何らかの手助けになるかもしれない。ユーザーによる操作なしで Windows にプリンタを追加する方法(Microsoft KB 189105(日本語))。これは又Windows XP Professionalクライアントにも適用できる。この節で示すアイデアの概要は、ネットワークとローカルプリンタとそのドライバをインストールするために適用できるコマンドライン手法を説明するこの記事によって触発されたものである。これは、ログオンスクリプトと統合すると最も便利である。コマンドプロンプト(`DOSプロンプト`)で以下のようにタイプすることにより、どのようなオプションが有効かを見ることができる:

`rundll32 printui.dll,PrintUIEntry /?`

すべての有効なコマンドラインスイッチを表示するウィンドウがポップアップする。 大規模な例題リストも提供される。これは、Windows 200x/XPのみである。Windows NT上では動作しない。Windows NTはそれぞれねリソースキット内である種の他のツールをおそらく持っている。各行が実際に何をするかについての簡単な説明がある、クライアントログオンスクリプトが含んでも良いかもしれないものについての助言は以下の通り(これはSamba経由で200x/XP Windowsクライアントがプリンタにアクセスする場合に動作し、さらに、Windowsベースのプリンタでも同様である)。

    rundll32 printui.dll,PrintUIEntry /dn /n "\\cupsserver\infotec2105-IPDS" /qrundll32 printui.dll,PrintUIEntry /in /n "\\cupsserver\infotec2105-PS"rundll32 printui.dll,PrintUIEntry /y /n "\\cupsserver\infotec2105-PS"

コマンドラインパラメータで使われるパラメータの一覧である:

/dn

  ネットワークプリンタを削除する。

/q

  表示を抑制する。

/n

  プリンタに名前を付ける。

/in

  ネットワークプリンタ接続を追加する。

/y

  プリンタを既定値のプリンタにする。

- 1行目ではinfotec2105-IPDSという以前に存在していた可能性の あるネットワークプリンタを削除する(CUPSに変換された、サーバから削除されたLPRngの ネイティブなWindowsドライバで使われていた)。終わりにある`/q` は、ポップアップする確認あるいはエラーダイアログボックスを抑制する。これらは ユーザログオンについては提供されない。

- 2行目では、新しいプリンタinfotec2105-PS(実際には同じ物理 デバイスであるが、新しいCUPS印刷システムによって動作し、CUPS/Adobe PSドライバ と関連づけられる)を追加する。プリンタとそのドライバはユーザのログインに先立って 追加されねばならない(すなわち、この章の前の方で説明した手順か、 `cupsaddsmb`を動かすことによって)。ドライバはユーザがログイン しようとしているときに、クライアントPCに自動的にダウンロードされる。

- 3行目では、この新しいネットワークプリンタを既定値のプリンタに設定する(この方法を 使っていくつかのプリンタが存在するかもしれなく、また、そのうちのいくつかは同じ ようにローカルであってもよいので、既定値のプリンタを決める事が必要となる)。 既定値のプリンタの選択は、もちろん、異なったユーザでは異なっても良い。

2番目の行は、もしもプリンタinfotec2105-PSがすでに`cupsserver`上のプリントキューで動作していて、もしもプリンタドライバがSambaのドライバリポジトリである`[print$]`中に、すでにきちんとアップロード(`APW`, `smbclient/rpcclient`か`cupsaddsmb`経由で)されている場合にのみ動作する。バージョン3.0より前のある種のSambaのバージョンでは、プリンタインストール後とドライバアップロード後にsmbdの再起動を要求する。そうでないと、スクリプト(かその他のルライアンとドライバダウンロード)は失敗する。

ログオンスクリプトからの、インストールされたネットワークプリンタの存在をテストする簡単な方法は無いので、わざわざ調べる必要はない。ユーザログイン時に毎回インストールの削除/再インストールが出来るようにしておくこと。それはとても短時間である(1から2秒くらい)。

ほかにこの件に関する有用な情報は以下の通り:

- 全部のユーザログイン時に自動的に、任意のプリンタ既定値の設定変更を適切に設定する。

- 異なったワークステーションからドメインにユーザが“ローミング”でログイン出来るようにする。

各ユーザ毎にネットワークプリンタがインストールされるので、これにより、インストールの最新性を保持する作業をより単純化する。ログイン時に数秒余計にかけることはほとんど目立たないだろう。プリンタは、クライアントからユーザが介入する必要性なしにサーバ上で集中して追加、変更と削除ができる(ログインスクリプトは最新性を保持する必要はある)。

## `addprinter`コマンド

`addprinter`コマンドはSambaによって実行されるシェルスクリプトかプログラムとして設定できる。これはSambaプリントサーバに対してクライアントからAPWを走らせることによって起動される。APWはユーザにいくつかのフィールドを埋めることを要求する(それはたとえばプリンタ名、使用するドライバ、コメント、ポートモニタなど)。これらのパラメータはAPWによってSamba上に渡される。もしも、addprinterコマンドが新しいプリンタを作成できるように(旧式のシステム上で、適切なprintcapエントリを書くか、より新しいシステム上で`lpadmin`コマンドを実行することによって)と、それに関連する共有を作成するように設計されていた場合、APWはSamba上とUNIX印刷システム上に、結果として新しいプリンタを作る!

## 旧式の印刷システムの、Sambaへの移行

基本的なNT形式のプリンタドライバ管理は2.2.xリリースから3.0ではほとんど変更はなかった(小さな改善はたくさん適用されたが)。特に、設定中で廃止されるパラメータを使うのをやめる、前述の助言に従うならば、移行はとても簡単である。既存の2.0.x設定か、Samba 2.2でWindows 9x/Me形式の印刷形式を継続したいのであれば、それはもっと努力が必要となる。適切なリリースノートとSamba-2.2.xのHOWTO文書を読んでほしい。以下のいくつかの方法に沿うことが出来る。移行のための可能なシナリオは以下の通り:

- 新しい Windows NTプリンタとドライバサポートについて学習し、使う必要がある。以前 使っていたパラメータ`printer driver file`, `printer driver`と`printer driver location` はもはやサポートされない。

- もしもWindows NTプリンタドライバサポートを利用したいのであれば、新しい設定の ために、Windows 9x/Meドライバを新しいものへ移行する必要がある。

- 存在する`printers.def`ファイル(削除されたパラメータ `printer driver file`中で指定されているもの)はもはやSamba-3 では動作しないので、smbdは`[print$]`中とTDBファイル中の 追加の設定だけで、プリンタのためのWindows 9x/Meドライバファイルを捜そうとする。 もしもそれが失敗すると、(2.2.xが使うように)`printers.def` (とすべての関連するパラメータ)を使うようにはならない。 make_printerdefツールは削除され、これに関する下位互換性はない。

- 使用しているSambaホスト上のプリンタ用の `[print$]`共有中にWindows 9x/Meドライバをインストールする 必要がある。ドライバファイルは`[print$]`の “WIN40/0”サブディレクトリ中に格納され、その他の設定と情報は印刷 関連のTDBファイル中に格納される。

- もしも、存在する`printers.def`ファイルを新しい設定中に移行 したいならば、現在唯一の解は、NTドライバと9x/Meドライバをインストールするために、 Windows NT APWを使うことである。これはsmbclientとrpcclientを使うスクリプトで 行える。その例は、 Imprints のWebサイト上にあるImprintsクライアントインストールを参照。また、 CUPS 印刷環境中のrpcclientの使用法についての 議論も参照のこと。

## Active DirectoryかLDAPへのプリンタ情報の公開

この件に関しては、リモートとローカル管理Netコマンドでも触れられている。もしもこの機能に関しての文書の更新をボランティアとして手助けしてくれるのであれば、John H. Terpstraに連絡をしてほしい。

## よくあるエラー

### rootパスワードを指定したが、アクセスできない

UNIXシステムで有効な(とほとんどの場合、`/etc/shadow`というファイルに1方向ハッシュ形式として格納される)rootパスワードと、Samba認証時に使うパスワードと混同しないこと。SambaはUNIXパスワードを知らない。Sambaリソースへのrootアクセスは最初に作成されなければならないSamba用のrootアカウントを必要とする。これは以下のように、`smbpasswd`を使って行える:

    root#  smbpasswd -a rootNew SMB password: secretRetype new SMB password: secret

### 印刷ジョブはスプールディレクトリに入ったが、その後なくなった

存在するUNIX印刷システムスプールディレクトリをSambaスプールディレクトリに使ってはならない。それは、簡単で場所を節約できるように見えるが、これは問題を引き起こす。2つは分離せねばならない。UNIX/Linuxシステムプリントスプールディレクトリ(すなわち`/var/spool/cups`)は通常`cups`や`lp`のような非特権ユーザによって所有される。さらに追加で、スプールディレクトリのパーミッションは、通常所有者とグループに対して制約されている。別の言い方をすると、Sambaスプールディレクトリは全員に対して書き込み可能で、一時スプールファイルの所有者のみがファイルを変更したり削除できるようにする、't'ビットを設定すべきである。

UNIX/Linuxホスト上で使う印刷スプールシステムのタイプに依存するので、スプール管理アプリが見つける、管理されているジョブキューの一部でないファイルは削除される。これは、ジョブが(Sambaによって)このディレクトリ中にスプールされて消えてしまう現象の説明になるだろう。

Prev | Up | Next
Chapter 20. Microsoft 分散ファイルシステムツリーのホスティング | Home | Chapter 22. CUPS印刷環境のサポート