Hi all,
We experienced an issue due to the new windows update KB5006670. Symptoms were prints appearing as local downlevel documents and word/excel etc crashing when printing (funnily enough only to our Kyocera printers).
mPisano over at https://www.bleepingcomputer.com/forums/t/759880/kb5006670-network-printer-problems-again-this-month/page-5 posted a script and we can confirm it has sorted our issues so I thought I would make a post here in case anyone else has the same issues!
You will need to get the good files from a machine in the system32 folder that hasn't got the KB5006670 update (or one that you've uninstalled it from) and host them in a centralised location, you must also add .good at the end as it won't work otherwise (speaking from experience)!
We then added this script to a startup GPO, did a gpupdate /force and restarted.
Hope this helps someone.
@echo off
REM 10.0.19041.1288 bad file comes from KB5006670
:_start
copy "\\YourDomain.local\spoolerfix\win32spl.dll.good" C:\Windows\System32 /y
copy "\\YourDomain.local\spoolerfix\spoolsv.exe.good" C:\Windows\System32 /y
copy "\\YourDomain.local\spoolerfix\localspl.dll.good" C:\Windows\System32 /y
:wmicVersion pathToBinary [variableToSaveTo]
setlocal
:_test_win32spl
set "item1=C:\Windows\System32\win32spl.dll"
set "item1=%item1:\=\\%"
set "item2=C:\Windows\System32\win32spl.dll.good"
set "item2=%item2:\=\\%"
for /f "usebackq delims=" %%a in (`"WMIC DATAFILE WHERE name='%item1%' get Version /format:Textvaluelist"`) do (
for /f "delims=" %%# in ("%%a") do set "%%#")
set existver=%version%
set version=
for /f "usebackq delims=" %%a in (`"WMIC DATAFILE WHERE name='%item2%' get Version /format:Textvaluelist"`) do (
for /f "delims=" %%# in ("%%a") do set "%%#")
set goodver=%version%
set version=
echo %existver%
echo %goodver%
IF %goodver%==%existver% echo "Files are same version" && goto _test_localspl
IF "%existver%"=="10.0.19041.1288" echo "Files are bad version" && goto _fix_win32spl
IF NOT %goodver%==%existver% echo "Files are different version" && goto _test_localspl
:_test_localspl
set "item1=C:\Windows\System32\localspl.dll"
set "item1=%item1:\=\\%"
set "item2=C:\Windows\System32\localspl.dll.good"
set "item2=%item2:\=\\%"
for /f "usebackq delims=" %%a in (`"WMIC DATAFILE WHERE name='%item1%' get Version /format:Textvaluelist"`) do (
for /f "delims=" %%# in ("%%a") do set "%%#")
set existver=%version%
set version=
for /f "usebackq delims=" %%a in (`"WMIC DATAFILE WHERE name='%item2%' get Version /format:Textvaluelist"`) do (
for /f "delims=" %%# in ("%%a") do set "%%#")
set goodver=%version%
set version=
echo %existver%
echo %goodver%
IF %goodver%==%existver% echo "Files are same version" && goto _test_spoolsv
IF "%existver%"=="10.0.19041.1288" echo "Files are bad version" && goto _fix_localspl
IF NOT %goodver%==%existver% echo "Files are different version" && goto _test_spoolsv
:_test_spoolsv
set "item1=C:\Windows\System32\spoolsv.exe"
set "item1=%item1:\=\\%"
set "item2=C:\Windows\System32\spoolsv.exe.good"
set "item2=%item2:\=\\%"
for /f "usebackq delims=" %%a in (`"WMIC DATAFILE WHERE name='%item1%' get Version /format:Textvaluelist"`) do (
for /f "delims=" %%# in ("%%a") do set "%%#")
set existver=%version%
set version=
for /f "usebackq delims=" %%a in (`"WMIC DATAFILE WHERE name='%item2%' get Version /format:Textvaluelist"`) do (
for /f "delims=" %%# in ("%%a") do set "%%#")
set goodver=%version%
set version=
echo %existver%
echo %goodver%
IF %goodver%==%existver% echo "Files are same version" && goto _end
IF "%existver%"=="10.0.19041.1288" echo "Files are bad version" && goto _fix_spoolsv
IF NOT %goodver%==%existver% echo "Files are different version" && goto _end
goto _end
:_fix_win32spl
net stop spooler
timeout /t 3 /nobreak
Takeown /A /F C:\Windows\System32\win32spl.dll
icacls "C:\Windows\System32\win32spl.dll" /grant builtin\administrators:F
icacls "C:\Windows\System32\win32spl.dll" /grant SYSTEM:F
ren C:\Windows\System32\win32spl.dll win32spl-%existver%.dll
copy C:\Windows\System32\win32spl.dll.good C:\Windows\System32\win32spl.dll /Y
goto _test_localspl
:_fix_localspl
net stop spooler
timeout /t 3 /nobreak
Takeown /A /F C:\Windows\System32\localspl.dll
icacls "C:\Windows\System32\localspl.dll" /grant builtin\administrators:F
icacls "C:\Windows\System32\localspl.dll" /grant SYSTEM:F
ren C:\Windows\System32\localspl.dll localspl-%existver%.dll
copy C:\Windows\System32\localspl.dll.good C:\Windows\System32\localspl.dll /Y
goto _test_spoolsv
:_fix_spoolsv
net stop spooler
timeout /t 3 /nobreak
Takeown /A /F C:\Windows\System32\spoolsv.exe
icacls "C:\Windows\System32\spoolsv.exe" /grant builtin\administrators:F
icacls "C:\Windows\System32\spoolsv.exe" /grant SYSTEM:F
ren C:\Windows\System32\spoolsv.exe spoolsv-%existver%.exe
copy C:\Windows\System32\spoolsv.exe.good C:\Windows\System32\spoolsv.exe /Y
goto _end
:_end
net start spooler
exit