プリンタドライバをバッチでインストール

#はじめに
毎回ドライバーを探して、setup.exeを起動して・・・がめんどくさくなってきて、バッチファイルでインストールすることにしました。
社内にプリンタが多数存在するというのも原因の1つではあるのですが、プリンタを必要とするたびにリモートか直接でドライバを導入していたので、最終的には現地か当人で必要なプリンタのバッチファイルを実行できれば、仕事が減るだろうという考えから・・・。
方々を探すといくつか見つかったのですが、少しだけ実用性を上げているつもりです。

しかしながら、現状の社内でActiveDirectoryが導入されていないというのもあって、環境がバラバラだったことが災いし、四苦八苦しました。
基本的にはコピペすれば動きますが、***[　]***の部分は自環境に合わせて変更してください。

**例：****[IPアドレス]　→　192.168.100.100**

####2020年1月20日追記
rundll32.exeを使った方法が、どうしてもうまくいかない(というか、ドライバインストールがうまくいかない)ので、削除しました。
少なくとも、こちらだとうまく動きます。
何が悪いのか、結局わからず・・・(泣)

####2020年1月23日追記
なんとなく見えてきました。
どうもドライバの署名が「WHQL署名」なのか「Authenticode署名」なのかが影響しているようです。
「WHQL署名」であれば問題なく進むのですが、「Authenticode署名」だと、途中でセキュリティ警告のボックスが出てくるので、バッチだとそこがクリアできないので、結果ドライバがインストールできないという状況だったようです。
なので、署名を追加するコマンドを追加しました。
ただし、ドライバから署名を抽出はできない為、一度は通常のインストールを行って署名をエクスポートして用意するという必要があります。
やり方は**[ドライバー インストール時のセキュリティ ダイアログにまつわるお話](https://social.msdn.microsoft.com/Forums/sqlserver/ja-JP/49fb4b9e-a06d-429a-ac75-6cb33b8663c2/-?forum=wdksupportteamja)**を参考にさせていただきました。
もしかすると、rundll32.exeもそれが原因だったかもしれませんが、今から全部書き直す元気はないです(泣)

後、**要管理者権限**ですので、ショートカットからの実行をお勧めします。

####2020年6月11日追記
気づいたら、閲覧数が3000前である・・・思った以上に見ていただいている方がいるのか、それとも他の理由なのか・・・
ちなみに、また新しく1行追加しました。
それは、悪名高き？**「Windowsで通常使うプリンターを管理する」**のコントロールです。
まぁ、いらないと思っているのは自分だけかもしれませんが・・・。
ただし、これに関しては**レジストリを触りますので自己責任でお願いします**。
少なくとも自社の環境では動作しています。
次に探しているのは、Windows10でネットワーク内にあるプリンタのドライバを勝手にインストールする機能を止める方法です・・・あれはまじでいらない・・・
毎回、ドライバを消す手間が増えるのみなんですよね
どなたかご存じの方がいらっしゃれば助かります。

####2020年10月9日追記
そして気付くと、閲覧数が6000を超えているわけである。
え、そんなに需要あったの？それともそれが普通なの？
ということで、さらに1行追加しました。
@kuwata98 さんにアドバイスいただきました、ありがとうございます。
前にも書いた、ネットワーク内にあるプリンタのドライバを勝手にインストールする機能を止めるやつです。
ただ、社内的には問題があって、あまり有効じゃなかったです。
というのも、マスターディスクを用意しているのが私ではないのですが、その方が作るマスターディスクの段階でプリンタ一杯である・・・。
しかも、かなりの年上の方なので、あまり意見もできず・・・あぁぁぁTT
きっと有効であると信じて公開します。
ただ、バッチファイルそのものは社内でも使っている人がいて、仕事は多少楽になりました。

#テスト環境
- Windows7 32bit
- Windows7 64bit
- Windows10 64bit

#手順その1
まずはINFファイルを探します。
これは、メーカー等によって違うので、がんばって探してくださいとしか言えないです。
その中にある、下記のような行を探します。

```
"KONICA MINOLTA C658SeriesPCL" = KOAXPJ_G.DLL.NTamd64, USBPRINT\KONICA_MINOLTAC658SeEFA0, KONICA_MINOLTAC658SeEFA0
"KONICA MINOLTA C368SeriesPCL" = KOAXPJ_G.DLL.NTamd64, USBPRINT\KONICA_MINOLTAC368Se6AA6, KONICA_MINOLTAC368Se6AA6
"KONICA MINOLTA C287SeriesPCL" = KOAXPJ_G.DLL.NTamd64, USBPRINT\KONICA_MINOLTAC287Se76D5, KONICA_MINOLTAC287Se76D5
"KONICA MINOLTA C3851SeriesPCL" = KOAXPJ_G.DLL.NTamd64, USBPRINT\KONICA_MINOLTAC3851SB2DC, KONICA_MINOLTAC3851SB2DC
"KONICA MINOLTA C759SeriesPCL" = KOAXPJ_G.DLL.NTamd64, USBPRINT\KONICA_MINOLTAC759Se07BC, KONICA_MINOLTAC759Se07BC
```

必要になるのは前半部分の**[KONICA MINOLTA C759SeriesPCL]**になります。
これが下記でいうところの**[INFファイル内のドライバ名称]**に該当します。
これは、メーカーや型番によるので、随時読み解いてください。

#手順その2

相対パスにしています。
絶対パスは、ここに限った話ではありませんが、どうしてもという場合を除いて避けるべきだと考えています。
じゃないと、何かの都合でファイルパスが変わると全部手書き修正になります。

なお、

- 32bit or 64bitの判定
- ポートの設定
- ドライバのインストール
- プリンタの追加
- テスト印刷
- 既定に設定する

まで行っています。
32bit判定は、最近の環境だと不必要かもしれません。
少なくとも、私が今使っている本番環境では削除しました。

##追加方法
```[デバイス一覧に表示されるプリンタ名]&nbsp;追加.bat
@echo off

rem 「Windowsで通常使うプリンターを管理する」をオフにする
reg add "HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows" /v LegacyDefaultPrinterMode /t "REG_DWORD" /d "1" /f

rem 「ネットワークに接続されているデバイスの自動セットアップ」をオフにする
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\NcdAutoSetup\Private" /v AutoSetup /t "REG_DWORD" /d "0" /f

rem 今のディレクトリを取得
set CURRENT_DIR=%~dp0

cd /d C:\Windows\System32\Printing_Admin_Scripts\ja-JP

rem 64bitを判定
if %PROCESSOR_ARCHITECTURE% equ AMD64 (

rem プリンタポートを追加
cscript prnport.vbs -a -r [ポート名] -h [IPアドレス] -o raw -n 9100

rem 証明書を追加
certutil -addstore "TrustedPublisher" "%CURENT_DIR%Driver\Authenticode\hogehoge.cer"

rem ドライバのインストール
cscript prndrvr.vbs -a -m "[INFファイル内のドライバ名称]" -v 3 -i "[ファイルの場所(例：%CURRENT_DIR%driver\hogehoge 64bit\***.INF)]"

rem プリンタの追加
cscript prnmngr.vbs -a -p "[デバイス一覧に表示されるプリンタ名]" -m "[INFファイル内のドライバ名称]" -r [ポート名]

rem 32bitを判定
) else if %PROCESSOR_ARCHITECTURE% equ x86 (

rem プリンタポートを追加
cscript prnport.vbs -a -r [ポート名] -h [IPアドレス] -o raw -n 9100

rem 証明書を追加
certutil -addstore "TrustedPublisher" "%CURENT_DIR%Driver\Authenticode\hogehoge.cer"

rem ドライバのインストール
cscript prndrvr.vbs -a -m "[INFファイル内のドライバ名称]" -v 3 -i "[ファイルの場所(例：%CURRENT_DIR%driver\hogehoge 32bit\***.INF)]"

rem プリンタの追加
cscript prnmngr.vbs -a -p "[デバイス一覧に表示されるプリンタ名]" -m "[INFファイル内のドライバ名称]" -r [ポート名]

rem どちらでもない場合は追加しない
) else (
echo.
echo *------------------------------------------*
echo ^|環境未対応の為、〇〇まで連絡してください。^|
echo ^|何かキーを押すと終了します。              ^|
echo *------------------------------------------*
pause > null
exit )

rem テスト印刷
rundll32.exe printui.dll,PrintUIEntry /k /n "[デバイス一覧に表示されるプリンタ名]"

rem プリンタを既定にする
rundll32.exe printui.dll,PrintUIEntry /y /n "[デバイス一覧に表示されるプリンタ名]"

echo.
echo *----------------------------*
echo ^|プリンタが追加されました。  ^|
echo ^|何かキーを押すと終了します。^|
echo *----------------------------*

rem プリンタのプロパティを開く
rundll32.exe printui.dll,PrintUIEntry /p /n "[デバイス一覧に表示されるプリンタ名]"

pause > nul
```
##削除方法
```[デバイス一覧に表示されるプリンタ名]&nbsp;削除.bat
@echo off
cd /d C:\Windows\System32\Printing_Admin_Scripts\ja-JP

rem プリンタを削除
cscript prnmngr.vbs -d -p "[デバイス一覧に表示されるプリンタ名]"

rem プリンタポートを削除
cscript prnport.vbs -d -r [ポート名]
```
ポート番号は削除しておかないと、次回以降にプリンタを追加する際に、エラーになります。
ポートのあるなしで別バッチにするとか、判定を入れてもいいけど、そんなことするくらいなら消しといたほうがいいと思う。

#最後に
結局、この方法に落ち着きました。
先にも書きましたが、rundll32.exeだとプリンタドライバがうまくインストールできない原因がわからず・・・。
まぁ、実務上でいえば動きさえすればどっちでもいいかという話ではありますよね(笑)

ちなみに、あなたの会社ではすでにWindows10への移行は終わりましたか？
うちはまだまだです。
残り台数はー・・・すごい数だなぁ(泣)
もし同様に、たくさんのこってるという仲間？の手助けに、少しでもなれば幸いです。