Windows下自动挂载Synology WebDAV并修复环境脚本
1 简介
在Windows环境中通过WebDAV协议挂载自家群辉(Snology)NAS共享文件夹时,开机会断连,开机每次都要手动重连 ,额外下载其他第三方软件又太麻烦。故根据网资bat教程料研究出下面脚本。
ps:自己需要开机启动 keepass 所以脚本中有相关逻辑。可以通过置空 keepass路径跳过这步。
2 功能
- 自动请求管理员权限 – 脚本运行时自动提升权限,无需手动右键“以管理员身份运行”。
- WebClient服务自检与修复 – 检查服务状态,若未运行则启动并设为自动启动。
- 注册表BasicAuthLevel修复 – 自动检测并设置
BasicAuthLevel=2,开启基本认证支持。
- 重试机制 – 挂载失败时自动重试(默认12次,间隔10秒),应对网络波动。
- 冲突连接清理 – 删除已存在的驱动器映射及主机级SMB连接,避免凭据冲突。
- NAS可达性等待 – 挂载前持续ping目标主机,直到网络可达。
- 详细日志记录 – 记录每一步操作及
net use原始输出,日志文件按天分割,自动清理旧日志(保留最近30个)。
- 外部程序联动 – 挂载成功后自动启动KeePass(路径可配置) 也可以改成启动别的应用。
3 工作原理
脚本基于Windows原生net use命令挂载WebDAV网络位置。WebDAV依赖WebClient服务,而该服务默认禁用基本认证(HTTP Basic Auth),因此需要通过修改注册表项HKLM\SYSTEM\CurrentControlSet\Services\WebClient\Parameters\BasicAuthLevel为2(启用基本认证)。
核心流程如下:
- 提权检查 – 通过
net session判断是否为管理员,否则调用PowerShell重新以管理员权限启动。
- 环境修复 – 启动WebClient服务,修正注册表值,必要时重启服务使配置生效。
- 网络准备 – 解析NAS主机IP(诊断用),等待ping通,清理旧映射和SMB凭据。
- 循环挂载 – 调用
net use命令,将输出重定向到临时文件并记录日志,根据错误码输出友好提示。若失败则等待后重试,直到成功或达到最大次数。
- 后置动作 – 挂载成功后检查KeePass进程,若未运行则按配置路径启动。
- 日志维护 – 所有日志写入按日期命名的文件,启动时删除超出数量的旧日志。
4 环境依赖
- 操作系统:Windows 7 / 8 / 10 / 11(需包含WebClient服务组件)
- 权限:管理员权限(脚本自动获取)
- 网络:能够访问目标NAS的WebDAV端口(示例中为5005)
- 可选:KeePass(若需要自动启动,需安装并配置路径)
5 安装与配置
5.1 获取脚本
将以下代码保存为mount_nas.bat(注意:下文代码已脱敏,请替换为实际值)。
@echo off
chcp 65001 >nul
setlocal enabledelayedexpansion
REM ========= 自动请求管理员权限 =========
net session >nul 2>&1
if %errorlevel% neq 0 (
echo 请求管理员权限...
powershell -Command "Start-Process -FilePath '%~f0' -Verb RunAs"
exit /b
)
title Synology WebDAV 自动挂载
color 0A
REM ========= 用户配置区域 =========
set NAS_URL=\\your-nas-domain@5005\DavWWWRoot
set NAS_USERNAME=your-username
set NAS_PASSWORD=your-password
set DRIVE_LETTER=Z:
set MAX_RETRIES=12
set RETRY_INTERVAL=10
set LOG_DIR=C:\YourLogPath
set MAX_LOG_COUNT=30
set KEEPASS_PATH="C:\Program Files\KeePass\KeePass.exe"
set NAS_HOST=your-nas-domain
REM ================================
... (其余脚本逻辑保持不变)
5.2 修改配置变量
| 变量名 |
说明 |
示例值 |
NAS_URL |
WebDAV服务地址,格式为 \\主机@端口\DavWWWRoot |
\\synology.example.com@5005\DavWWWRoot |
NAS_USERNAME |
NAS登录用户名 |
john |
NAS_PASSWORD |
NAS密码(明文,建议设置文件权限为仅管理员可读) |
MyP@ssw0rd |
DRIVE_LETTER |
要映射的盘符 |
Z: |
MAX_RETRIES |
最大重试次数 |
12 |
RETRY_INTERVAL |
重试间隔(秒) |
10 |
LOG_DIR |
日志存放目录 |
E:\Logs\NAS_Mount |
MAX_LOG_COUNT |
保留的日志文件最大数量 |
30 |
KEEPASS_PATH |
KeePass可执行文件路径(不需要自动启动可留空) |
"D:\KeePass\KeePass.exe" |
NAS_HOST |
用于ping检测的主机名或IP |
synology.example.com |
⚠️ 安全提示:密码以明文存储,请确保.bat文件所在目录的访问权限严格受控,或使用Windows凭据管理器替代硬编码密码。
5.3 放置脚本
建议将脚本存放在固定路径(如C:\Scripts\),并通过任务计划程序设置开机启动或登录时运行。
6 使用方法
6.1 基本命令格式
mount_nas.bat
脚本无需任何命令行参数。双击运行后,会自动请求管理员权限(UAC弹窗),然后依次执行环境修复、挂载、启动KeePass等步骤。
6.2 参数说明
本脚本通过修改文件头部的变量进行配置(见上表),无运行时参数。
6.3 典型使用示例
示例1:默认挂载到Z:盘并启动KeePass
配置好NAS信息后,直接运行脚本。控制台输出类似:
请求管理员权限...
[14:32:05] ========================================
[14:32:05] Synology WebDAV 挂载(自动修复环境)
[14:32:05] 时间: 2026/04/24 周六 14:32:05.12
[14:32:05] ========================================
[14:32:05] [环境] WebClient 服务已在运行
[14:32:05] [环境] BasicAuthLevel 已是 2,无需修改
[14:32:05] [网络] NAS IPv4 地址: 192.168.1.2
[14:32:05] [清理] 移除旧映射(如有)
[14:32:06] [网络] 等待 NAS 可达...
[14:32:08] [网络] NAS 已在线
[14:32:08] [挂载] 第 1 / 12 次尝试
[14:32:10] [成功] 挂载成功
[14:32:10] [最终状态] 已映射 Z: 到 \\synology.example.com@5005\DavWWWRoot
[14:32:10] [启动] KeePass 已启动
脚本执行完毕,日志: E:\Logs\NAS_Mount\NAS_Mount_20260424.log
示例2:挂载到Y:盘,不启动KeePass
修改配置:
set DRIVE_LETTER=Y:
set KEEPASS_PATH=""
然后运行脚本,挂载成功后不会再尝试启动KeePass。
7 输出说明
- 控制台输出:实时显示各阶段状态,包括错误提示、重试信息、最终结果。
- 日志文件:位于
%LOG_DIR%\NAS_Mount_YYYYMMDD.log,记录每一行带时间戳的详细输出,以及net use命令的原始返回信息,便于故障排查。
- 驱动器映射:成功后在“此电脑”中出现指定的网络驱动器。
- KeePass进程:若配置了有效路径且未运行,则启动KeePass。
8 BAT 源码
@echo off
chcp 65001 >nul
setlocal enabledelayedexpansion
REM ========= 自动请求管理员权限(修复空路径问题) =========
net session >nul 2>&1
if %errorlevel% neq 0 (
echo 请求管理员权限...
powershell -Command "Start-Process -FilePath '%~f0' -Verb RunAs"
exit /b
)
title Synology WebDAV 自动挂载(全自动修复)
color 0A
REM ========= 配置(请根据实际修改以下变量) =========
set NAS_URL=\\your-nas-domain.com@5005\DavWWWRoot
set NAS_USERNAME=your-username
set NAS_PASSWORD=your-password
set DRIVE_LETTER=Z:
set MAX_RETRIES=12
set RETRY_INTERVAL=10
set LOG_DIR=C:\YourLogPath
set MAX_LOG_COUNT=30
set KEEPASS_PATH="C:\Program Files\KeePass\KeePass.exe"
set NAS_HOST=your-nas-domain.com
REM ================================================
REM 创建日志目录
if not exist "%LOG_DIR%" mkdir "%LOG_DIR%"
for /f "tokens=2 delims==" %%I in ('wmic os get localdatetime /format:list') do set datetime=%%I
set LOG_FILE=%LOG_DIR%\NAS_Mount_%datetime:~0,8%.log
call :cleanup_old_logs
call :log_message "========================================"
call :log_message "Synology WebDAV 挂载(自动修复环境)"
call :log_message "时间: %date% %time%"
call :log_message "========================================"
REM ========= 1. 检查并修复 WebClient 服务 =========
call :log_message "[环境] 检查 WebClient 服务..."
sc query WebClient | find "RUNNING" >nul
if %errorlevel% neq 0 (
call :log_message "[环境] WebClient 未运行,尝试启动..."
sc config WebClient start= auto >nul 2>&1
net start WebClient >nul 2>&1
if %errorlevel% neq 0 (
call :log_message "[错误] 无法启动 WebClient 服务,请确认系统服务未被禁用。"
echo [错误] WebClient 服务不可用,挂载可能失败。
) else (
call :log_message "[环境] WebClient 服务已启动并设为自动"
)
) else (
call :log_message "[环境] WebClient 服务已在运行"
)
REM ========= 2. 修复注册表 BasicAuthLevel =========
call :log_message "[环境] 检查注册表 BasicAuthLevel..."
reg query "HKLM\SYSTEM\CurrentControlSet\Services\WebClient\Parameters" /v BasicAuthLevel >nul 2>&1
if %errorlevel% neq 0 (
call :log_message "[环境] BasicAuthLevel 不存在,创建并设为 2"
reg add "HKLM\SYSTEM\CurrentControlSet\Services\WebClient\Parameters" /v BasicAuthLevel /t REG_DWORD /d 2 /f >nul 2>&1
set NEED_RESTART=1
) else (
for /f "tokens=3" %%a in ('reg query "HKLM\SYSTEM\CurrentControlSet\Services\WebClient\Parameters" /v BasicAuthLevel ^| find "BasicAuthLevel"') do set CURRENT_LEVEL=%%a
if "!CURRENT_LEVEL!" neq "0x2" (
call :log_message "[环境] BasicAuthLevel 当前值 !CURRENT_LEVEL!,设置为 2"
reg add "HKLM\SYSTEM\CurrentControlSet\Services\WebClient\Parameters" /v BasicAuthLevel /t REG_DWORD /d 2 /f >nul 2>&1
set NEED_RESTART=1
) else (
call :log_message "[环境] BasicAuthLevel 已是 2,无需修改"
)
)
if defined NEED_RESTART (
call :log_message "[环境] 重启 WebClient 服务使注册表生效..."
net stop WebClient >nul 2>&1
net start WebClient >nul 2>&1
if %errorlevel% neq 0 (
call :log_message "[错误] 重启 WebClient 服务失败"
) else (
call :log_message "[环境] WebClient 服务已重启"
)
)
REM ========= 3. 获取 IPv4 地址(诊断用) =========
call :log_message "[网络] 检测 IPv4 地址..."
set NAS_IPV4=
for /f "tokens=2 delims=:" %%a in ('ping -4 %NAS_HOST% -n 1 ^| find "Reply from"') do (
set NAS_IPV4=%%a
set NAS_IPV4=!NAS_IPV4: =!
)
if defined NAS_IPV4 (
call :log_message "[网络] NAS IPv4 地址: %NAS_IPV4%"
) else (
call :log_message "[网络] 无法获取 IPv4 地址,将使用主机名(可能走 IPv6)"
)
REM ========= 4. 检查是否已挂载且可用 =========
net use %DRIVE_LETTER% >nul 2>&1
if not errorlevel 1 (
dir %DRIVE_LETTER%\ >nul 2>&1
if not errorlevel 1 (
call :log_message "[跳过] 驱动器 %DRIVE_LETTER% 已就绪"
goto :launch_keepass
) else (
call :log_message "[警告] 驱动器存在但不可访问,尝试重新挂载"
net use %DRIVE_LETTER% /delete /y >nul 2>&1
)
) else (
call :log_message "[清理] 移除旧映射(如有)"
net use %DRIVE_LETTER% /delete /y >nul 2>&1
)
REM ========= 5. 等待网络可达 =========
call :log_message "[网络] 等待 NAS 可达..."
:wait_ping
ping %NAS_HOST% -n 1 -w 2000 >nul
if errorlevel 1 (
timeout /t 2 /nobreak >nul
goto wait_ping
)
call :log_message "[网络] NAS 已在线"
timeout /t 2 /nobreak >nul
REM ========= 6. 清理可能冲突的 SMB 连接 =========
net use \\%NAS_HOST% /delete /y >nul 2>&1
cmdkey /delete:%NAS_HOST% >nul 2>&1
REM ========= 7. 循环尝试挂载(带错误解析) =========
set RETRY_COUNT=0
:retry_mount
set /a RETRY_COUNT+=1
call :log_message "[挂载] 第 !RETRY_COUNT! / %MAX_RETRIES% 次尝试"
REM 将 net use 输出重定向到临时文件
net use %DRIVE_LETTER% "%NAS_URL%" /user:%NAS_USERNAME% %NAS_PASSWORD% /persistent:yes > "%TEMP%\netuse_out.txt" 2>&1
set NETUSE_ERROR=%errorlevel%
REM 将临时文件内容写入日志
if exist "%TEMP%\netuse_out.txt" (
for /f "tokens=*" %%i in ('type "%TEMP%\netuse_out.txt"') do call :log_message " %%i"
del "%TEMP%\netuse_out.txt" >nul 2>&1
)
if %NETUSE_ERROR% equ 0 (
call :log_message "[成功] 挂载成功"
goto mounted_ok
)
REM 解析常见错误码
set ERROR_MSG=
if %NETUSE_ERROR% equ 53 set ERROR_MSG=错误53: 网络路径未找到(URL 不正确或 WebDAV 服务未开启)
if %NETUSE_ERROR% equ 67 set ERROR_MSG=错误67: 找不到网络名(WebClient 服务或注册表未配置好)
if %NETUSE_ERROR% equ 1219 set ERROR_MSG=错误1219: 不允许用不同凭据连接(请重启系统清理旧连接)
if %NETUSE_ERROR% equ 1326 set ERROR_MSG=错误1326: 用户名或密码错误
if "%ERROR_MSG%"=="" set ERROR_MSG=错误代码 %NETUSE_ERROR%
call :log_message "[挂载] 失败 - %ERROR_MSG%"
if !RETRY_COUNT! geq %MAX_RETRIES% goto error
call :log_message "[挂载] %RETRY_INTERVAL% 秒后重试..."
timeout /t %RETRY_INTERVAL% /nobreak >nul
goto retry_mount
:mounted_ok
REM 显示最终状态
net use %DRIVE_LETTER%
call :log_message "[最终状态] 已映射 %DRIVE_LETTER% 到 %NAS_URL%"
goto launch_keepass
:launch_keepass
REM ========= 8. 启动 KeePass(如果未运行) =========
tasklist /FI "IMAGENAME eq KeePass.exe" 2>nul | find /I "KeePass.exe" >nul
if errorlevel 1 (
if exist %KEEPASS_PATH% (
start "" %KEEPASS_PATH%
call :log_message "[启动] KeePass 已启动"
) else (
call :log_message "[启动] 未找到 KeePass.exe,请修改脚本中的 KEEPASS_PATH"
)
) else (
call :log_message "[启动] KeePass 已在运行"
)
goto end
:error
call :log_message "[致命] 挂载失败,请手动检查:"
call :log_message " 1. 浏览器访问 %NAS_URL% 是否能弹出认证窗口"
call :log_message " 2. 检查防火墙是否允许端口出站(例如 5005)"
echo ========================================
echo 挂载失败!详细信息请查看日志:
echo %LOG_FILE%
echo ========================================
pause
exit /b 1
:end
echo 脚本执行完毕,日志: %LOG_FILE%
exit /b 0
REM ========= 函数 =========
:log_message
echo [%time%] %~1 >> "%LOG_FILE%"
echo %~1
goto :eof
:cleanup_old_logs
if not exist "%LOG_DIR%\*.log" goto :eof
set count=0
for /f "delims=" %%f in ('dir "%LOG_DIR%\*.log" /b /o-d') do (
set /a count+=1
if !count! gtr %MAX_LOG_COUNT% (
del "%LOG_DIR%\%%f" >nul 2>&1
)
)
goto :eof
9 自动化设置:添加到任务计划
为了实现开机自动挂载或登录时自动运行,可以将脚本添加到Windows任务计划程序中。推荐使用用户登录时触发,并配置为“以最高权限运行”(因为脚本内部会再次提权,但提前赋予最高权限可避免UAC弹窗)。
9.1 使用图形界面手动创建
- 按
Win + R,输入 taskschd.msc 并回车,打开“任务计划程序”。
- 点击右侧“创建基本任务”。
- 名称:例如
Synology WebDAV AutoMount
- 触发器:选择“当前用户登录时”或“启动时”(推荐“登录时”以便网络已就绪)
- 操作:选择“启动程序”,在“程序或脚本”中填写脚本的完整路径,例如
C:\Scripts\mount_nas.bat
- 最后勾选 “打开属性对话框” 并点击完成。
- 在属性对话框中:
- 勾选 “使用最高权限运行”(重要!)
- (可选)在“条件”选项卡中,取消勾选“只有在计算机使用交流电源时才启动此任务”,避免笔记本电池模式下被跳过。
- (可选)在“设置”选项卡中,可以设置“如果任务失败,按以下频率重启”,例如每隔1分钟重启一次,最多3次。
10 常见问题
10.1 提示“WebClient服务不可用,挂载可能失败”
原因:WebClient服务被系统禁用(例如某些精简版Windows或组策略限制)。
解决方法:
- 运行
services.msc,找到 WebClient 服务,将其启动类型设为“手动”或“自动”,然后启动。
- 若服务不存在,需确认Windows功能中是否启用了“WebDAV重定向器”(控制面板 → 程序和功能 → 启用或关闭Windows功能 → Internet Information Services → 万维网服务 → 常见HTTP功能 → WebDAV重定向)。
10.2 挂载失败并报错“错误1219: 不允许用不同凭据连接”
原因:之前使用其他用户名或密码连接过同一NAS的SMB或WebDAV共享,凭据冲突。
解决方法:
10.3 挂载一直重试,最终失败,错误53或67
可能原因:
- NAS端的WebDAV服务未开启(DSM中需启用WebDAV Server套件,并确认端口开放)。
- 防火墙阻止了出站端口(示例为5005)。
- URL格式错误(特别注意
DavWWWRoot大小写,末尾无斜杠)。
调试方法:
- 打开浏览器访问
http://your-nas-domain:5005/(或HTTPS),若弹出认证对话框则说明WebDAV服务可达。
- 检查脚本日志文件,查看
net use的具体错误输出。
- 临时关闭Windows防火墙测试。