
先週、ネットワーク 共有プリンタ への 接続 を阻害するクライアント側のWindows更新を特定し、アンインストールすると共に、Windows Updateを最大の1ヶ月一時停止させ、暫定対応としました。今回はシステムファイルを直接入れ替えることで、Windows更新 KB5006670 の適用後もプリンタを利用出来るようする海外の事例を参考に実践してみました。
参考事例
今回参考にしたのはこちらのフォーラムの中でがっつりと組んだバッチを自ら公開している例です(Great Tnx!!)。
KB5006670によって入替えられてしまった win32spl.dll (プリントスプーラのシステムファイル実体!?)を、それ以前の頃のバイナリと入替えてしまおうというもの。バッチの前半でDLLのバージョンチェックをして、差し替えが必要なバージョンがインストールされている場合、スプーラサービスを止めた後、 takeown と icacls コマンドによってDLLファイルのアクセス権を適切に処理してから、少し古いバイナリへと入れ替える要領です。
差し替えに使うファイルは前回、KB5006670をアンインストールしたシステムから、自分で取り出しておくのが最も安全でしょう。入手できたDLLファイルのバージョン番号とファイルサイズは次の通り。
1 2 3 4 5 6 7 8 9 10 11 |
Windows 10 21H1 64bit %WINDIR%\System32\win32spl.dll KB5006670版(共有プリンタ接続不可) ver.10.0.19041.1288 920,064 byte KB5006670直前版(共有プリンタ接続可) ver.10.0.19041.1266 889,344 byte |
バッチをカスタマイズ
今回は、バッチと差し替え用DLLをLAN上の共有フォルダに配置し、作業者がエクスプローラでそのフォルダを開き、バッチを叩くだけというシナリオでの社内展開を想定しています。久しくDOSバッチを触っていないので、最低限のカスタマイズで済ませます。まずはバッチ冒頭でバッチと同じフォルダにあるDLLをシステムへコピーするように。
1 2 3 |
:_start REM copy \\SERVERNAME\SHARE\spoolerfix\win32spl.dll.good C:\Windows\System32 /y copy %~dp0\win32spl.dll.good %windir%\System32 /y |
そしてあまりありえないパターンですが、バッチを重複実行してしまった際に、上述のDLLが残ってしまうのでこれを削除してからバッチを終了する仕様に。そして最終行に pause を入れて、ダブルクリック実行時にDOSウィンドウが勝手に閉じてしまうのを止めます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
IF %goodver%==%existver% echo "Files are same version" && goto _removegood IF "%existver%"=="10.0.19041.1288" echo "Files are bad version" && goto _fixspooler IF NOT %goodver%==%existver% echo "Files are different version" && goto _removegood :_fixspooler net stop spooler timeout /t 3 /nobreak Takeown /A /F %windir%\System32\win32spl.dll icacls %windir%\System32\win32spl.dll /grant builtin\administrators:F icacls %windir%\System32\win32spl.dll /grant SYSTEM:F ren %windir%\System32\win32spl.dll win32spl-%existver%.dll copy %windir%\System32\win32spl.dll.good %windir%\System32\win32spl.dll /Y net start spooler goto _end :_removegood del %windir%\System32\win32spl.dll.good /y goto _end :_end pause |
Windows 10 21H1 で実践
それでは早速、KB5006670が適用されて共有プリンタに接続出来なくなっている、Windows 10クライアント(21H1 64bit)で試してみましょう。バッチと差し替えDLLはプリントサーバ上の共有フォルダに配置してあります。
現在インストールされている win32spl.dll を確認するとやはりv1288です。
ファイルエクスプローラで共有フォルダを開き、バッチファフィルを右クリック、管理者として実行します。
リモートリソースの実行に関するセキュリティ警告が出ますが実行します。
実行結果は次の通りで、途中で確認プロンプトなどはありませんが、何をしているのかは把握出来ると思います。
再びシステム内の win32spl.dll を確認するとv1266に入れ替わっていて、システム再起動せずとも共有プリンタが再び使えるようになりました。
今回はシステムファイルの差し替えというトリッキーな手段でしたが、Windows Updateを一時停止させたままでいるよりは、社内における世間体も多少は良くなるでしょう。バッチ化しておけば、ドメインユーザのログオンスクリプトに組み込んで作業を自動化してしまうことも可能ですが、もちろん自己責任で。
[2021.11.04追記]
2021年10月26日リリースの更新KB5006738を適用すれば、再びネットワーク共有プリンタを正常に使えるようになります。詳しくはこちらの記事にまとめました。