もっと詳しく

先週、ネットワーク 共有プリンタ への 接続 を阻害するクライアント側のWindows更新を特定し、アンインストールすると共に、Windows Updateを最大の1ヶ月一時停止させ、暫定対応としました。今回はシステムファイルを直接入れ替えることで、Windows更新 KB5006670 の適用後もプリンタを利用出来るようする海外の事例を参考に実践してみました。

参考事例

今回参考にしたのはこちらのフォーラムの中でがっつりと組んだバッチを自ら公開している例です(Great Tnx!!)。

Page 2 of 9 – KB5006670 – Network Printer Problems Again This Month – posted in Windows 10 Support: Hello! Im also having this problem today. When stupid Microsoft released the patch KB5005565 last month the printers host computer didnt let anyone print, my fix was to uninstall this patch from the host computer and posponed the updates for 35 days (thats the max windows update lets you pospone). So today, with the release of patch KB5006670 im having the same proble…
KB5006670 – Network Printer Problems Again This Month – Page 2 – Windows 10 S… – BleepingComputer.com

KB5006670によって入替えられてしまった

win32spl.dll

 (プリントスプーラのシステムファイル実体!?)を、それ以前の頃のバイナリと入替えてしまおうというもの。バッチの前半でDLLのバージョンチェックをして、差し替えが必要なバージョンがインストールされている場合、スプーラサービスを止めた後、

takeown

icacls

 コマンドによってDLLファイルのアクセス権を適切に処理してから、少し古いバイナリへと入れ替える要領です。

差し替えに使うファイルは前回、KB5006670をアンインストールしたシステムから、自分で取り出しておくのが最も安全でしょう。入手できたDLLファイルのバージョン番号とファイルサイズは次の通り。

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をシステムへコピーするように。

:_start
REM copy \\SERVERNAME\SHARE\spoolerfix\win32spl.dll.good C:\Windows\System32 /y
copy %~dp0\win32spl.dll.good %windir%\System32 /y

そしてあまりありえないパターンですが、バッチを重複実行してしまった際に、上述のDLLが残ってしまうのでこれを削除してからバッチを終了する仕様に。そして最終行に

pause

を入れて、ダブルクリック実行時にDOSウィンドウが勝手に閉じてしまうのを止めます。

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はプリントサーバ上の共有フォルダに配置してあります。

図1.Windows Update 履歴にKB5006670

図1.Windows Update 履歴にKB5006670

現在インストールされている

win32spl.dll

 を確認するとやはりv1288です。

図2.win32spl.dll v1288

図2.win32spl.dll v1288

ファイルエクスプローラで共有フォルダを開き、バッチファフィルを右クリック、管理者として実行します。

図3.バッチを管理者として実行

図3.バッチを管理者として実行

リモートリソースの実行に関するセキュリティ警告が出ますが実行します。

図4.リモートリソース実行に関するセキュリティ警告

図4.リモートリソース実行に関するセキュリティ警告

実行結果は次の通りで、途中で確認プロンプトなどはありませんが、何をしているのかは把握出来ると思います。

図5.DLL入れ替えバッチ実行結果

図5.DLL入れ替えバッチ実行結果

再びシステム内の

win32spl.dll

 を確認するとv1266に入れ替わっていて、システム再起動せずとも共有プリンタが再び使えるようになりました。

図6.win32spl.dll v1266

図6.win32spl.dll v1266

今回はシステムファイルの差し替えというトリッキーな手段でしたが、Windows Updateを一時停止させたままでいるよりは、社内における世間体も多少は良くなるでしょう。バッチ化しておけば、ドメインユーザのログオンスクリプトに組み込んで作業を自動化してしまうことも可能ですが、もちろん自己責任で。

投稿 KB5006670適用後もシステムファイルを入れ替えネットワーク共有プリンタへ接続できるようにするFun Scripting 2.0 に最初に表示されました。