< error C2143 | MFC の WinInet クラスで HTTP を実装してみる >

March 25, 2004

プリンタ追加バッチ

大量のプリンタのインストールをバッチファイルで行うことはできないかと調べていたら、189105 - ユーザーによる操作なしで Windows にプリンタを追加する方法というのを発見した。これを使えば、プリンタのインストールをこんな感じでバッチファイルに記述することができる。

rundll32 printui.dll,PrintUIEntry /if /b "プリンタに付ける名前"  /f "INFファイル名" /q /r "ポート(LPT1:とか)" /m "プリンタのモデル名"

詳しい使い方は、 rundll32 printui.dll,PrintUIEntry /? で、ヘルプを見ることができる。以下はその内容。

使用法: rundll32 printui.dll,PrintUIEntry [オプション] [@コマンドファイル]
   /a[ファイル] バイナリ ファイル名
   /b[名前] 基本プリンタ名
   /c[名前] UNC コンピュータ名 (リモート コンピュータで実行される場合)
   /dl ローカル プリンタを削除します
   /dn ネットワーク プリンタ接続を削除します
   /dd プリンタ ドライバを削除します
   /e 印刷設定を表示します
   /f[ファイル] inf ファイルまたは出力ファイル
   /ga コンピュータごとのプリンタ接続を接続します
   /ge コンピュータごとのプリンタ接続を列挙します
   /gd コンピュータごとのプリンタ接続を削除します
   /h[アーキテクチャ] ドライバ アーキテクチャが次のうちの 1 つです。 Alpha | Intel | IA64
   /ia inf ファイルを使ってプリンタ ドライバをインストールします
   /id プリンタ ドライバの追加ウィザード使ってプリンタ ドライバをインストールします
   /if inf ファイルを使ってプリンタをインストールします
   /ii inf ファイルとプリンタの追加ウィザード使ってプリンタをインストールします
   /il プリンタの追加ウィザード使ってプリンタをインストールします
   /in ネットワーク プリンタ接続を追加します
   /j[プロバイダ] プロバイダ名を印刷します
   /k 指定されたプリンタへテスト ページを印刷します (プリンタのインストール時にはこのコマンドは使えません)
   /l[パス] プリンタ ドライバ ソース パス
   /m[モデル] プリンタ ドライバ モデル名
   /n[名前] プリンタ名
   /o プリンタ キューを表示します
   /p プリンタのプロパティを表示します
   /q QUIET モード、エラー メッセージを表示しません
   /r[ポート] ポート名
   /s サーバー プロパティを表示します
   /Ss プリンタの設定をファイルに保存します
   /Sr ファイルからプリンタの設定を復元します
   コマンドの最後に追加されるプリンタ設定オプション フラグの保存または復元:
	2	PRINTER_INFO_2
	7	PRINTER_INFO_7
	c	色のプロファイル
	d	プリンタ データ
	s	セキュリティ記述子
	g	グローバル開発モード
	m	最小限の設定
	u	ユーザー開発モード
	r	名前の競合を解決する
	f	名前を強制する
	p	ポートを解決する
   /u インストールされている場合は、既存のドライバを使います
   /t[#] ゼロを基本としたインデックス ページで開始します
   /v[バージョン] ドライバのバージョンが次のうちの 1 つです。 Windows 95、98 または Me | Windows NT 4.0 | Windows NT 4.0 or 2000 | Windows 2000 または XP| Windows XP
   /w 指定されたドライバが inf ファイルにない場合にユーザーに確認します
   /y 通常使うプリンタに設定します
   /Xg プリンタ設定を取得します
   /Xs プリンタの設定を設定します
   /z このプリンタを自動共有にしません
   /Y プリンタ名を自動生成しません
   /K /v および /h オプションで、0、1、2、3 の値をそれぞれ Windows IA64 | Windows NT x86 | Windows NT Alpha_AXP | Windows 4.0 として認識するように変更します
   /Z このプリンタを共有にします。/if オプションとのみ使用できます
   /? このヘルプを表示します
   @[ファイル] コマンド ライン引数ファイル
   /Mw[message] は、コマンドを実行する前に警告メッセージを表示します。
   /Mq[message] は、コマンドを実行する前に確認メッセージを表示します。
   /W[flags] は、ウィザード用のフラグとスイッチを指定します (APW および APDW)
	r	ウィザードの最終ページからウィザードを再起動できるようにします
   /G[flags] は、グローバル フラグとスイッチを指定します
	w	セットアップのドライバ警告 UI を表示しません (Super Quiet モード)

例:
   サーバー プロパティの実行: 
rundll32 printui.dll,PrintUIEntry /s /t1 /n\\machine
   プリンタ プロパティの実行: 
rundll32 printui.dll,PrintUIEntry /p /n\\machine\printer
   ローカルでプリンタの追加ウィザードの実行: 
rundll32 printui.dll,PrintUIEntry /il 
   \\machine 上でプリンタの追加ウィザードの実行: 
rundll32 printui.dll,PrintUIEntry /il /c\\Machine
   キュー表示の実行: 
rundll32 printui.dll,PrintUIEntry /o /n\\machine\printer
   inf インストールの実行: 
rundll32 printui.dll,PrintUIEntry /if /b "Test Printer" /f %windir%\inf\ntprint.inf /r "lpt1:" /m "AGFA-AccuSet v52.3"
   inf を使ってプリンタの追加ウィザードの実行: 
rundll32 printui.dll,PrintUIEntry /ii /f %windir%\inf\ntprint.inf
   コンピュータごとのプリンタ接続の追加: 
rundll32 printui.dll,PrintUIEntry /ga /c\\machine /n\\machine\printer /j"LanMan Print Services"
   コンピュータごとのプリンタ接続の削除: 
rundll32 printui.dll,PrintUIEntry /gd /c\\machine /n\\machine\printer
   コンピュータごとのプリンタ接続の列挙: 
rundll32 printui.dll,PrintUIEntry /ge /c\\machine
   inf を使ってプリンタ ドライバの追加: 
rundll32 printui.dll,PrintUIEntry /ia /c\\machine /m "AGFA-AccuSet v52.3" /h "Intel" /v "Windows 2000 または XP" /f %windir%\inf\ntprint.inf
   INF を使ったプリンタ ドライバの追加: 
rundll32 printui.dll,PrintUIEntry /ia /K /c\\machine /m "AGFA-AccuSet v52.3" /h "Windows NT x86" /v 3
   プリンタ ドライバの削除: 
rundll32 printui.dll,PrintUIEntry /dd /c\\machine /m "AGFA-AccuSet v52.3" /h "Intel" /v "Windows 2000 または XP"
   プリンタ ドライバの削除: 
rundll32 printui.dll,PrintUIEntry /dd /K /c\\machine /m "AGFA-AccuSet v52.3" /h "Windows NT x86" /v 3
   通常使うプリンタとして設定: 
rundll32 printui.dll,PrintUIEntry /y /n "printer"
   プリンタ comment の設定: 
rundll32 printui.dll,PrintUIEntry /Xs /n "printer" comment "My Cool Printer"
   プリンタ設定の取得: 
rundll32 printui.dll,PrintUIEntry /Xg /n "printer"
   プリンタ設定の結果をファイルに保存: 
rundll32 printui.dll,PrintUIEntry /f "results.txt" /Xg /n "printer"
   プリンタ設定コマンドの設定の使用法:
rundll32 printui.dll,PrintUIEntry /Xs /n "printer" ?
   すべてのプリンタ設定をファイルに保存: 
rundll32 printui.dll,PrintUIEntry /Ss /n "printer" /a "file.dat"
   すべてのプリンタ設定をファイルから復元: 
rundll32 printui.dll,PrintUIEntry /Sr /n "printer" /a "file.dat"
   レベル 2 のプリンタ情報をファイルに保存 : 
rundll32 printui.dll,PrintUIEntry /Ss /n "printer" /a "file.dat" 2
   プリンタ セキュリティ記述子をファイルから復元: 
rundll32 printui.dll,PrintUIEntry /Sr /n "printer" /a "file.dat" s
   プリンタ グローバル開発モードとプリンタ データをファイルから復元: 
rundll32 printui.dll,PrintUIEntry /Sr /n "printer" /a "file.dat" g d
   最小設定をファイルから保存とポート名の解決: 
rundll32 printui.dll,PrintUIEntry /Sr /n "printer" /a "file.dat" m p

ところで、プリンタポートをINFファイルより追加するのもバッチファイルにできないかと思ってるんですが、どなたか方法をご存じないですか?知ってたら教えてください。

トラックバック

このエントリーにトラックバック:
http://frog.raindrop.jp/cgi-bin/mt/mt-tb.cgi/281

コメント

すでにご存知かもしれませんが・・・。
プリンタポートをバッチで追加するには、
「prnport.vbs」を利用すれば出来るみたいですよ。

cscript prnport.vbs -a -r IP_192.168.0.0 -h 192.168.0.0 -o lpr -q lp

sabeさん、こんにちわ。
情報ありがとうございます。

> すでにご存知かもしれませんが・・・。
> プリンタポートをバッチで追加するには、
> 「prnport.vbs」を利用すれば出来るみたいですよ。

知らなかったです・・・。
今 prnport.vbs 開いて解析を試みたのですが、あえなく断念しました 笑。
でもポートの追加以外にも、いろいろオプションがあるみたいですね。
参考にさせていただきます。
ありがとうございます。

sabeさん、始めまして。

ちょっと違うかもしれませんが、直接レジストリを書き換えてしまえば良いのではないでしょうか?

場所は
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Print\Monitorsの中にあります。

書き換えた時は一度スプーラを再起動しないと設定が反映されませんのでご注意を!

kemix さん、こんにちわ。初めまして。
情報ありがとうございます。

> 場所は
> HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Print\Monitorsの中にあります。

確かに、ポートらしきものがたくさんありますね。
DLL等の関連ファイルをコピーして
regファイルを取り込むような
バッチを作るという手も使えそうです。

はじめまして、トロといいます。
 不躾に失礼いたします。
皆様のお知恵をお借りいたしたいのです。
 
 プリンターの追加をバッチで行う方法です。
環境はファイルサーバーの中に格納しているプリンターのINFファイルを取得して自動でインストールを行いたいと思っているのですが、
サーバー内のドライバーのパスの指定の方法が理解できません。

 また。プリンタのIPも固定で指定されているので、IPの設定やポートの設定もも一括でできる方法を教えていただければ幸いです。
 VBSは素人です。
 
 皆様、お力をお貸し願えませんでしょうか。
 よろしくお願いいたします。

トロさん、いらっしゃいませ。

> 環境はファイルサーバーの中に格納しているプリンターのINFファイルを取得して自動でインストールを行いたいと思っているのですが、
> サーバー内のドライバーのパスの指定の方法が理解できません。

いま、自宅なので試してみてないのですが、、

\\Server\ShareFolder\PrinterToAdd.inf
みたいな UNC パスで指定できないですか?
(バックスラッシュは半角の¥で!)

rundll32 printui.dll,PrintUIEntry /if /b "NewPrinter" /f "\\AnyComputer\AnyShareFolder\AnyPrinter.inf" /q /r "IP_192.168.0.1" /m "AnyPrinter"

この前の行に sabe さんの prnport.vbs を呼び出す行を追加すればうまくいきそうな気がしますが、、

cscript prnport.vbs -a -r IP_192.168.0.1 -h 192.168.0.1 -o lpr -q lp

私の今の環境 (Win2K Pro SP4) には prnport.vbs が存在しないようです。
お仕事PC (WinXP Pro SP1) にはあったのですが・・・残念!

・・・やっぱり XP より追加されたんですね。
他にもプリンタ関連の WSH スクリプトが色々追加になってるようです。

↓ @IT WindowsXPの正体 :強化されたコマンドラインツール
http://www.atmarkit.co.jp/fwin2k/xp_feature/013commandtool/commandtool.html

 トロです、新年明けましておめでとうございます。
 
 ありがとう、ございます。
 実は、パスの設定をいろいろ、試して見たのですが。
 リソース不足です。と言うエラーを吐いていました。
 弟のW2Kの環境でテストしたので何ともいえないのですが
 XPの環境で試して見ます。
 
 試験環境 XP-PRO SP1
 テストプリンター Canon LPB-1820
 
 検証結果をご報告させていただきますので
 今後の検討材料にご利用ください。
  
 

 

 トロです、新年明けましておめでとうございます。
 
 ご指南、ありがとうございます。
 実は、パスの設定をいろいろ、試して見たのですが。
 リソース不足です。と言うエラーを吐いていました。
 弟のW2Kの環境でテストしたので何ともいえないのですが
 XPの環境で試して見ます。
 
 試験環境 XP-PRO SP1
 テストプリンター Canon LPB-1820
 
 検証結果をご報告させていただきますので
 今後の検討材料にご利用ください。
  
 

 

またまた、お騒がせいたします。

 プリンターポートの割付をバッチで行う方法ですが
 xp-PRO sp2で行った結果です。
 下記にバッチの内容を記載しました。

 検証してみたところうまく行きました。

 かなり強引な手段かなと思いますがご参考までに。

 ドライバーのINFファイルによる、バッチインストが出来ないのは・・なぜかな? 
 教えていただいたのに、再度挑戦いたします。

 参考

@echo off


CScript //H:CScript //S
pause
@echo プリンタ用IPアドレス IP_1.2.3.4を自動割付中です。
@echo rawポート9100で割付します。

\Windows\system32\prnport.vbs -a -r IP_1.2.3.4(rawポート9100) -h 1.2.3.4 -o raw -n 9100 -2d

@echo 終了しました。
pause

> トロさん
貴重なレポートありがとうございます。
ところで

> ドライバーのINFファイルによる、バッチインストが出来ないのは・・なぜかな? 
> 教えていただいたのに、再度挑戦いたします。

INF がローカルドライブにある場合はできるのですか?

お騒がせをいたしております、トロです。

ローカルドライブにあってもファイルサーバーにある
INFファイルでも症状は同じです。
サーバーのパスの設定はうまく行きました、ありがとうございました。
INFファイルは参照してくれてはいます、
しかし、インストール終了間際で必ず”引数が無効です”と表示されてインストール中断になってしまいます。
プリンタ名称もコピペで貼り付けているので間違いはないと思うのですが。
参考までにバッチの内容を記載いたします。

 rundll32 printui.dll,PrintUIEntry /if /b "Canon LASER SHOT LBP-1820" /f \\Server\ShareFolder\PrinterToAdd.inf
/r "g002" /m "Canon LASER SHOT LBP-1820" 

・・・見たところ引数の間違いとかはなさそうに見えますね。
ちなみにその inf を指定して、GUI からプリンタの追加はできるんですよね?
うーん、お力になれなくて申し訳ないです。

お騒がせいたしております、トロです。
 GUIからのプリンタ追加に変更してみたところ、うまく行きました。
 クライアントに作業してもらおうかなとマニュアル作成中です。
 いろいろとご指南いただいて、恐縮です。
クライアントに作業してもらうのですがここまで出来れば
後は、クライアントに作業してもらったほうが今後のIT教育に
いいかなと思っております。
 全自動とは行かないまでも、プリンタポートの作成がバッチで出来ればかなり作業も簡単になりました。
 プリンタドライバーのインストも簡単になり、本当に感謝しております。
 いろいろとお騒がせいたしました。ありがとうございます。

GUIからできるのであれば、
バッチ実行の際にカレントディレクトリをINFの位置に設定してやる必要があるのかも。
でもクライアントに作業してもらえるならそれもいいかもしれませんね。

はじめまして、のほほと申します。
トロさんと同じようにバッチでプリンタを追加するために、コマンドを入力しているのですが、やはり「引数が無効です」と表示されます。また、INFファイルがMicrosoftの「ロゴテストに合格していません」と表示され、その都度「OK」ボタンを押さないといけません。何か回避する方法はありませんか?だれか助けてください。

rundll32printui.dll,PrintUIEntry /if /b "DocuPrint401EX" /f "C:\Win2000\FXARTH.INF" /r "1.2.3.4" /m "FX DocuPrint 401 ART"

お騒がせしました。最後の行に/u を入れたら、すんなり登録できました。しかし、ポートの追加だけはかなり厄介です。どうにかならないものですかねぇ!
 誰かご存知のかた、教えてください。

WindowsXPの強化コマンドでプリンタのポートを追加及び削除することができるprnport.vbsの使い方を教えてください。

> のほほさん
> お騒がせしました。最後の行に/u を入れたら、すんなり登録できました。

あ、解決されたようですね。
ちょっと時間がとれてなくて、レスできてなくて申し訳ない。

> 誰かご存知のかた、教えてください。

不特定多数の人に質問を投げかけたいのであれば、
このサイトより、どこかの掲示板に行かれるのがよろしいかと。
あいにくここは個人的なメモなので・・・私しかいません 汗。
何かお役に立てることがあればよいのですが・・・
残念ながら私自身も仕事で必要だったりして、
最低限の情報をググったりして取って来ただけなので。
申し訳ないです。

また何かわかりましたら教えて頂けるとうれしいです。

はじめまして、shuujisと申します。
printuiの掲載を参考にさせて頂いておりますが、どうしても分からない事があり、是非お知恵をお借りできたらと思います。

早速、内容なのですが、

 Netwareサーバに接続しているプリンタをバッチにて自動追加したいと思っております。

 /in /n\\"サーバ名\プリンタ名"

という記述をしているのですが、どうしても下記のようなメッセージが表示され、ドライバを選択する画面が表示されてしまいます。

「プリンタのサーバに正しいドライバがインストールされていません。」

ドライバを選択する画面を表示させずにプリンタの追加をおこなうには、何か方法があるのでしょうか?

宜しくお願い致します。

のほほさん。

以下のテキストをメモ帳にコピペして拡張子を.batに変更して
みてできたバッチファイルを起動させてみてください。

ここから

@echo off
CScript //H:CScript //S
pause
@echo プリンタ用IPアドレス IP_1.2.3.4を自動割付中です。
@echo rawポート9100で割付します。
\Windows\system32\prnport.vbs -a -r IP_1.2.3.4(rawポート9100) -h 1.2.3.4 -o raw -n 9100 -2d


ここまで

IPアドレス1.2.3.4をRawポート 9100で割付するバッチです。

 ご参考までに

社内の各パソコンには、ローカルに1台プリンタが接続されています。
各パソコンのローカルプリンタを共有するためのbatファイルを作成して、各パソコンのスタートアップにファイル共有で配信して自動実行させて共有をかけたい。

OS はすべてWindows2000です

コメントする

※ コメントスパム対策のため、コメント本文はおはよう、こんにちわ、こんばんわのいずれかより始めるようにしてください。

name:
email:

※ 必要ですが、表示しません。

url:
情報を保存する ?