Table of Contents
印刷はユーザに取ってしばしばミッションクリティカルなサービスである。Sambaは、Windows ワークステーションからなるクライアントネットワークのために、信頼性があり、シームレスなこのサービスを提供出来る。
Samba印刷サービスは、ファイルサービス機能と並列に、あるいは専用のサーバ上で、スタンドアロンかドメインメンバサーバで動かす事が出来る。これは、必要に応じて強力に、あるいは比較的穏やかにセキュアにすることが出来る。設定は簡単になることも複雑になることもある。有効な認証スキームは、以前の章にあるようなファイルサービス用に説明されたのと基本的に同じである。全体的に、現在、Sambaの印刷サポートは、多くの場合、付加機能を付けた上で、Windows NTまたはWindows2000印刷サーバと完全に対等で、置き換えることが出来る。クライアントはクライアント上でなじみのあるポイント アンド プリント
メカニズムを通して、ドライバをダウンロードし、プリンタをインストールできる。ログオンスクリプト
で実行されるプリンタのインストールは何の問題もない。管理者はおなじみのプリンタ追加ウィザード
を使ってクライアントで使うことによって、ドライバのアップロードと管理ができる。更に追加の便利な機能としては、ドライバとプリンタ管理はコマンド行かスクリプトを通して実行でき、これは、大量のプリンタがある場合により効率的である。もしも、集中した印刷ジョブの利用状況管理(訳注:原文はaccount)(すべての単一ページの追跡といろいろな統計レポートに生データを供給すること)が必要とされる場合、この機能は、Sambaサーバ下の印刷サブシステムとして、新しい共通UNIX印刷システム(CUPS)によって最もよくサポートされている。
この章では、より現代的なUNIXのBSDとSystem V形式の印刷システムによって実装された、Sambaの印刷機能の基礎を概観する。この章中の情報の大多数はCUPSにも適用出来る。もしもCUPSを使っているならば、次の章に飛んでも良いが、すべきことのうち少なくともいくつかはきっと取りこぼすだろう。さらなる情報は、CUPS 印刷環境を参照のこと。
Sambaの印刷サポートは、常時それが動作しているUNIX OS上の、インストールされている印刷サブシステム上に依存している。Sambaは仲介者
である。Windows(か他のSMB)クライアントから印刷ファイルを受け取り、それをさらなる処理のために実際の印刷システムに渡す。そのため、両方に接続する必要がある。すなわち、Windows印刷クライアントとUNIX印刷システムである。それゆえ、異なった機能と異なった形でアクセスされる、種々のUNIX印刷サブシステムと同様、おのおのが異なって振る舞う種々のクライアントOSの間での違いを認める必要がある。
この章では伝統的なUNIX印刷方式について取り扱う。次の章では、より最新のCUPSについて、より詳しく説明する。
現在、Samba管理の側面において、最も問題があることの一つは印刷の設定であることは、Sambaメーリングリスト上で投稿されたことでも明らかである。多くの新しいSamba管理者は、Sambaがある種の印刷処理を実行しているというような印象を持っている。保証するが、Sambaは何らの印刷処理をも実行しない。何らの印刷フィルタリングも行わない。
Sambaは、ローカルスプール領域にスプールされる、クライアントからデータストリーム(印刷ジョブ)を受け取る。印刷ジョブ全部を受け取ると、SambaはローカルのUNIX/Linux印刷コマンドを起動し、それに対してスプールされたファイルを渡す。それはローカルの印刷サブシステムを起動し、正しく印刷ジョブを処理し、プリンタに対してデータを渡す。
Sambaサーバ経由でWindowsクライアントからUNIXプリンタへの印刷がうまくいくためには、6つ(潜在的には7つ)のステージがある:
プリンタ共有に対してWindowsがコネクションをオープンする。
Sambaはユーザを認証しなければならない。
Windowsがネットワーク経由でSambaのスプール領域に印刷ファイルの コピーを送る。
Windowsはコネクションをクローズする。
Sambaは、UNIX印刷サブシステムの印刷領域経由でファイルを扱う ために印刷コマンドを起動する。
UNIX印刷サブシステムが印刷ジョブを処理する。
印刷ファイルはSambaスプール領域から明示的に削除される必要がある。 これの要素は使用しているマシンのプリントスプーラの構成の設定に依存する。
Sambaの印刷動作を制御するための設定パラメータは多数ある。それらの概要についてはsmb.conf
のマニュアルページを参照してほしい。他のパラメータと同様、グローバルレベル(一覧上でGとタグが付いているもの)とサービスレベル(S)パラメータがある。
これらは明示的に共有定義に記述しなくても良い。 もしもエラーになったならば、(もしも動作させたならば)testparm
ユーティリティでそれを見つけることが出来、そのことを表示する。
これらはsmb.conf
中の[global]
セクションで指定しても良い。この場合、個人毎すべてかサービスレベルの 共有の既定値の動作を定義する(同じパラメータに対して異なった設定の定義を を持たない形で提供されるので、グローバルの既定値を上書きする)。
BSD印刷環境での簡単な設定は、簡単な印刷の設定を示している。もしも現在使っている環境と比較して、OSベンダによってあらかじめ設定されている追加のパラメータを見つけるかもしれない。以下は、パラメータについての議論と説明である。この例は多くのパラメータを使っていない。しかし、多くの環境において、すべてのクライアントに対して印刷を有効にする有効なsmb.conf
ファイルを提供するためには、これは十分である。
これは単に例としての設定である。Sambaはすべての設定パラメータに対して既定値を割り当てている。既定値は保守的でかつ賢明な値となっている。パラメータがsmb.conf
ファイル中で指定されたならば、それは既定値を上書きする。rootでtestparm
ユーティリティを実行すると、smb.conf
ファイルの設定のように両方の既定値とすべての設定を報告する機能がある。Testparm
は間違った設定のすべてに対して警告を表示する。完全な出力は360行を軽く超えるので、その結果をページャプログラムに渡しても良いだろう。
設定ファイルの文法は理解するのが簡単である。その文法について細かいことを知らなくてもよい。この文書のどこかで説明されているが、Sambaはある種の綴りミスには寛容であり(たとえば、browsableの代わりにbrowseableなど)、綴りは大文字小文字を無視する。論理値に対して、Yes/No
かTrue/False
を使うことも出来る。名前のリストは、カンマ、空白かタブで分離できる。
暗黙で使えるものを含む、Samba中で印刷に関連したすべての(あるいはほとんど全部)を見るためには、以下で概要を説明しているコマンドを使う。このコマンドはtestparm
の出力中に現れるすべてのlp
、print
、spool
、driver
,ports
と[
を検出する。これは、動作しているsmbd
の印刷設定の簡便な概要を提供する。このコマンドは個別に作成されたプリンタ共有かそれが使えるスプールパスを表示しない。上記の例で示される設定で設定したSambaの出力は以下のようになる:
root#
testparm -s -v | egrep "(lp|print|spool|driver|ports|\[)"
Load smb config files from /etc/samba/smb.conf Processing section "[homes]" Processing section "[printers]" [global] smb ports = 139 445 lpq cache time = 10 load printers = Yes printcap name = /etc/printcap disable spoolss = No enumports command = addprinter command = deleteprinter command = show add printer wizard = Yes os2 driver map = printer admin = min print space = 0 max print jobs = 1000 printable = No printing = bsd print command = lpr -r -P'%p' %s lpq command = lpq -P'%p' lprm command = lprm -P'%p' %j lppause command = lpresume command = printer name = use client driver = No [homes] [printers] path = /var/spool/samba printable = Yes
Sambaの既定値の動作によって暗黙で追加される設定を検査するのは簡単である。確認:Sambaの将来の関係で重要かもしれない。
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印刷環境設定
これは設定の例である。OSベンダによって提供されている設定ファイル中でのすべての設定はここにはない。明示的に設定されていないSamba設定パラメータは、既定値で賢明な値に設定されている。すべての設定を見るには、root
になり、testparm
ユーティリティを使う。testparm
は設定の間違いを指摘する。
以下は拡張BSD印刷環境の設定についての議論である。
[global]
セクションは4つの特別なセクションの1つであり(残りは[homes]
, [printers]
と [print$]
)、これらはサーバ全体に適用されるすべてのパラメータを含んでいる。ここにはグローバルな意味を持つパラメータのみが配置される。すべての他のセクションと共有に対しての既定値の設定を定義する、サービスレベルのパラメータを含むこともできる。この方法は設定を簡単化し、同じ値を繰り返し設定することを防ぐ(設定できる個別のセクションか共有内で行えるが、グローバルに設定した共有の設定と他の値の指定を上書きする)。
BSD(RFC 1179形式かLPR/LPD)として知られてもいる)BSDのために適用出来る Sambaが使う既定値の印刷コマンドを指定する。一般的に、 printing
パラメータは、仮定している印刷サブシステム をSambaに告げる。SambaはCUPS, LPD, LPRNG, SYSV, HPUX, AIX, QNXと PLPを サポートしている。各システムは異なったprint command (と他のキュー制御コマンド)を既定値としている。
printingパラメータは通常サービスレベルの パラメータである。[global]
セクション中のここに 含まれた後、異なった設定をしていないすべてのプリンタ共有に効果が及ぶ。 Samba-3はもはやSOFTQ印刷サービスをサポートしない。
Sambaにすべての有効なプリンタ共有を自動的に作成させる。有効なプリンタ 共有はprintcapファイルをスキャンすることで調べる。作成されたすべての プリンタ共有はブラウジングでも表示される。もしもこのパラメータを使う 場合、各プリンタ毎に分割する必要はない。自動的に作成されたプリンタ 共有のおのおのは、[printers]
セクション中に ある設定オプションの設定の複製である (load printers = no
の設定は、 誰でも見えて使えるようにしたくないいくつかのものをする(leaving out)、 各UNIXプリンタを指定できるようにする)。
設定は通常既定値によって有効になっている(たとえパラメータがsmb.conf
中で指定されていなくても)。これは、Sambaホストの共有リストの中での プリンタフォルダ中に プリンタ追加ウィザードが出る原因である( ネットワークコンピュータか net view
コマンドで見られる)。これを無効にするには、 明示的にno
と設定する必要がある(コメントアウトは 十分ではない)。プリンタ追加ウィザード
は [print$]
共有にプリンタドライバをアップロード させ、それをプリンタに関連づけるか(もしもそれぞれのキューが動作の前に 存在するならば)、以前にアップロードされたドライバとプリンタドライバを 交換する)。
ある時間にSambaサーバ上で有効な印刷ジョブを最大100までに設定する。この数よりも 大きなジョブをクライアントが投稿すると、"サーバ上に容量がありません"という エラーメッセージがSambaサーバからクライアントに返す。ゼロという設定(既定値) は全く制限がない事を意味する。
Sambaに有効なプリンタ名ののリストがどこにあるかを告げる。CUPSを使って いる場合、printcapファイルが書かれているかを確認する。これは cupsd.conf
ファイル中のPrintcap
ディレクティブによって制御される。
ntadminグループメンバはドライバを追加するためとプリンタプロパティを設定することが 出来るようにすべきである(ntadmin
は単なる例としての名前で ある。有効なUNIXグループ名が必要である)。rootは暗黙的にいつでも printer adminである。グループ名の前に付く @
記号は/etc/group
中の名前である。 printer adminは、MS-RPC (Samba-2.2からの印刷環境開発を参照) によって提供されるリモート管理インタフェース経由でプリンタのすべてを操作出来る。 より大きなシステムでは、printer adminパラメータは 通常共有単位に存在するパラメータである。こうすると、各プリンタ共有の管理者に 異なったグループを割り当てる事ができる。
lpqコマンドの結果のキャッシュ時間を制御する。これは、過度にlpqコマンドが 呼ばれる事を防ぎ、高負荷のプリントサーバの負荷を減少させる。
もしもyes
に設定されると、Windows NT/200x/XPクライアント のみに(Windows 95/98/MEには関係ない)影響する。このパラメータの既定値は No
で(あるいはFalse
)である。 これは、Sambaサーバ上で有効なドライバがインストールされているプリント共有 では(yes
かtrue
を設定して) 決して有効にしてはならない。より詳細な説明は、 smb.conf
マニュアルページを参照のこと。
printersセクションは2つめの特別なセクションである。もしもこの名前のセクションがsmb.conf
中に現れると、Samba起動時に、printcapファイル中で見つかるすべてのプリンタ名に対してプリンタ共有を作成するので、ユーザはSambaホスト上のprintcapファイル中で定義されている任意のプリンタに接続できる。このセクションを最低の設定ですべてのプリンタを共有するための、便利なショートカットとして見なすことができる。これはまた、すべてのプリンタに対する既定値として適用すべき設定のためのコンテナでもある(より詳細は、smb.conf
マニュアルページを参照)。この内側にあるコンテナの設定は共有レベルパラメータでなければならない。
commentは、クライアントが ネットワークコンピュータかnet view
コマンド経由でサーバに問い合わせた時、有効な共有一覧を表示する時に、 共有のそばに表示される。
[printers]
サービスはprintableとして 定義されねばならない。もしもそれ以外を指定すると、 smbdは起動時にロードを停止する。このパラメータは、このサービスに対して pathパラメータで指定したディレクトリ中に、 オープン、書き込みとスプールファイルの投稿を、接続したクライアントに 許可する。これは、ファイル共有とプリンタ共有とを区別するために、 Sambaによって使われる。
入力された印刷ファイルをSambaによってスプールするためのディレクトリを 指定しなければならない。UNIX印刷サブシステムの設定中で指定された スプールディレクトリと同じに設定してはならない!パスは通常 stickyビットを設定した、その他に書き込み可能な ディレクトリを指定する。
printable = yesのときは常時 no
に設定する。これは、共有それ自身が、 net view
コマンドか、エクスプローラのブラウズリスト 中で有効な共有の一覧中で不可視にする(もちろん個々のプリンタを見る ことは出来る)。
もしも、このプリンタがyes
に設定されているならば、 印刷サービスに接続する時にパスワードを必要としない。アクセスは、 guest accountの権限で許可される。多くのシステム では、ゲストアカウントは"nobody"という名前にマップされる。このユーザは 通常空白のパスワード尾持つUNIXのpasswdファイルにあるが、UNIXログインは 無効である。いくつかのシステムでは、ゲストアカウントユーザは印刷権限を 持たないかもしれない。su - guest
を使い、以下の システムの印刷コマンドを動かし、使用するシステムのguestユーザ中で ロギングすることでこれをテストする:
lpr -P printername /etc/motd
guest ok = yesの同義語である。 guest ok = yesを設定すると、 これは本当にここにある必要はない(これは “同じ共有に対して2つの矛盾している設定が偶然あるときはどうなるか?” という興味深い質問を導く。答えはSambaが最後に見つけたものが使われる。 testparm
は同じ共有に対して同じパラメータに対する 異なった設定に対しては注意を喚起しない。異なったユーザ名で guest account
パラメータに対して複数の行を 設定することでこれをテストでき、次にtestparmを動作させて、どの行が Sambaによって本当に使われるかを見る事ができる)。
通常(共有の他のタイプのために)サービスのディレクトリ中で、ユーザによる ファイルの作成と変更を防止する。しかし、printable サービス中では、常時ディレクトリへの書き込みが許可 されるが(もしもユーザの権限として接続が許可されているならば)、 それは印刷スプール操作経由でのみである。通常の書き込み操作は許可 されない。
これはread only = yesの同義語である。
もしも、[my_printer_name]
セクションが、printable = yesを含んでsmb.conf
ファイル中にある場合、Sambaはこれをプリンタ共有と見なして設定する。Windows 9x/Meクライアントは、共有名が8文字以上の場合、接続かプリンタドライバのロードで問題が発生するかもしれない。存在するユーザかファイル共有の名前と競合する、プリンタ共有名を付けてはならない。クライアントからの接続時に、Sambaは常時その名前を最初に持つものを見つけようとする。もしもそれが見つかると、これに対して接続を行い、同じ名前を持つプリンタ共有には接続できない!
上記で書いたとおりのコメントである。
このプリンタに対するスプール領域のディレクトリを既定値の代わりに設定する。 これは異なって設定する必要はないが、オプションは有効である。
printer admin定義は、この一般的な[printers]
共有から 明示的に定義されたプリンタ共有と違う。もし要求がなければ、可能であればそれを 表示しない。
これは、クライアントが、ネットワークコンピュータで ブラウズするのが便利なように、プリンタをブラウズ可能にする。
20.4.1.2節を参照。
20.4.1.2節を参照。
hosts allowとhosts deny パラメータを使って特定の数値でのアクセス制御を試す。これは、決して安全な 賭けではない。これは使用しているプリンタをセキュアにする方法ではない。この 行は、最初に評価されるアクセス制御中での特定のサブネットからの、すべての クライアントを許可する。
すべての一覧表示されたホストはここでは許可されない(たとえ許可された サブネットにあったとしても)。見ての通り、NetBIOSホスト名をここに書くのと 同様にIPアドレス名前を付けることが出来る。
このプリンタはゲストアカウントには公開していない。
各セクション(か[printers]
セクション中で)はプリンタを定義し、print command
は定義されるかもしれない。これは、そのプリンタに対するSambaの印刷スプールディレクトリ中に位置するファイルを処理するコマンドを設定する。(もしも覚えているならば、このスプールディレクトリはpathパラメータで設定される)。通常、このコマンドはSambaが動いているホストの印刷サブシステムに、適切なシステムの印刷コマンドを使ってスプールファイルを渡す。しかし、もしもこの必要性に要求がなければ、たぶんそうだろう。デバッグかその他の理由で、ファイルの印刷より何かが完全に異なることを行う事を望んでも良い。例は、プリンティングをデバッグするために必要とする時、さらなる調査のために一時的な場所に印刷ファイルをコピーするだけのコマンドである。もしも、固有の印刷コマンドを作る場合(か印刷コマンドシェルスクリプトの開発)、Sambaスプールディレクトリからファイルを削除する必要があることに注意をはらうこと。そうしないと、すぐにディスクがいっぱいになってしまうだろう。
設定ファイル中で明示的に設定されていない場合、Sambaがほとんどの場合、多くのパラメータについて、内蔵の値を使うということは、以前の説明で理解されているかと思う。print commandでも同じである。既定値の印刷コマンドはprintingパラメータの設定に依存して変わる。既定値の印刷設定に一覧があるコマンド中で、Xがp,s,Jのようなものである、%X形式を持ついくつかのパラメータに気がつくだろう。これらの文字は、それぞれプリンタの名前、スプールファイルとジョブIDを表す。これらは、キーとなる印刷オプションの概要を提供する既定値の印刷設定中に詳細が説明されているが、CUPSの場合は特別で、CUPS印刷サポートで説明があるので、ここに記述はない。
Table 21.1. 既定値の印刷設定
設定 | 既定値の印刷コマンド |
---|---|
printing = bsd|aix|lprng|plp | 印刷コマンドはlpr -r -P%p %s |
printing = sysv|hpux | 印刷コマンドはlp -c -P%p %s; rm %s |
printing = qnx | 印刷コマンドはlp -r -P%p -s %s |
printing = bsd|aix|lprng|plp | lpq コマンドはlpq -P%p |
printing = sysv|hpux | lpq コマンドはlpstat -o%p |
printing = qnx | lpq コマンドはlpq -P%p |
printing = bsd|aix|lprng|plp | lprm コマンドはlprm -P%p %j |
printing = sysv|hpux | lprm コマンドはcancel %p-%j |
printing = qnx | lprm コマンドはcancel %p-%j |
printing = bsd|aix|lprng|plp | lppause コマンドはlp -i %p-%j -H hold |
printing = sysv|hpux | lppause コマンド(...は存在しない) |
printing = qnx | lppause コマンド(...は存在しない) |
printing = bsd|aix|lprng|plp | lpresume コマンドはlp -i %p-%j -H resume |
printing = sysv|hpux | lpresume コマンド(...は存在しない) |
printing = qnx | lpresume コマンド(...は存在しない) |
printing = CUPS
用に、もしもSambaがlibcupsを使うようにコンパイルされたならば、ジョブの投稿にCUPS APIを使用する(通常使わない位置に自動生成されたprintcap ファイルに書き込むために、使用しているシステム中のcupsd.conf
ファイルが設定されている場合、printcap = cupsを設定するのはよい方法である)。ほかの場合は、Sambaは印刷処理のために、-orawオプションを付けて、System Vの印刷コマンドにマップする。これはすなわち、lp -c -d%p -oraw; rm %s
を使うことである。printing = cups
の場合と、もしもSambaがlibcupsを使うようにコンパイルされた場合、手動で設定したprint commandは何であっても無視される!
サービスに対して印刷ジョブのスプーリングが終了後、print commandはスプールファイルを処理するためにsystem()呼び出し経由でSambaによって使われる。通常指定されたコマンドはホストの印刷サブシステムにスプールファイルを投稿する。しかし、これが本当にそうであるというべき要求は全くない。印刷サブシステムはそれ固有のスプールファイルを削除しないかもしれないので、指定したコマンドは何であっても、それが処理された後にスプールファイルは消去されるようにすべきである。
伝統的な印刷システムに対して作成した固有の印刷コマンドを使うことについては何ら違いはない。しかし、固有のものを動かしたくないのであれば(訳注:to roll your own)、各印刷サブシステムに対してSambaが使う既定値の内蔵コマンドについて熟知すべきである(既定値の印刷設定を参照)。最後のパラグラフに一覧表示されているすべてのコマンドには%Xという形式のパラメータがある。これらはマクロかショートカットで、真のオブジェクトの名前のためのプレースフォルダとして使われる。このようなプレースフォルダを使って、コマンドを動かしたとき、Sambaは自動的に適切な値に置き換える。印刷コマンドはすべてのSambaマクロ置換を扱える。印刷に関しては、以下の以下のものは特別に扱われる:
%s, %f
スプールファイル名へのパス。
%p
適切なプリンタ名。
%J
クライアントから送られたジョブ名。
%c
(もしも分かるならば)スプールされたジョブのページ数。
%z
スプールされた印刷ジョブのサイズ(バイト単位)。
印刷コマンドは少なくとも%s
か%f
のどちらか1つを使っている必要がある。%p
の使用は任意である。もしもプリンタ名が指定されないと、%p
は印刷コマンドから何のメッセージもなしに取り去られる。この場合、ジョブは既定値のプリンタに送られる。
[global]
セクション中で指定されると、指定されたprint commandは固有のprint commandを持たない任意の印刷サービスに対して使われる。もしも、印刷サービスのためのprint commandも、グローバルのprint commandも指定されない場合、スプールファイルは作成されるが処理されない!最も重要なことは、印刷ファイルは削除されず、そのため、ディスクスペースを消費してしまうと言うことである。
印刷は、nobodyアカウントを使うとき、ある種のUNIXでは失敗するかもしれない。もしもそのような事態に遭遇したら、代替のゲストアカウントを作成し、印刷権限を付与する。このゲストアカウントを、[global]
セクション中に、guest account
パラメータを使って設定する。
非常に複雑な印刷コマンドを構成することも出来る。印刷コマンドはUNIXシェルに渡されるようにする必要がある。シェルは通常のように指定されている環境変数を展開できる(UNIXの環境変数$variable
を、Sambaの印刷コマンドの中で指定するための形式は%$variable
である)。下記の動作するprint commandの例では、以下は印刷ジョブのログを/tmp/print.log
に取り、ファイルを印刷し、次にそれを削除する。セミコロン(“;”)は通常通り、シェルスクリプト中でのコマンドの分離符号である:
print command = echo Printing %s >> /tmp/print.log; lpr -P %p %s; rm %s |
動作させるシステム上で、通常どのようにファイルを印刷するかに例が依存することを考慮して、固有のコマンドを変更しなければならないかもしれない。既定値のprint commandパラメータは、printingの設定状態に依存して代わる。他の例は下記の通り:
print command = /usr/local/samba/bin/myprintscript %p %s |
Samba-2.2.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を参照のこと)。
スプールされたジョブ情報のための、内部データベースを使用することによる、プリンタ キュー操作のサポートの改善(種々の*.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タイプの古いクライアントは、共有されたプリンタへの印刷のみ出来る)。
このことが意味することについて多くの混乱がある。次のような疑問がしばしば質問される。“Windowsクライアントからの印刷をサポートするためにSambaホスト上にプリンタドライバをインストールすることは必要か否か?”答えは No で不必要である。
もちろん、Windows NT/2000クライアントではドライバをローカルに(次にSambaベースの印刷キューに繋ぎ)インストールするためにそれらのAPWも動かすこともできる。これはWindows 9x/Meクライアントによって使われるのと同じ手法である(しかし、Samba 2.2.0では、プリンタに対する有効なドライバをSambaサーバが処理することをWindows NT/2000クライアントが要求させる、というバグがある。これはSamba 2.2.1で修正されている)。
しかし、これはSambaサーバの[print$]
共有中にプリンタドライバをインストールする新しい機能であり、これはとても便利である。次に、すべてのクライアント(95/98/MEを含む)はこのプリンタ共有に最初に接続した時にインストールされているドライバを入手する。この[print$]
中へのドライバのアップロードまたは供託と、以下の存在するSambaプリンタ共有へ、このドライバを結びつけることは異なった手段で達成できる:
NT/200x/XP Professionalクライアント上でAPWを動かす(これは95/98/MEクライアントでは動かない)。
Imprintsツールセットを使う。
smbclientとrpcclientコマンド行ツールを使う。
cupsaddsmbを使う(CUPS印刷システムのみ動作し、LPR/LPD、LPRngなどでは動かない)。
Sambaはスプールされたファイルに対してどのような方法でも、これらのアップロードされたドライバを使わない。これらのドライバは、Sambaによってサポートされている“ポイントアンドプリント”メカニズム経由でダウンロード、インストールするクライアントによって完全に使われる。クライアントは、プリンタ(かUNIX印刷システム)が要求する形式に印刷ファイルを生成するためにこれらドライバを使う。Sambaが受け取る印刷ファイルは、必要に応じてすべてのさらなる処理のために責任のある、UNIX印刷システムに渡される。
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$]
という名前のファイル共有を作成しなければならない。この共有の公開される名前は、Microsoft Windowsクライアント中で埋め込まれている。これは、プリンタドライバファイルを検索しようとした時に、正確にこの前のサービスを探すように、Windowsクライアントがプログラムされているため、改名することは出来ない。
グローバルパラメータを追加するためにサーバのファイルを変更し、[print$]
ファイル共有を作成すべきである(もちろん、たとえばpathのようないくつかのパラメータの値は、サイトによって適切な値に置き換えるべきである)。[print\$] の例を参照。
もちろん、pathパラメータによって名付けられたディレクトリが、UNIXファイルシステム上に存在するようにしておく必要もある。
[print$]
はsmb.conf
中で特別なセクションである。これは、潜在的なプリンタドライバダウンロードに関連する設定を含み、ローカルプリンタドライバのインストールのためにWindowsクライアントによって使われる。以下のパラメータはこの共有セクションでしばしば必要とされるものである:
共有リスト中に一覧表示された時に、共有のそばにあるコメント(通常Windows クライアントはそれを見る事ができないが、 smbclient -L sambaserver
の出力中にも表示される)。
UNIXの観点からのWindowsドライバファイルの保存場所の位置のパス。
[print$]
共有を見せないようにさせる。 cmd
シェルで以下を実行すると:
C:\>
net use g:\\sambaserver\print$
任意のクライアントから引き続き見る事ができる。これは、Windows エクスプローラから
からでも行う事が出来る。 すべてのゲストユーザにこの共有をリードオンリにする。クライアント上への ダウンロードとプリンタのドライバのインストールを行うためのアクセスは 許可される。guest ok = yes
が必要かどうかは、 どのようにサイトが設定されているかに依存する。もしもユーザがSamba ホスト上のアカウントを持つことを許可されているならば、これは何の 問題もない。
もし、Sambaサーバによって認証されることを、すべてのWindows NTユーザが 保証されているならば(たとえば、もしも、NTドメインサーバ経由でSambaが 認証するとき、ユーザはすでにWindows NTセッションのためにログオンするために ドメインコントローラによって認証されていた場合)、ゲストアクセスは 不要である。もちろん、ばかげたアカウントとセキュリティについて 心配せずに、ワークグループ環境で印刷を行いたいのであれば、ゲストアクセス のための共有を設定する。同じように、[global]
セクション中で、 map to guest = Bad User を追加することを考えるべきである。これを使う前に、このパラメータが 行う事を理解しておくこと。
誰でもがドライバファイルをアップロード(あるいはドライバの設定の変更)する ことは望まないので、この共有を書き込み不可にする。
[print$]
は以前の設定によってリードオンリになって いるので、write list
も一緒に作成すべきである。UNIX グループは先頭に“@”が付いたものである。共有上にファイルの アップデートを必要とするこの一覧にあるユーザは、(一般的にパブリックな リードオンリアクセスの例外として)書き込みが許可される。 通常この設定中で管理者レベルのユーザのみ指名したいであろう。もしもこれが 非rootアカウントである場合、アカウントはグローバルの printer adminパラメータ中で言及されるべきである。 ファイル共有上の設定についてのより詳細な情報は、smb.conf
マニュアル ページを参照のこと。
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ホスト上で定義されたプリンタ共有にい位置するプリンタの一覧の初期値を見る事ができる。
smb.conf
中に[print$]
共有を無事作成でき、smb.conf
ファイルを強制的にSambaに再読込させただろうか?であれば問題はない。しかし、新しい機能を使うにはまだもう少し手間がかかる。この共有中にクライアントドライバファイルをインストールする必要がある。そのため、まだこの共有は空の状態である。不幸にも、そこにドライバファイルをコピーするだけでは十分ではない。正しくインストールする必要があり、そうすると、各ドライバに対する適切なレコードがSamba内部データベース中に存在するようになり、Microsoft Windowsクライアントから要求された正しいドライバを提供することが出来るようになる。さらに、控えめに言ってもそれは厳重さが必要である。下記では[print$]
中にドライバをインストールする2つの代替方法について説明する:
任意のUNIXワークステーションから、Sambaのコマンドラインユーティリティ rpcclient
を、種々のサブコマンド (adddriver
とsetdriver
など)を組み合わせて 使う。
任意のWindows NT/200x/XPクライアントワークステーションから、GUI (プリンタのプロパティとプリンタの追加ウィザード) を走らせる。
後者のオプションが、おそらくより易しいであろう(たとえプロセスが最初多少奇妙に振る舞うとしても)。
プリンタは、最初、実際のプリンタドライバがそれに割り当てられていない状態で、クライアントのエクスプローラからアクセスされる、Sambaホストのプリンタフォルダに一覧表示される。既定値で、このドライバの名前は空の文字列に設定されている。これは変更しなければならない。NT/2000/XPクライアントから、ローカルのプリンタ追加ウィザード(APW)を動かすことで、この作業ができる。
有効なプリンタドライバのインストールは簡単である。ドライバを割り当てたいプリンタに対するプリンタのプロパティを表示させなければならない。Windowsのエクスプローラを起動し、ネットワークコンピュータを開き、Sambaホストをブラウズし、Sambaのプリンタフォルダを開き、プリンタアイコンを右クリックし、 を選択する。これでプリンタと既定値のNULL
ドライバが割り当てられているキューのためのドライバプロパティが見えるようになる。そして、“デバイス設定が表示できません。指定されたプリンタのドライバがインストールされていません。スプーラのプロパティのみ表示されます。ドライバを今インストールしますか?”というエラーメッセージが表示される。
ここで、いけない!その代わり、エラーダイアログで をクリックする。これで、プリンタプロパティウインドウが表示される。ここから、プリンタへのドライバの割り当ての手順は公開されている。以下を選べる:
をクリックしてはインストール済みのポップアップリストからドライバを選択。通常は最初リストは空である。
新しいプリンタドライバをインストールするために
をクリック(これはAPWを起動する)。一度APWが起動すると、Windows中でなじみがある、ものと手続きは正確に同じである(Windows NT上のプリンタドライバインストール手続きに慣れていることを仮定している)。接続を確認し、printer admin権限を持つユーザとしてセットアップ(ユーザが権限を持つか分からない場合はsmbstatus
でチェックしてみる)。クライアントOSに対してWindows NT x86の代わりのプリンタドライバをインストールしたい場合、プリンタプロパティダイアログの共有タブを使う必要がある。
管理者(root)アカウント(printer adminパラメータで指定されたもの)で接続していると仮定すると、さらに、このダイアログを使ってACLと既定値のデバイスの設定のようなプリンタのプロパティをも修正できる。既定値のデバイス設定のためには、rpcclient
を使った印刷ドライバのインストールに助言が書いてあることを考慮してほしい。
[print$]
にプリンタドライバをインストールし、有効な方法でそれを設定するための2番目の方法は、UNIXコマンドラインから行う方法である。これは、4つの異なったステップを必要とする。
要求されたドライバファイルについての情報を集め、ファイルを収集する。
[print$]
共有の正しいサブディレクトリ中にドライバ ファイルを置く(おそらくsmbclient
を使うだろう)。
rpcclient
コマンドラインユーティリティを起動し、その adddriver
サブコマンドを使う。
rpcclient
をもう一度起動し、setdriver
サブコマンドを使う。
以下の節で、これらのステップのおのおのについて詳細な説明を行う。
ドライバファイルを見つけるためには2つのオプションがある。プリンタに付属のドライバCD-ROMの内容を検査することが出来る。CD-ROM上にある*.inf
ファイルの位置を覚えておく。これは*.inf
ファイルが無いかもしれないので、出来ない場合もある。残念なことに、最近ではベンダ固有のインストールプログラムを使う傾向がある。これらのインストールパッケージはしばしば何らかのWindows上での書庫形式を使っている。更に追加で、インストール処理中にファイル名が改名されるかもしれない。これは、必要とされるドライバファイルの識別がとても難しくなることを意味する。
次に、2番目のオプションがある。ドライバをWindowsクライアント上にローカルにインストールし、インストール後にそれが使うファイル名とパスを調査する(サポートしたい各クライアントプラットフォーム毎にこの手続きを繰り返さなければならない。ここでは、すべてのWindows NT/200x/XPクライアントのためにMicrosoftによって使われる名前である、W32X86プラットフォームのみを表示する)。
ドライバファイルを認識する良い方法は、ドライバのプロパティダイアログでテストページを印刷してみることである(全般タブ)。次に、印刷されたドライバファイルのリストを見てみる。Windows(とSamba)がドライバファイル、データファイル、設定ファイルと(オプションの)依存するドライバファイル(これはWindows NTでは若干変わる)の何を呼び出しているかを認識する必要がある。次のステップのためにすべてのファイル名を記録する必要がある。
ドライバファイル名と関連するパスを迅速にテストする別の方法は、rpcclient
ユーティリティによって提供される。enumdrivers
かgetdriver
サブコマンドを指定し、infoレベルを3
にしてこれを動かす。以下の例では、TURBO_XPがWindows PCの名前である(この場合、これはWindows XP Professionalラップトップ)。KDE-BITSHOP
という名前のSambaサーバからTURBO_XPにローカルにドライバをインストールしたとする。次に対話的なrpcclient
を動かす。そうすると、rpcclient />
が表示され、このプロンプトの状態でサブコマンドが入力出来るようになる。これは練習として残しておこう。次に、1つのサブコマンド行を実行し、すぐに終了するような-c
オプションをつけてrpcclient
を起動する。これは大量のプリンタとドライバのために自動作業を行うスクリプトを作成する時に使う手法である。異なる引用符を使い分けて単語間の異なった空白を解決するように注意:
root#
rpcclient -U'Danka%xxxx' -c \ 'getdriver "Heidelberg Digimaster 9110 (PS)" 3' TURBO_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\
である。
Windows 2000とWindowsXP上のより最新のドライバは、“2”の代わりに“3”というサブディレクトリ中にインストールされる。Windows NT中で使われるバージョン2のドライバはカーネルモードで動作する。Windows2000ではこれを変更した。それは引き続きカーネルモードのドライバを使えるが(もしAdminによって有効にされれば)、そのネイティブモードのプリンタドライバはユーザモードで動作する。これは、この目的のために設計されたドライバを要求する。これらのタイプのドライバは“3”サブディレクトリにインストールされる。
ここで、以前のステップで認識したすべてのドライバファイルを収集する必要がある。さて、どこからそれを得ればよいだろうか?最後のファイルを識別する手段中で調査した、同じ[print$]
共有とそのPCからそれを検索しないのだろうか?これを行うのにsmbclient
が使える。getdriver
によって分かったパスと名前を使える。下記のコマンドライン業は、可読性向上のために、継続行文字を入れて編集できる:
root#
smbclient //TURBO_XP/print\$ -U'Danka%xxxx' \ -c 'cd W32X86/2;mget HD*_de.* hd*ppd Hd*_de.* Hddm*dll HDN*Aux.DLL'
added interface ip=10.160.51.60 bcast=10.160.51.255 nmask=255.255.252.0Got a positive name query response from 10.160.50.8 ( 10.160.50.8 )Domain=[DEVELOPMENT] OS=[Windows 5.1] Server=[Windows 2000 LAN Manager]Get file Hddm91c1_de.ABD?
n
Get file Hddm91c1_de.def?
y
getting file \W32X86\2\Hddm91c1_de.def of size 428 as Hddm91c1_de.defGet 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$]
共有にドライバファイルを配置する作業である。この共有へのUNIXパスはsmb.conf
ファイル中で以前に定義した事を忘れないこと。また、サポートしたい異なったWindowsクライアントタイプのためには、サブディレクトリを作成する。たとえばもしも、[print$]
が/etc/samba/drivers/
というUNIXパスにマップされているならば、ドライバファイルは以下のように配置すべきである:
すべてのWindows NT, 2000,と XPクライアント用は /etc/samba/drivers/W32X86/
だが、2
サブディレクトリ中ではない。
すべてのWindows 95, 98,とMeクライアント用は /etc/samba/drivers/WIN40/
だが、0
サブディレクトリ中ではない。
再度、ネットワーク経由で、ドライバファイルを転送するためにsmbclientを使う。オリジナルのWindowsインストールに対してgetdriver
を走らせた事により情報を得た同じファイルとパスを指定する。しかし、ここでは、Samba/UNIX印刷サーバの[print$]
共有中にファイルを格納する。
root#
smbclient //SAMBA-CUPS/print\$ -U'root%xxxx' -c \ 'cd W32X86; put HDNIS01_de.DLL; \ put Hddm91c1_de.ppd; put HDNIS01U_de.DLL; \ put HDNIS01U_de.HLP; put Hddm91c1_de.DLL; \ put Hddm91c1_de.INI; put Hddm91c1KMMin.DLL; \ put Hddm91c1_de.dat; put Hddm91c1_de.dat; \ put Hddm91c1_de.def; put Hddm91c1_de.hre; \ put Hddm91c1_de.vnd; put Hddm91c1_de.hlp; \ put Hddm91c1_de_reg.HLP; put HDNIS01Aux.dll; \ put HDNIS01_de.NTF'
added interface ip=10.160.51.60 bcast=10.160.51.255 nmask=255.255.252.0Got a positive name query response from 10.160.51.162 ( 10.160.51.162 )Domain=[CUPS-PRINT] OS=[UNIX] Server=[Samba 2.2.7a]putting file HDNIS01_de.DLL as \W32X86\HDNIS01_de.DLLputting file Hddm91c1_de.ppd as \W32X86\Hddm91c1_de.ppdputting file HDNIS01U_de.DLL as \W32X86\HDNIS01U_de.DLLputting file HDNIS01U_de.HLP as \W32X86\HDNIS01U_de.HLPputting file Hddm91c1_de.DLL as \W32X86\Hddm91c1_de.DLLputting file Hddm91c1_de.INI as \W32X86\Hddm91c1_de.INIputting file Hddm91c1KMMin.DLL as \W32X86\Hddm91c1KMMin.DLLputting file Hddm91c1_de.dat as \W32X86\Hddm91c1_de.datputting file Hddm91c1_de.dat as \W32X86\Hddm91c1_de.datputting file Hddm91c1_de.def as \W32X86\Hddm91c1_de.defputting file Hddm91c1_de.hre as \W32X86\Hddm91c1_de.hreputting file Hddm91c1_de.vnd as \W32X86\Hddm91c1_de.vndputting file Hddm91c1_de.hlp as \W32X86\Hddm91c1_de.hlpputting file Hddm91c1_de_reg.HLP as \W32X86\Hddm91c1_de_reg.HLPputting file HDNIS01Aux.dll as \W32X86\HDNIS01Aux.dllputting file HDNIS01_de.NTF as \W32X86\HDNIS01_de.NTF
ヒュー;これはとても大量なタイプ量である!ほとんどのドライバはより小さい。多くはたった3つの汎用Postscriptドライバファイルと1つのPPDのみを持つ。WindowsマシンからのW32X86
の2
サブディレクトリからファイルを検索した時、Sambaサーバの同じサブディレクトリ中に(今は)それらを置かない。この再配置は、間もなく動く(そして、それらを必要とすべき場合、WIN40/
サブディレクトリ中に、Windows 9x/Meアーキテクチャのためのファイルを置くことを忘れない)、adddriver
によって自動的に行われる。
次は、所定の場所にファイルがあるかどうかを確認する。これは、smbclient
で行える(が、もちろん、SSH経由でログインし、標準のUNIXシェルアクセスを通して行える)。
root#
smbclient //SAMBA-CUPS/print\$ -U 'root%xxxx' \ -c 'cd W32X86; pwd; dir; cd 2; pwd; dir'
added interface ip=10.160.51.60 bcast=10.160.51.255 nmask=255.255.252.0Got a positive name query response from 10.160.51.162 ( 10.160.51.162 )Domain=[CUPS-PRINT] OS=[UNIX] Server=[Samba 2.2.8a]Current directory is \\SAMBA-CUPS\print$\W32X86\. D 0 Sun May 4 03:56:35 2003.. D 0 Thu Apr 10 23:47:40 20032 D 0 Sun May 4 03:56:18 2003HDNIS01Aux.dll A 15356 Sun May 4 03:58:59 2003Hddm91c1KMMin.DLL A 46966 Sun May 4 03:58:59 2003HDNIS01_de.DLL A 434400 Sun May 4 03:58:59 2003HDNIS01_de.NTF A 790404 Sun May 4 03:56:35 2003Hddm91c1_de.DLL A 876544 Sun May 4 03:58:59 2003Hddm91c1_de.INI A 101 Sun May 4 03:58:59 2003Hddm91c1_de.dat A 5044 Sun May 4 03:58:59 2003Hddm91c1_de.def A 428 Sun May 4 03:58:59 2003Hddm91c1_de.hlp A 37699 Sun May 4 03:58:59 2003Hddm91c1_de.hre A 323584 Sun May 4 03:58:59 2003Hddm91c1_de.ppd A 26373 Sun May 4 03:58:59 2003Hddm91c1_de.vnd A 45056 Sun May 4 03:58:59 2003HDNIS01U_de.DLL A 165888 Sun May 4 03:58:59 2003HDNIS01U_de.HLP A 19770 Sun May 4 03:58:59 2003Hddm91c1_de_reg.HLP A 228417 Sun May 4 03:58:59 2003 40976 blocks of size 262144. 709 blocks availableCurrent directory is \\SAMBA-CUPS\print$\W32X86\2\. D 0 Sun May 4 03:56:18 2003.. D 0 Sun May 4 03:56:35 2003ADOBEPS5.DLL A 434400 Sat May 3 23:18:45 2003laserjet4.ppd A 9639 Thu Apr 24 01:05:32 2003ADOBEPSU.DLL A 109568 Sat May 3 23:18:45 2003ADOBEPSU.HLP A 18082 Sat May 3 23:18:45 2003PDFcreator2.PPD A 15746 Sun Apr 20 22:24:07 2003 40976 blocks of size 262144. 709 blocks available
2
サブディレクトリ(おそらく以前のインストールで)中に、すでにドライバファイルが存在することに注意。いったん新しいドライバのためのファイルがそこにあると、クライアント上からそれらを使うことが出来るようにするためからは違ういくつかのステップを処理することになる。この時点で行うべき唯一のことは、Windowsエクスプローラからprint$共有を開いて、ファイル共有から普通のファイルを検索するのと同じように、クライアントから、それらを検索することである。しかし、それはポイントアンドプリント単位でそれらをインストールしない。その理由は、Sambaはまだそれらのファイルが特別か、すなわち、プリンタドライバファイルかどうかを知らないのと、それらのドライバファイルが属する印刷キューがどれかを知らないということによる。
次に、[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コマンドの文法に関するヒントはマニュアルページにあり、必要ならばより詳細な記述を見ておくこと。
ファイルをドライバファイルとして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によって登録された。ほんの少しの時間でこのことを確認できる。しかし、このドライバはまだ特定のプリンタに対して関連づけられていない。少なくとも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回実行させなければならない。
Sambaはどのプリンタがどのドライバに対応しているかを知る必要がある。ドライバからプリンタへのマッピングを作成し、この情報をSambaのTDBファイルに格納する。rpcclient setdriver
はこれを正しく処理する:
root#
rpcclient -U'root%xxxx' -c 'setdriver dm9110 mydrivername'
cmd = setdriver dm9110 mydrivernameSuccessfully set dm9110 to driver mydrivername.SAMBA-CUPS
これはまずい、こういう事は期待していない。この時点では、指定する名前を繰り返す:
root#
rpcclient -U'root%xxxx' -c 'setdriver dm9110 dm9110'
cmd = setdriver dm9110 dm9110Successfully set dm9110 to driver dm9110.SAMBA-CUPS
コマンドの文法は下記の通り:
rpcclient -U'root%sambapassword
' -c 'setdriver printername
\ drivername
' SAMBA-Hostname
.
これで、ほとんどの仕事が完了したが、まだ全部ではない。
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ワークステーションから以下を実行する:
ネットワークコンピュータを開く。
Sambaサーバをブラウズする。
そのプリンタとFAXフォルダを開く。
プリンタを選択して右クリックする。
を選択(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. プリンタドライバ設定の初期化手続き
ネットワークコンピュータをブラウズする。
Sambaサーバを見つける。
SambaサーバのプリンタとFAXフォルダを開く。
問い合わせ中の共有プリンタを選択する。
プリンタ上で右クリックする(最後の節の説明に従っているならすでにここにいるはずである)。
コンテキストメニューの下部にある
を選択する(もっと上に 引き続き エントリを表示しているなら、直近の節で説明 したように、ドライバのインストールを完了するためにそれをクリックする必要がある)。詳細タブに移動し、 をクリックする。
ページの設定を
から に変更する(そして戻す)。変更が実際に効果を引き起こすように、ページ方向の変更の確定を確実に行う。
そこに居る間、他のクライアントにおけるドライバインストール時に適用される、 印刷の既定値を設定してもよい。
この手続きは、クライアントプラットフォーム上でプリンタドライバプログラムを動かし、正しいデバイスモードを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 プロンプトウィンドウ内か、 メニュー中の のどちらかで入力できる。
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でどのようにこれを再現したかは以下の通り:
最初の“間違った”方法:
Open the Printers folder.
プリンタ(cupshost上のリモートプリンタ)を右クリックし、 コンテキストメニューの を選択する。
しっかりとこのダイアログを見て、どのように見えるかを覚えておくこと。
2番目の“間違った”方法:
フォルダを開く。
プリンタ(cupshost上のリモートプリンタ) を右クリックし、コンテキストメニューの
を選択する。全般タブをクリックする。
ボタンをクリックする。
新しいダイアログが開く。このダイアログを開いたままにして 親のダイアログに戻る。
3番目の正しい方法(これを最初に行うべきであり、そのあと上記で説明した2番目の方法の ステップ1と2を行う):
詳細タブをクリックする (もしもすべてが“灰色で選択できない”ならば、十分な 権限を持つユーザでログインしていない)。
ボタンを クリックする。
2つの新しいタブ上のどれかで、 詳細ボタンをクリックする。
新しいダイアログが開く。これを他と比較する。これらは “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はで同じように試すのはとても自然である。同じように見えるものに到達する異なったパスがあるとは夢にも思わないだろうが、機能は異なり、すべてのユーザに既定値を設定するダイアログである。
(Windows 200x/XP上で)このコマンドを動かしてみる(正しい権限を持つユーザで):
rundll32 printui.dll,PrintUIEntry /p /t3 /n\\
SAMBA-SERVER
\printersharename
印刷の既定値ボタン(必要としているもの)があるタブを見るには以下のコマンドを実行する:
rundll32 printui.dll,PrintUIEntry /p /t0 /n\\
SAMBA-SERVER
\printersharename
印刷のプリファレンスボタンを持つタブを見るには(システム全体の既定値を設定しない)、DOSプロンプト内でコマンドを実行するか、 -> を選択する。
昨今のSamba 開発フェーズにおいて浮かび上がった問題は、さまざまな種類のプリンタに関してドライバのダウンロードサポートが必要なことである。Windows NT の APW(Add Printer Wizard)を使うやり方は(控えめに言っても)筋が良いとはいえない。一人でクリック祭りをやりながらプリンタのインストールをやりつつ反復性緊張症候群(RSS)の苦痛をを味わいたくなければ、非会話的なスクリプトについて検討する必要があるだろう。
複数のプリンタが同じドライバを使う場合、rpcclient setdriver
コマンドはインストールされたキューに結合されたドライバを設定するために使える。もしもドライバが[print$]
で一度更新され、印刷用TDBファイルに登録されると、複数の印刷キューによって使うことができる。この場合、すべてのキューに対して(adddriver
を繰り返し実行する必要なしに)rpcclient
のsetprinter
サブコマンドを繰り返す必要がある。以下はどのようにこれを達成するかの例である:
root#
rpcclient
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] [....]SAMBA-CUPS
-U root%secret
-c 'enumdrivers'
root#
rpcclient
cmd = enumprinters flags:[0x800000] name:[\\SAMBA-CUPS\dm9110] description:[\\SAMBA-CUPS\dm9110,,110ppm HiVolume DANKA Stuttgart] comment:[110 ppm HiVolume DANKA Stuttgart] [....]SAMBA-CUPS
-U root%secret
-c 'enumprinters'
root#
rpcclient
cmd = setdriver dm9110 Heidelberg Digimaster 9110 (PPD) Successfully set dm9110 to driver Heidelberg Digimaster 9110 (PS).SAMBA-CUPS
-U root%secret
-c \ 'setdriverdm9110
"Heidelberg Digimaster 9110 (PS)
"'
root#
rpcclient
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] [....]SAMBA-CUPS
-U root%secret
-c 'enumprinters'
root#
rpcclient
cmd = setdriver dm9110 mydrivername Successfully set dm9110 to mydrivername.SAMBA-CUPS
-U root%secret
-c 'setdriverdm9110
mydrivername
'
root#
rpcclient
cmd = enumprinters flags:[0x800000] name:[\\SAMBA-CUPS\dm9110] description:[\\SAMBA-CUPS\dm9110,mydrivername,\ 110ppm HiVolume DANKA Stuttgart] comment:[110ppm HiVolume DANKA Stuttgart] [....]SAMBA-CUPS
-U root%secret
-c 'enumprinters'
(説明フィールドの2つのカンマの間に)ドライバが一覧表示される、空の文字列がある“dm9110”プリンタが表示される最初のenumprinters
呼び出しを認識するのは簡単ではないかもしれない。setdriver
コマンドの成功後、すべてはうまくいく。
既定値では、Sambaはsmb.conf
中で定義されているすべてのプリンタ共有を、プリンタフォルダに表示する。また、このフォルダ中にWindows NTのプリンタ追加ウィザードアイコンも配置される。APWは下記の条件の時にのみ表示される:
接続したユーザは管理者権限つきでOpenPrinterEx(\\server)
を 正常に実行できる(すなわち、root又はprinter admin)。
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%
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: []secret
' -c 'enumdrivers 3' 10.160.50.8
もしも“バージョン 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
多くの例では、上記の例よりももっと違っている。結論:各ドライババージョン用の正しいドライバファイルを注意深く選択しなければならない。名前だけに頼っても、異なったドライババージョンに属するファイルを交換してもいけない。
Windows NT/2000印刷サーバは各プリンタに対してポートを結びつける。これらは通常、LPT1:
、COM1:
、FILE:
のような形式である。Sambaもプリンタに結びついたポートという概念をサポートせねばならない。既定値では、システム上“Sambaプリンタポート”という名前の1つのプリンタポートのみが存在する。Sambaは印刷するために、“ポート”のようなものは実際に必要はしていない。むしろ、これはWindowsクライアントの要求である。この情報を要求する時、有効なポートについて告知されることを強く要求する。それ以外だとエラーメッセージを表示する。そのため、SambaはWindowsクライアントに支障がないよう、ポート情報を偽装する。
Sambaは内部的に同等のプリンタプーリング
という概念をサポートしていない。プリンタプーリングは論理プリンタを複数のポートに、ロードバランシングかフェイルオーバのように割り当てるものである。
もしも何らかの理由か、他の理由で(Sambaでそういうことが出来るか、ユーザと管理者は知るべきではないが)複数のポートを定義する要望がある場合、システム上のポートの一覧を生成する外部プログラムを定義するために使えるenumports commandを設定する。
印刷はうまくいっているが、まだ問題がある。ほとんどのジョブの印刷はうまくいくが、いくつかは全く印刷できない。いくつかのジョブはうまくいっていないように見えるフォントの問題を抱えている。いくつかのジョブは速やかに印刷するが、いくつかはとても遅い。それら全部について触れることは出来ないが、CUPSによる印刷の章の“間違ったPostscriptドライバ設定の防止”、クライアント上の危険なPostscriptドライバ設定の防止の短い節を読むことを推奨する。
ImprintsツールセットはWindows NT APWの同等品をUNIXで提供する。完全な情報は、Imprintsのソースディストリビューションを含むドキュメントがある、ImprintsのWebサイトを参照してほしい。この節は、Imprintsの機能について簡単な紹介を提供するのみ行う。
不幸にも、Imprintsツールセットはもはやメンテナンスされていない。2000年12月からプロジェクトは新しいメンテナを必要としている。持つべきスキルのうち最も重要なものはPerlのコーディングとSambaで使うMS-RPCベースの印刷についての興味である。もしもボランティアを希望するならば、Sambaテクニカルメーリングリストで希望を調整してほしい。ツールセットはいまだに便利であるが、使うために準備されているパッケージは古いプリンタモジュールに対してのもののみである。Imprintsが持つべきであるならば、より更新されたプリンタドライバのパッケージが必要である。Imprintsにツールセットに関する情報はImprintsホームページから得ることが出来る。
Imprintsは以下をサポートするためのツールの集合体である:
Windows NTと 95/98プリンタドライバパッケージに関連する集中した情報のリポジトリを提供する。
Imprintsプリンタドライバパッケージを作成するためのツールを提供する。
中央のインターネット(又はイントラネット)Imprintsサーバリポジトリからプリンタドライバを 得、リモートのSambaとWindows NT印刷サーバ上にそれをインストールする事を提供する。
プリンタドライバパッケージの作成手順はこのドキュメントの範囲外である(より詳細は、Sambaのディストリビューションに含まれているImprints.txtを参照)。簡単に言うと、Imprintsドライバパッケージは、ドライバファイル、関連するINFファイルとクライアントがインストールするのに必要な制御ファイルを含む、gzipされたtar形式ファイルである。
Imprintsサーバは、実際には、標準HTTPメカニズム経由で問い合わせを受けることが出来るデータベースサーバである。データベース中の各プリンタエントリは、実際にダウンロードするパッケージを示すURLに関連づけられている。各パッケージは、実際にダウンロードしたものが、Imprintsデータベース中で参照されるものかどうかを検査できるよう、GnuPGを使ってデジタル署名されている。このセキュリティ検査を無効にしないことを強く推奨する。
Imprintsクライアントに関連するさらなる情報は、Imprintsソースパッケージ中にある、Imprints-Client-HOWTO.ps
という文書ファイルに書いてある。Imprintsクライアントインストールは以下の2つの形式がある:
コマンドラインPerlスクリプト一式。
コマンドラインPerlスクリプトへのGTK+ベースのグラフィカルインタフェース
(両方の形式による)クライアントのインストールは、リモートSambaとWindows NTプリントサーバ上へのダウンロードとドライバのインストールという意味と同じような、既存のプリンタモデル名の一致リストのための、Imprintsデータベースサーバに問い合わせる手段を提供する。
基本的なインストール手順は4つのステップがあり、Perlコードはsmbclientとrpcclientを包みこんでいる。
与えられたドライバがサポートする各アーキテクチャに対して:
rpcclient: リモートサーバ上の適切なアップロードディレクトリを取得する。
smbclient: ドライバファイルをアップロードする。
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"
コマンドラインパラメータで使われるパラメータの一覧である:
ネットワークプリンタを削除する。
表示を抑制する。
プリンタに名前を付ける。
ネットワークプリンタ接続を追加する。
プリンタを既定値のプリンタにする。
1行目ではinfotec2105-IPDSという以前に存在していた可能性の あるネットワークプリンタを削除する(CUPSに変換された、サーバから削除されたLPRngの ネイティブなWindowsドライバで使われていた)。終わりにある/q
は、ポップアップする確認あるいはエラーダイアログボックスを抑制する。これらは ユーザログオンについては提供されない。
2行目では、新しいプリンタinfotec2105-PS(実際には同じ物理 デバイスであるが、新しいCUPS印刷システムによって動作し、CUPS/Adobe PSドライバ と関連づけられる)を追加する。プリンタとそのドライバはユーザのログインに先立って 追加されねばならない(すなわち、この章の前の方で説明した手順か、 cupsaddsmb
を動かすことによって)。ドライバはユーザがログイン しようとしているときに、クライアントPCに自動的にダウンロードされる。
3行目では、この新しいネットワークプリンタを既定値のプリンタに設定する(この方法を 使っていくつかのプリンタが存在するかもしれなく、また、そのうちのいくつかは同じ ようにローカルであってもよいので、既定値のプリンタを決める事が必要となる)。 既定値のプリンタの選択は、もちろん、異なったユーザでは異なっても良い。
2番目の行は、もしもプリンタinfotec2105-PSがすでにcupsserver
上のプリントキューで動作していて、もしもプリンタドライバがSambaのドライバリポジトリである[print$]
中に、すでにきちんとアップロード(APW
, smbclient/rpcclient
かcupsaddsmb
経由で)されている場合にのみ動作する。バージョン3.0より前のある種のSambaのバージョンでは、プリンタインストール後とドライバアップロード後にsmbdの再起動を要求する。そうでないと、スクリプト(かその他のルライアンとドライバダウンロード)は失敗する。
ログオンスクリプトからの、インストールされたネットワークプリンタの存在をテストする簡単な方法は無いので、わざわざ調べる必要はない。ユーザログイン時に毎回インストールの削除/再インストールが出来るようにしておくこと。それはとても短時間である(1から2秒くらい)。
ほかにこの件に関する有用な情報は以下の通り:
全部のユーザログイン時に自動的に、任意のプリンタ既定値の設定変更を適切に設定する。
異なったワークステーションからドメインにユーザが“ローミング”でログイン出来るようにする。
各ユーザ毎にネットワークプリンタがインストールされるので、これにより、インストールの最新性を保持する作業をより単純化する。ログイン時に数秒余計にかけることはほとんど目立たないだろう。プリンタは、クライアントからユーザが介入する必要性なしにサーバ上で集中して追加、変更と削除ができる(ログインスクリプトは最新性を保持する必要はある)。
addprinter
コマンドはSambaによって実行されるシェルスクリプトかプログラムとして設定できる。これはSambaプリントサーバに対してクライアントからAPWを走らせることによって起動される。APWはユーザにいくつかのフィールドを埋めることを要求する(それはたとえばプリンタ名、使用するドライバ、コメント、ポートモニタなど)。これらのパラメータはAPWによってSamba上に渡される。もしも、addprinterコマンドが新しいプリンタを作成できるように(旧式のシステム上で、適切なprintcapエントリを書くか、より新しいシステム上でlpadmin
コマンドを実行することによって)と、それに関連する共有を作成するように設計されていた場合、APWはSamba上とUNIX印刷システム上に、結果として新しいプリンタを作る!
基本的なNT形式のプリンタドライバ管理は2.2.xリリースから3.0ではほとんど変更はなかった(小さな改善はたくさん適用されたが)。特に、設定中で廃止されるパラメータを使うのをやめる、前述の助言に従うならば、移行はとても簡単である。既存の2.0.x設定か、Samba 2.2でWindows 9x/Me形式の印刷形式を継続したいのであれば、それはもっと努力が必要となる。適切なリリースノートとSamba-2.2.xのHOWTO文書を読んでほしい。以下のいくつかの方法に沿うことが出来る。移行のための可能なシナリオは以下の通り:
新しい Windows NTプリンタとドライバサポートについて学習し、使う必要がある。以前 使っていたパラメータprinter driver file
, printer driver
とprinter driver location
はもはやサポートされない。
もしもWindows NTプリンタドライバサポートを利用したいのであれば、新しい設定の ために、Windows 9x/Meドライバを新しいものへ移行する必要がある。
存在するprinters.def
ファイル(削除されたパラメータ printer driver file
中で指定されているもの)はもはやSamba-3 では動作しないので、smbdは[print$]
中とTDBファイル中の 追加の設定だけで、プリンタのためのWindows 9x/Meドライバファイルを捜そうとする。 もしもそれが失敗すると、(2.2.xが使うように)printers.def
(とすべての関連するパラメータ)を使うようにはならない。 make_printerdefツールは削除され、これに関する下位互換性はない。
使用しているSambaホスト上のプリンタ用の [print$]
共有中にWindows 9x/Meドライバをインストールする 必要がある。ドライバファイルは[print$]
の “WIN40/0”サブディレクトリ中に格納され、その他の設定と情報は印刷 関連のTDBファイル中に格納される。
もしも、存在するprinters.def
ファイルを新しい設定中に移行 したいならば、現在唯一の解は、NTドライバと9x/Meドライバをインストールするために、 Windows NT APWを使うことである。これはsmbclientとrpcclientを使うスクリプトで 行える。その例は、 Imprints のWebサイト上にあるImprintsクライアントインストールを参照。また、 CUPS 印刷環境中のrpcclientの使用法についての 議論も参照のこと。
この件に関しては、リモートとローカル管理Netコマンドでも触れられている。もしもこの機能に関しての文書の更新をボランティアとして手助けしてくれるのであれば、John H. Terpstraに連絡をしてほしい。
UNIXシステムで有効な(とほとんどの場合、/etc/shadow
というファイルに1方向ハッシュ形式として格納される)rootパスワードと、Samba認証時に使うパスワードと混同しないこと。SambaはUNIXパスワードを知らない。Sambaリソースへのrootアクセスは最初に作成されなければならないSamba用のrootアカウントを必要とする。これは以下のように、smbpasswd
を使って行える:
root#
smbpasswd -a rootNew SMB password: secretRetype new SMB password: secret
存在するUNIX印刷システムスプールディレクトリをSambaスプールディレクトリに使ってはならない。それは、簡単で場所を節約できるように見えるが、これは問題を引き起こす。2つは分離せねばならない。UNIX/Linuxシステムプリントスプールディレクトリ(すなわち/var/spool/cups
)は通常cups
やlp
のような非特権ユーザによって所有される。さらに追加で、スプールディレクトリのパーミッションは、通常所有者とグループに対して制約されている。別の言い方をすると、Sambaスプールディレクトリは全員に対して書き込み可能で、一時スプールファイルの所有者のみがファイルを変更したり削除できるようにする、't'ビットを設定すべきである。
UNIX/Linuxホスト上で使う印刷スプールシステムのタイプに依存するので、スプール管理アプリが見つける、管理されているジョブキューの一部でないファイルは削除される。これは、ジョブが(Sambaによって)このディレクトリ中にスプールされて消えてしまう現象の説明になるだろう。