吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1421|回复: 7
收起左侧

[其他原创] 【BAT】 Windows下自动挂载HTTP WebDAV并修复环境脚本

[复制链接]
Cristy 发表于 2026-4-24 14:34

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\BasicAuthLevel2(启用基本认证)。

核心流程如下:

  1. 提权检查 – 通过net session判断是否为管理员,否则调用PowerShell重新以管理员权限启动。
  2. 环境修复 – 启动WebClient服务,修正注册表值,必要时重启服务使配置生效。
  3. 网络准备 – 解析NAS主机IP(诊断用),等待ping通,清理旧映射和SMB凭据。
  4. 循环挂载 – 调用net use命令,将输出重定向到临时文件并记录日志,根据错误码输出友好提示。若失败则等待后重试,直到成功或达到最大次数。
  5. 后置动作 – 挂载成功后检查KeePass进程,若未运行则按配置路径启动。
  6. 日志维护 – 所有日志写入按日期命名的文件,启动时删除超出数量的旧日志。

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 使用图形界面手动创建

  1. 按 Win + R,输入 taskschd.msc 并回车,打开“任务计划程序”。
  2. 点击右侧“创建基本任务”。
    • 名称:例如 Synology WebDAV AutoMount
    • 触发器:选择“当前用户登录时”或“启动时”(推荐“登录时”以便网络已就绪)
    • 操作:选择“启动程序”,在“程序或脚本”中填写脚本的完整路径,例如 C:\Scripts\mount_nas.bat
    • 最后勾选 “打开属性对话框” 并点击完成。
  3. 在属性对话框中:
    • 勾选 “使用最高权限运行”(重要!)
    • (可选)在“条件”选项卡中,取消勾选“只有在计算机使用交流电源时才启动此任务”,避免笔记本电池模式下被跳过。
    • (可选)在“设置”选项卡中,可以设置“如果任务失败,按以下频率重启”,例如每隔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共享,凭据冲突。
解决方法

  • 打开命令提示符(管理员)运行:
    net use * /delete /y
    cmdkey /list | findstr "your-nas-domain" | cmdkey /delete
  • 重启计算机可彻底清理所有网络会话缓存。

10.3 挂载一直重试,最终失败,错误53或67

可能原因

  • NAS端的WebDAV服务未开启(DSM中需启用WebDAV Server套件,并确认端口开放)。
  • 防火墙阻止了出站端口(示例为5005)。
  • URL格式错误(特别注意DavWWWRoot大小写,末尾无斜杠)。

调试方法

  • 打开浏览器访问 http://your-nas-domain:5005/(或HTTPS),若弹出认证对话框则说明WebDAV服务可达。
  • 检查脚本日志文件,查看net use的具体错误输出。
  • 临时关闭Windows防火墙测试。

免费评分

参与人数 3吾爱币 +10 热心值 +2 收起 理由
苏紫方璇 + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
jamescookers988 + 2 + 1 我很赞同!
ku-yu + 1 我很赞同!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

daixiangjiang 发表于 2026-4-24 21:12
不明觉厉!
jamescookers988 发表于 2026-4-25 10:21
 楼主| Cristy 发表于 2026-4-25 11:27
jamescookers988 发表于 2026-4-25 10:21
有没有离线版本的,谢谢楼主

我用挂载是挂载本机nas  webdav 的 。 你说的离线是指哪里离线?脚本本身是不用联网的
why3030 发表于 2026-5-11 10:37
等待NAS直达?
SSSHJH 发表于 2026-5-13 15:42
咋停止呀
 楼主| Cristy 发表于 2026-5-13 17:59

等待直达  应该是网不通
 楼主| Cristy 发表于 2026-5-13 18:01

参考一下文中  9 下添加  在 “windows任务计划 ”  那里可以设置停止  
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - 52pojie.cn ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2026-6-11 14:37

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表