本帖最后由 Love0912 于 2025-3-19 15:10 编辑
这个工具分为两部分,1部分是备份工具,另一部分是修复助手,均是我自己写的,原则上来说是用于相互学习探讨目的,请不要商用,至少不要拿去卖钱。。这个主要是方便自己用,捎带手的方便其它做打印机维修或维护方面的同行使用的,因为很多备份文件它需要你自己去收集积累~~
最后需要多说一句的是,这个备份工具和修复助手必须放在一起(就是我提供的这两个原始文件)否则备份时可能会出现意料之外的错误。
好了,先介绍一下备份部分:
如图所见,备份功能相当简单,基本上就是一键备份的路子,之所以写个前言,是为了让你清楚在干什么同时防止误触发。。备份后会在这个文件的目录创建一个文件夹名称是系统的名称(比如WIN10专业版)+版本号(比如22H2),当然考虑到个别情况下会有重复版本号的情况,所以我又在这个基础上增加了内部版本号文件夹(比如19045.2728)这样可以有效备份到每一个系统对应版的的文件,方便后续处理。当然极端情况下你可能会重复备份,这时它也会有对应提示,比如问你是强制覆盖备份还是新建一个文件夹另行备份。。
好了,请看源代码:
[Asm] 纯文本查看 复制代码 @Echo off
setlocal enabledelayedexpansion
:qy
cls
echo.
echo 打印机服务文件备份专用程序 V1.0
echo ╔┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉╗
echo.┋ ┋
echo ┋ 本软件专门用于备份打印机相关文件,请勿放置于打印机专用文件夹使用 ┋
echo ┋ 请勿随意移动目录使用,防止备份文件夹顺序错乱。 ┋
echo ┋ 也就是说如果本程序在123这个文件下运行就始终在这个文件目录下运行 ┋
echo ┋ 请勿修改本处理器名称或执行主程序名称否则会导致备份失败的情况!! ┋
echo.┋ ┋
echo.┋ 〖1.查看当前系统相关信息〗 〖2.备份打印机相关文件〗 ┋
echo ┋ 〖3.打赏作者〗 ╔┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┋
echo ┋ ┋ Z.退出程序〖作者:二虎电脑〗
echo.╚┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉╝
:input
echo 请您根据需要选择对应的操作!!
echo.
set choice=
set /p choice= 请输入对应的按回车:
IF NOT "%Choice%"=="" SET Choice=%Choice:~0,1%
if /i "%choice%"=="1" goto ckxtxx
if /i "%choice%"=="2" goto bfwj
if /i "%choice%"=="3" goto zzds
if /i "%choice%"=="Z" goto end
goto qy
:bfwj
:: 请求管理员权限
fltmc >nul 2>&1 || (
echo 正在请求管理员权限...
mshta "javascript:var sh=new ActiveXObject('Shell.Application'); sh.ShellExecute('cmd.exe','/c %~s0','','runas',1);close()"
exit
)
:: 通用系统信息获取
for /f "tokens=2*" %%a in ('reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v ProductName 2^>nul') do set "OSName=%%b"
for /f "tokens=3" %%a in ('reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v DisplayVersion 2^>nul ^| findstr /i "DisplayVersion"') do set "DisplayVer=%%a"
for /f "delims=.] tokens=3,4" %%i in ('ver') do (
set BuildLab=%%i.%%j
)
:: 清理系统名称
set "CleanOSName=%OSName:Windows=Win%"
set "CleanOSName=%CleanOSName:?=%"
set "CleanOSName=%CleanOSName:?=%"
set "CleanOSName=%CleanOSName: =%"
:: 构建主文件夹名称
if defined DisplayVer (
set "MainFolder=%CleanOSName% %DisplayVer%"
) else (
set "MainFolder=%CleanOSName%"
)
:: 构建备份路径
set "BackupRoot=%~dp0%MainFolder%"
set "BackupPath=%BackupRoot%\%BuildLab%"
:: 创建主目录
if not exist "%BackupRoot%" (
mkdir "%BackupRoot%" || (
echo 主目录创建失败: %BackupRoot%
pause
exit /b 1
)
)
:: 处理重复备份目录
:CheckPath
if exist "%BackupPath%" (
echo 检测到现有备份目录: %BackupPath%
choice /c YNC /n /m "请选择操作 [Y]覆盖 [N]新建版本 [C]取消: "
if errorlevel 3 exit /b 0
if errorlevel 2 (
for /f "tokens=2 delims==" %%a in ('wmic os get localdatetime /value ^| findstr "[0-9]"') do set "_date=%%a"
call set "_date=%%_date:~0,8%%
call set "BackupPath=%%BackupPath%%_%%_date%%"
echo 新建备份目录: %BackupPath%
) else (
echo 正在清除旧备份...
rmdir /s /q "%BackupPath%"
)
)
if exist "%BackupPath%" goto CheckPath
mkdir "%BackupPath%" || (
echo 备份目录创建失败
pause
exit /b 1
)
::复制文件
copy /y "%windir%\System32\localspl.dll" "%BackupPath%\"
copy /y "%windir%\System32\srvsvc.dll" "%BackupPath%\"
copy /y "%windir%\System32\spoolss.dll" "%BackupPath%\"
copy /y "%windir%\System32\win32spl.dll" "%BackupPath%\"
copy /y "%~dp0打印机服务重置主程序V1.0.bat" "%BackupPath%\"
:: 生成系统信息报告
(for /f "tokens=2 delims==" %%a in ('wmic os get LocalDateTime /value') do set "BuildDate=%%a") >nul
set "BuildDate=%BuildDate:~0,4%-%BuildDate:~4,2%-%BuildDate:~6,2% %BuildDate:~8,2%:%BuildDate:~10,2%:%BuildDate:~12,2%"
(echo 系统名称: %OSName%
echo 显示版本: %DisplayVer%
echo 内部版本: %BuildLab%
echo 系统构建: %BuildDate%
echo 备份时间: %date% %time%
echo 备份路径: %BackupPath%) > "%BackupPath%\备份源系统详情.txt"
echo 备份完成于: %BackupPath%
explorer.exe /select,"%BackupPath%\备份源系统详情.txt"
echo 操作已完成,摁任意键将关闭程序。请从备份文件目录下运行该程序进行替换操作!!
pause
goto end
:ckxtxx
for /f "tokens=2*" %%a in ('reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v ProductName 2^>nul') do set "OSName=%%b"
for /f "tokens=3" %%a in ('reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v DisplayVersion 2^>nul ^| findstr /i "DisplayVersion"') do set "DisplayVer=%%a"
for /f "delims=.] tokens=3,4" %%i in ('ver') do (
set BuildLab=%%i.%%j
)
:: 清理系统名称
set "CleanOSName=%OSName:Windows=Win%"
set "CleanOSName=%CleanOSName:?=%"
set "CleanOSName=%CleanOSName:?=%"
set "CleanOSName=%CleanOSName: =%"
echo.
echo 系统名称: %OSName%
echo 显示版本: %DisplayVer%
echo 内部版本: %BuildLab%
echo.
echo 大概就是上述情况了,摁任意键结束查看返回个主菜单
pause
goto qy
:zzds
cls
start "" "https://pan.baidu.com/s/1os8bVQF6_4Zyc7poeXQchA?pwd=xts3"
echo.
echo 摁任意键系统将返回主界面!
goto qy
:end
exit /b
然后是主程序模块
这里要特别说明一句,运行的时候要找到对应的系统版本文件夹,运行那个文件夹里的主程序,根目录这个主程序只是用于配合备份程序使用的,如果直接运行的话,你执行替换操作的时候会报错或者出现其它状况的(其它的功能似乎不受影响,不过保险起见并不推荐你这么做!!)
这个不过多介绍了,简单说下各个功能:
1、对应的是相关服务状态的查看,方便你了解现在电脑是什么状态。
2、是替换打印机的相关文件并重置相关打印服务,预期目的使打印机相关的模块进行初始化
3、删除对应的打印机注册表,用于解决类似11B一类的错误,目的也是为了让打印机进行初始化
4、通用策略修复,用于修复系统完整性,概率解决因系统文件损坏导致的问题,常见修复57A、6BA报错,小概率结合第二条可以修复BCB报错
5、6项就不说了,用于关闭防火墙等防护避免运行受到阻拦。
下面请看源码
[Asm] 纯文本查看 复制代码 @Echo off
setlocal enabledelayedexpansion
:qy
cls
echo.
echo 打印机服务文件重置程序 V1.0
echo ╔┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉╗
echo.┋ ┋
echo ┋ 本软件采用替换打印机文件并删除驱动目录的方法将打印机相关服务进行重置┋
echo ┋ 用于解决普通方法无法修复打印机共享的方法。诸如BCB、6BA一类错误。 ┋
echo ┋ ┋
echo.┋ 〖1.查看当前服务状态〗 〖2.替换打印文件〗 ┋
echo ┋ 〖3.删除打印机服务注册表〗 〖4.通用标准修复方法〗 ┋
echo.┋ ╔┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┋
echo ┋ 〖5.关闭文件保护〗 〖6.恢复文件保护〗┋ Z.退出程序〖作者:二虎电脑〗
echo.╚┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉╝
:input
echo 请您根据需要选择对应的操作!!
echo.
set choice=
set /p choice= 请输入对应的按回车:
IF NOT "%Choice%"=="" SET Choice=%Choice:~0,1%
if /i "%choice%"=="1" goto ckgx
if /i "%choice%"=="2" goto wjth
if /i "%choice%"=="3" goto sczcb
if /i "%choice%"=="4" goto gffa
if /i "%choice%"=="5" goto gbbh
if /i "%choice%"=="6" goto bhkq
if /i "%choice%"=="Z" goto end
goto qy
::关闭保护模块
:gbbh
@echo off
:: 关闭防火墙
netsh advfirewall set allprofiles state off
:: 暴力突破文件保护
taskkill /f /im sppsvc.exe >nul 2>&1
sc config TrustedInstaller start= disabled >nul
takeown /f %Windir%\System32\sppsvc.exe /a >nul
icacls %Windir%\System32\sppsvc.exe /grant administrators:F >nul
echo 文件保护已关闭,按任意键返回主菜单!
goto qy
::保护开启模块
:bhkq
netsh advfirewall set allprofiles state on
sc config TrustedInstaller start= demand >nul
start /B TrustedInstaller
echo 文件保护已恢复,按任意键返回主菜单!
goto qy
::官方方案模块
:gffa
cls
echo.
echo 官方通用修复方案 V1.0
echo ╔┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉╗
echo.┋ ┋
echo ┋ 本方法利用重置打印机组件、关闭后台认证、修复系统文件完整性 ┋
echo ┋ 启用服务端口的方法实现打印机组件初始化的目的。 ┋
echo ┋ 系统文件完整性扫描 时间较长一般需要3~15分钟,完成后会自动转调操作界面! ! ┋
echo ┋ ┋
echo.┋ 〖1.常规修复〗 〖2.系统文件完整性扫描〗 〖3.返回主菜单〗 ┋
echo.┋ ╔┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┋
echo ┋ ┋ Z.退出程序〖作者:二虎电脑〗
echo.╚┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉╝
:input
echo 请您根据需要选择对应的操作!!
echo.
set choice=
set /p choice= 请输入对应的按回车:
IF NOT "%Choice%"=="" SET Choice=%Choice:~0,1%
if /i "%choice%"=="1" goto cgxf
if /i "%choice%"=="2" goto wzxsm
if /i "%choice%"=="3" goto qy
if /i "%choice%"=="Z" goto end
goto qy
:wzxsm
echo 程序执行中。。。
echo 系统修复用时较长,请耐心等待,一般需要3~15分钟,完成后会自动转调操作界面!!
:: 检查管理员权限
fltmc >nul 2>&1 || (
echo 请以管理员身份运行
pause
exit /b 1
)
cls
echo 正在执行系统健康扫描...
echo ---------------------------------------------------
:: 阶段一:尝试运行SFC扫描
sfc /scannow | findstr /i "Windows资源保护无法启动修复服务" >nul
if %errorlevel% equ 0 (
call :fix_settings
) else (
if %errorlevel% equ 1 (
echo [√] SFC已成功完成扫描,未发现损坏文件
call :success
) else (
echo [!] SFC发现并修复了系统文件,需要重启生效
call :success
)
)
exit /b
::-----------------------------------------------------
:fix_settings
echo ---------------------------------------------------
echo [!] 检测到SFC服务启动失败,开始执行深度修复...
:: 修复步骤1:配置Windows Modules Installer服务
echo ■ 正在激活系统维护服务...
sc config TrustedInstaller start= auto >nul
net start TrustedInstaller >nul 2>&1
:: 修复步骤2:修改注册表参数
echo ■ 正在优化系统注册表配置...
reg add "HKLM\SYSTEM\CurrentControlSet\Control" /v RegistrySizeLimit /t REG_DWORD /d 4294967295 /f >nul 2>&1
:: 修复步骤3:重置服务缓存
echo ■ 正在刷新系统服务缓存...
net stop wuauserv >nul 2>&1
net stop bits >nul 2>&1
del /f /q %windir%\SoftwareDistribution\*.* >nul 2>&1
echo ---------------------------------------------------
echo 修复操作已完成,请按以下步骤操作:
echo 1. 保存所有打开的文件
echo 2. 单击确定后电脑将自动重启
echo 3. 重启后请再次运行本脚本
choice /t 10 /d y /c yn >nul
shutdown /r /t 0
exit /b
::-----------------------------------------------------
:success
echo ---------------------------------------------------
echo 操作状态报告:
echo ?? 系统文件完整性:已验证
echo ?? 建议操作:重启电脑使设置生效
echo ---------------------------------------------------
choice /t 15 /c yn /d y /m "是否立即重启电脑?默认15秒后自动重启"
if %errorlevel% equ 1 (
shutdown /r /t 0
) else (
exit /b
)
:cgxf
cls
:: 重置打印组件
powershell -Command "Stop-Service -Name Spooler -Force -ErrorAction SilentlyContinue"
del /Q "%windir%\System32\spool\PRINTERS\*.*" >nul 2>&1
powershell -Command "Start-Service -Name Spooler -ErrorAction SilentlyContinue"
timeout /t 5 /nobreak >nul
:: 注册表修改
reg add "HKLM\SYSTEM\CurrentControlSet\Control\Print" /v RpcAuthnLevelPrivacyEnabled /t REG_DWORD /d 0 /f
reg add "HKLM\SYSTEM\CurrentControlSet\Control\Lsa" /v LmCompatibilityLevel /t REG_DWORD /d 3 /f
:: 防火墙规则
netsh advfirewall firewall add rule name="PrintSMB" dir=in action=allow protocol=TCP localport=139,445,515
echo 如果报错6BA,请修改计算机配置 > 管理模板 > 打印机 > 配置RPC连接设置 > 设为"无认证"
echo 修复完毕,按任意返回主菜单,建议重启电脑使其生效!!
pause
goto qy
::文件替换模块
:wjth
Echo --------------------------------------------------------------------------
setlocal enabledelayedexpansion
Echo --------------------------------------------------------------------------
Echo 停止打印服务
net stop spooler
Echo --------------------------------------------------------------------------
Echo 替换 localspl.dll
Echo 替换 srvsvc.dll
Echo 替换 spoolss.dll
Echo 替换 win32spl.dll
Echo --------------------------------------------------------------------------
timeout /t 3 /nobreak
Takeown /A /F %windir%\System32\localspl.dll
Takeown /A /F %windir%\System32\srvsvc.dll
Takeown /A /F %windir%\System32\spoolss.dll
Takeown /A /F %windir%\System32\win32spl.dll
cls "%windir%\System32\localspl.dll" /grant "administrators":F
icacls "%windir%\System32\srvsvc.dll" /grant "administrators":F
icacls "%windir%\System32\spoolss.dll" /grant "administrators":F
icacls "%windir%\System32\win32spl.dll" /grant "administrators":F
icacls "%windir%\System32\localspl.dll" /grant SYSTEM:F
icacls "%windir%\System32\srvsvc.dll" /grant SYSTEM:F
icacls "%windir%\System32\spoolss.dll" /grant SYSTEM:F
icacls "%windir%\System32\win32spl.dll" /grant SYSTEM:F
ren %windir%\System32\localspl.dll localspl.dll.old
ren %windir%\System32\srvsvc.dll srvsvc.dll.old
ren %windir%\System32\spoolss.dll spoolss.dll.old
ren %windir%\System32\win32spl.dll win32spl.dll.old
opy "%~dp0\localspl.dll" %windir%\System32\localspl.dll /Y
copy "%~dp0\srvsvc.dll" %windir%\System32\srvsvc.dll /Y
copy "%~dp0\spoolss.dll" %windir%\System32\spoolss.dll /Y
copy "%~dp0\win32spl.dll" %windir%\System32\win32spl.dll /Y
net stop LanmanServer && net start LanmanServer
regsvr32 /s localspl.dll
regsvr32 /s srvsvc.dll
regsvr32 /s spoolss.dll
regsvr32 /s win32spl.dll
regsvr32 /s softpub.dll
regsvr32 /s wintrust.dll
regsvr32 /s initpki.dll
Echo --------------------------------------------------------------------------
Echo 增加注册表 RpcAuthnLevelPrivacyEnabled = 0
Echo --------------------------------------------------------------------------
rem add regkey
reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print" /v RpcAuthnLevelPrivacyEnabled /t REG_DWORD /d 0 /f
Echo --------------------------------------------------------------------------
Echo 启动打印服务
net start spooler
Echo --------------------------------------------------------------------------
Echo 完成操作,请进行打印测试吧!
pause
goto qy
:zzds
cls
start "" "https://pan.baidu.com/s/1os8bVQF6_4Zyc7poeXQchA?pwd=xts3"
echo.
echo 摁任意键系统将返回主界面!
goto qy
:ckgx
sc qc spooler
reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Applets\Regedit" /v "LastKey" /d "计算机\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Spooler" /f
start regedit.exe
echo 请自行核对这两个键值是否一致(观测DEPENDENCIES【服务依赖性】与注册表Spooler目录下DependOnService键值是否一样),摁任意键返回主菜单。
pause
goto qy
:sczcb
echo 即将开始删除注册表中打印机相关项,重启后会重置该注册表。
pause
rem 删除Environments分支
reg delete "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Environments" /f
rem 使用reg delete命令删除指定注册表项,/f参数表示强制删除,不提示确认信息
rem 删除Printers分支
reg delete "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Printers" /f
rem 同样使用reg delete命令删除指定注册表项,/f参数强制删除
echo 注册表项删除操作已完成。重启电脑后生效。需重新安装打印机驱动
pause
goto qy
rem 提示用户操作完成并暂停,等待用户查看信息后手动关闭窗口
大概就是这样了,叙述完毕,这里只做谈论研究,不提供下载地址了。。有需要的小伙伴自己转换去吧【源码都给你了,别说整不成!!】另外请不要修改里面的代码参数,尤其我的作者署名和打赏链接(虽然从来没收到过)但是请给我留下最后的体面
|