跳到主要内容
AnyStorage
免费下载

Windows 上的 WebDAV

Windows 11 上 WebDAV 不工作:变的是什么

微软在 2023 年 11 月弃用了 WebDAV 服务,而且它默认不再启动。如何重新打开、哪些注册表值仍会咬人,以及全部已文档化的上限。

旧版 Windows 上好用的 WebDAV 映射为什么在 Windows 11 上失败,附微软自己的弃用原文、重新启用服务的命令,以及每一个文档化的限制值。

webdav windows 11 不能用,WebClient 服务 Windows 11,WebDAV 弃用 Windows

真正变了的东西

不是你的服务端。微软的 Windows 客户端弃用功能清单里有这么一条,宣布时间是 2023 年 11 月:

text

Webclient (WebDAV) Service
The Webclient (WebDAV) service is deprecated.
The Webclient service isn't started by default in Windows.

这两句话解释了网上大多数"Windows 11 上 WebDAV 用不了"的帖子。功能还在,也还能用;只是不再继续开发,而且在全新安装的系统上那个服务是停着的,于是第一次映射就失败。更糟的是你拿到的提示——"找不到网络名"、0x80070043、"The folder you entered does not appear to be valid."——完全不提服务没启动这件事。

在 Windows 11 上弄坏 WebDAV 的五件事(按顺序)
失败表现原因处理
任何映射尝试都立刻失败WebClient 服务没启动启动它并设为自动
http:// 端点,从不弹密码框Basic 认证限定 SSL 站点BasicAuthLevel = 2
复制到 50 MB 左右报 0x800700DFFileSizeLimitInBytes 默认值抬高数值,重启服务
刚修好立刻重试,错误照旧非 WebDAV 服务器缓存等 60 秒
重启之后映射消失Basic 凭据不被保存用登录脚本重新映射

1. 启动服务,并设为自动

powershell

Get-Service WebClient | Format-List Name, Status, StartType
Set-Service -Name WebClient -StartupType Automatic
Start-Service -Name WebClient

在管理员命令提示符里做的话,每个 = 后面要有空格:微软的 sc.exe config 参考说明,选项和取值之间必须有空格,省掉会让操作失败——而被到处复制的 start=auto 正是省掉空格的写法。

cmd

sc.exe config WebClient start= auto
sc.exe start WebClient

Windows Server 上在添加"桌面体验"功能之前重定向器根本没装;Windows 11 上它装了,只是睡着。

2. 允许对 http:// 端点发送 Basic 凭据

Windows 10 和 11 默认不会把 Basic 凭据发给明文端点,而且失败时不弹窗,所以这个原因经常被误诊成密码问题。控制它的是 HKLM\SYSTEM\CurrentControlSet\Services\WebClient\Parameters 下的 DWORD 值 BasicAuthLevel。微软文档写明 0 为禁用,1 为「Basic authentication is enabled for SSL web sites only」,2 为「enabled for SSL and non-SSL web sites」,默认是 1

cmd

reg add "HKLM\SYSTEM\CurrentControlSet\Services\WebClient\Parameters" /v BasicAuthLevel /t REG_DWORD /d 2 /f
net stop WebClient
net start WebClient

重启是必须的:该键的注记明确说改任何值之后都要重启 Web Client 或重启计算机。微软还把非 SSL 连接上的 Basic 认证称为「strongly discouraged」,这话没错——凭据是明文过线的。回环地址上流量不出本机;只要会走网络,就用 HTTPS 并把值保持在 1

3. 在撞上之前先知道上限

下面每个值都来自微软的 WebDAV 重定向器文档,同一个注册表键,全是实数而非传闻。

WebClient 注册表设置与微软文档化的默认值
控制什么默认
FileSizeLimitInBytes服务允许的最大文件传输大小50,000,000(十进制,50 MB)
FileAttributesLimitInBytes单个集合上所有属性的最大大小1,000,000(十进制,1 MB)
SendReceiveTimeoutInSec发出 GET /file.ext 之类请求后的超时60
InternetServerTimeoutInSec非本地服务器的连接超时30
LocalServerTimeoutInSec本地服务器的连接超时15
ServerNotFoundCacheLifeTimeInSec主机被缓存为非 WebDAV 的时长60
SupportLocking是否支持 LOCK1
BasicAuthLevelBasic 认证:关 / 仅 SSL / 两者1

其中两个值得多看一眼。FileSizeLimitInBytes 就是著名的 50 MB 天花板;它是 DWORD,所以最大只能是 4,294,967,295 字节——这就是为什么 Windows 的 WebDAV 映射再怎么配也搬不动一个 5 GB 的文件(细节见Windows WebDAV 50 MB 限制)。而 ServerNotFoundCacheLifeTimeInSec 正是"我修好了但没用"的真相:60 秒内服务直接返回缓存的失败,根本不联系服务端。

4. 排查期间用命令行映射

向导给你一句话,net use 给你一个编号,而编号是可以搜索的。微软的说明用普通 URL 形式,UNC 形式被文档化为 \\server[@SSL][@port][\path]@SSL 表示 HTTPS,@port 在非 80/443 时必填:

cmd

net use Z: https://dav.example.com/files /user:alice *
net use Y: \\dav.example.com@SSL@8443\DavWWWRoot\files /user:alice *

末尾的 * 让 Windows 提示输入密码,而不是把它留在命令历史里。如果答案是 System error 67,读net use 错误 67;资源管理器版的写法是0x80070043;向导自己的拒绝另有一页:输入的文件夹似乎无效

5. 注销就消失的映射

这是文档化的行为,不是 Windows 11 的退步:自 Windows 7 起,Basic 认证的凭据无法由凭据管理器保存,所以 Basic 认证的 WebDAV 映射只能重建而不是恢复。微软自己的排查建议也是用登录脚本重新执行命令。

powershell

if (-not (Test-Path Y:)) {
  net use Y: http://127.0.0.1:3211/ /user:anystorage
}

"弃用"对你意味着什么

弃用不是移除。微软自己的定义是:该功能不再积极开发,可能在未来更新中被移除。WebClient 这条自 2023 年 11 月起一直挂着,没有给出移除日期。实际含义有三条:没有新功能、没有性能改进、下一个大版本没有保证。

它也意味着长期方案不该只依赖 Windows 重定向器做批量工作。直接说存储 API 的客户端没有要启动的服务、没有 BasicAuthLevel、没有 4 GB 天花板。AnyStorage(v0.2.24;macOS 11+、Windows 10+、Ubuntu 20.04+)走的是中间路线:文件传输用存储协议本身——支持 path-style 与自定义区域的 S3 兼容端点、密钥认证的 SFTP、WebDAV——需要盘符时,再由内置的本地 WebDAV 服务(http://127.0.0.1:3211)提供一个,不装 FUSE、WinFsp 或 macFUSE。应用里打开的每个连接都作为该根下的文件夹出现,免费版可用两个连接。不过上面那些规则对这个映射同样适用:Windows 对回环 WebDAV 服务和别人一视同仁,WebClient 要在跑,BasicAuthLevel 要是 2

Windows 11 24H2 里 WebDAV 被删了吗?

没有。是弃用不是移除,服务仍随系统提供。变的是它不会自己启动,所以每台机器需要手动开一次。

我的 NAS 在浏览器里能看,为什么做不成驱动器?

因为重定向器问的是另一个问题。它发 OPTIONS 并要求 DAV 响应头,然后发 PROPFIND。一台服务器完全可以正常提供网页,却不在你输入的路径上声明 WebDAV。

50 MB 限制能安全抬高吗?

在合理范围内可以。FileSizeLimitInBytes 是 DWORD,最大 4294967295,改完需要重启 WebClient 或重启机器。它不会让传输变快,只是让传输被允许。

换成 HTTPS 能解决超时吗?

不能。超时是 SendReceiveTimeoutInSec(60 秒)、InternetServerTimeoutInSec(30)和 LocalServerTimeoutInSec(15),与协议无关。对上千条目的目录做一次慢 PROPFIND,两种协议都会撞上。

下一步