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

Kurt Pfeifle

Danka Deutschland GmbH

Gerald (Jerry) Carter

Samba Team

John H. Terpstra

Samba Team

May 31, 2003

Table of Contents

機能と利便性
技術的な序論
クライアントからSambaへの印刷ジョブの処理
印刷に関連する設定パラメータ
簡単な印刷設定
testparmによる設定の検査
手っ取り早い設定の検証
拡張印刷設定
設定の説明詳細
Samba-2.2からの印刷環境
Sambaサーバ上でのポイントアンドプリントによるクライアントドライバ
無効になった [printer$]セクション
[print$]共有の作成
[print$]セクションのパラメータ
[print$]共有ディレクトリ
[print$]へのドライバのインストール
プリンタの追加ウィザードによるドライバのインストール
rpcclientを使った印刷ドライバのインストール
クライアントドライバのインストール方法
最初のクライアントドライバインストール
新しいプリンタに対するデバイスモードの設定
追加のクライアントドライバインストール
常時最初のクライアントからの接続はrootかprinter adminで行う
その他のテクニック
クライアントドライバのための既定値の印刷操作の設定
大量のプリンタのサポート
Windows NT APWによる新しいプリンタの追加
エラーメッセージ: 異なった名前で接続できない
ドライバファイルを集めるときに気をつけること
Sambaとプリンタポート
共通クライアントドライバの間違った設定の防止
Imprintsツールセット
Imprintsとは何か?
プリンタドライバパッケージの作成
Imprintsサーバ
クライアントのインストール
ユーザによるインストールなしにネットワークプリンタを追加する
addprinterコマンド
旧式の印刷システムの、Sambaへの移行
Active DirectoryかLDAPへのプリンタ情報の公開
よくあるエラー
rootパスワードを指定したが、アクセスできない
印刷ジョブはスプールディレクトリに入ったが、その後なくなった

機能と利便性

印刷はユーザに取ってしばしばミッションクリティカルなサービスである。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/NoTrue/Falseを使うことも出来る。名前のリストは、カンマ、空白か タブで分離できる。

testparmによる設定の検査

暗黙で使えるものを含む、Samba中で印刷に関連したすべての(あるいはほとんど全部)を見る ためには、以下で概要を説明しているコマンドを使う。このコマンドは testparmの出力中に現れるすべての lpprintspooldriver, 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サーバ上で有効なドライバがインストールされているプリント共有 では(yestrueを設定して) 決して有効にしてはならない。より詳細な説明は、 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 allowhosts 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パラメータの設定に依存して変わる。 既定値の印刷設定に一覧があるコマンド中で、 Xp,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|plplpq コマンドはlpq -P%p
printing = sysv|hpuxlpq コマンドはlpstat -o%p
printing = qnxlpq コマンドはlpq -P%p
printing = bsd|aix|lprng|plplprm コマンドはlprm -P%p %j
printing = sysv|hpuxlprm コマンドはcancel %p-%j
printing = qnxlprm コマンドはcancel %p-%j
printing = bsd|aix|lprng|plplppause コマンドはlp -i %p-%j -H hold
printing = sysv|hpuxlppause コマンド(...は存在しない)
printing = qnxlppause コマンド(...は存在しない)
printing = bsd|aix|lprng|plplpresume コマンドはlp -i %p-%j -H resume
printing = sysv|hpuxlpresume コマンド(...は存在しない)
printing = qnxlpresume コマンド(...は存在しない)

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ツールセットを使う。

  • smbclientrpcclientコマンド行ツールを使う。

  • 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を、種々のサブコマンド (adddriversetdriverなど)を組み合わせて 使う。

  • 任意の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 ユーティリティによって提供される。enumdriversgetdriverサブコマンドを指定し、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_XP
cmd = 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.0
Got 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? n
Get file Hddm91c1_de.def? y
getting file \W32X86\2\Hddm91c1_de.def of size 428 as Hddm91c1_de.def
Get file Hddm91c1_de.DLL? y
getting 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.0
Got 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.DLL
putting file Hddm91c1_de.ppd as \W32X86\Hddm91c1_de.ppd
putting file HDNIS01U_de.DLL as \W32X86\HDNIS01U_de.DLL
putting file HDNIS01U_de.HLP as \W32X86\HDNIS01U_de.HLP
putting file Hddm91c1_de.DLL as \W32X86\Hddm91c1_de.DLL
putting file Hddm91c1_de.INI as \W32X86\Hddm91c1_de.INI
putting file Hddm91c1KMMin.DLL as \W32X86\Hddm91c1KMMin.DLL
putting file Hddm91c1_de.dat as \W32X86\Hddm91c1_de.dat
putting file Hddm91c1_de.dat as \W32X86\Hddm91c1_de.dat
putting file Hddm91c1_de.def as \W32X86\Hddm91c1_de.def
putting file Hddm91c1_de.hre as \W32X86\Hddm91c1_de.hre
putting file Hddm91c1_de.vnd as \W32X86\Hddm91c1_de.vnd
putting file Hddm91c1_de.hlp as \W32X86\Hddm91c1_de.hlp
putting file Hddm91c1_de_reg.HLP as \W32X86\Hddm91c1_de_reg.HLP
putting file HDNIS01Aux.dll as \W32X86\HDNIS01Aux.dll
putting file HDNIS01_de.NTF as \W32X86\HDNIS01_de.NTF

ヒュー;これはとても大量なタイプ量である!ほとんどのドライバはより小さい。多くはたった 3つの汎用Postscriptドライバファイルと1つのPPDのみを持つ。Windowsマシンからの W32X862サブディレクトリからファイルを検索した 時、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.0
Got 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 2003
2                                   D        0  Sun May  4 03:56:18 2003
HDNIS01Aux.dll                      A    15356  Sun May  4 03:58:59 2003
Hddm91c1KMMin.DLL                   A    46966  Sun May  4 03:58:59 2003
HDNIS01_de.DLL                      A   434400  Sun May  4 03:58:59 2003
HDNIS01_de.NTF                      A   790404  Sun May  4 03:56:35 2003
Hddm91c1_de.DLL                     A   876544  Sun May  4 03:58:59 2003
Hddm91c1_de.INI                     A      101  Sun May  4 03:58:59 2003
Hddm91c1_de.dat                     A     5044  Sun May  4 03:58:59 2003
Hddm91c1_de.def                     A      428  Sun May  4 03:58:59 2003
Hddm91c1_de.hlp                     A    37699  Sun May  4 03:58:59 2003
Hddm91c1_de.hre                     A   323584  Sun May  4 03:58:59 2003
Hddm91c1_de.ppd                     A    26373  Sun May  4 03:58:59 2003
Hddm91c1_de.vnd                     A    45056  Sun May  4 03:58:59 2003
HDNIS01U_de.DLL                     A   165888  Sun May  4 03:58:59 2003
HDNIS01U_de.HLP                     A    19770  Sun May  4 03:58:59 2003
Hddm91c1_de_reg.HLP                 A   228417  Sun May  4 03:58:59 2003
              40976 blocks of size 262144. 709 blocks available

Current directory is \\SAMBA-CUPS\print$\W32X86\2\
.                                  D        0  Sun May  4 03:56:18 2003
..                                 D        0  Sun May  4 03:56:35 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
              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-CUPS

cmd = 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 mydrivername

Successfully set dm9110 to driver mydrivername.

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

root# rpcclient -U'root%xxxx' -c 'setdriver dm9110 dm9110' SAMBA-CUPS
 cmd = setdriver dm9110 dm9110
Successfully 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を繰り返し実行する必要なしに) rpcclientsetprinterサブコマンドを繰り返す必要が ある。以下はどのようにこれを達成するかの例である:

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" /q
rundll32 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/rpcclientcupsaddsmb経由で) されている場合にのみ動作する。バージョン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 driverprinter 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 root
New SMB password: secret
Retype new SMB password: secret

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

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

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