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によって)このディレクトリ中にスプールされて消えてしまう現象の 説明になるだろう。