只有两行,没有解释
cmd
C:\>net use Z: http://dav.example.com/
发生系统错误 67。
找不到网络名。错误 67 在微软的 Win32 错误列表里是 ERROR_BAD_NET_NAME,说明为「The network name cannot be found.」。文件资源管理器用十六进制显示同一个失败,也就是 错误 0x80070043。十进制 67 等于 0x43,而 0x8007 是 Windows 把 Win32 错误包成 HRESULT 时加的前缀。一个失败,两种写法。
命令行更适合排查:一次只改一个变量,结果立刻可见。
微软说的原因
WebDAV 重定向程序文档列出了导致驱动器映射报系统错误 67 的六个条件。在非 IIS 服务器上,前三个几乎能解释所有情况。
| 文档记载的原因 | 对你意味着什么 |
|---|---|
| 服务器上没装或没运行 IIS | 只对 IIS 目标有意义;先确认普通 GET 有响应 |
| 客户端没安装 WebDAV 重定向程序 | Windows Server 上添加「桌面体验」功能;桌面版自带 |
| 客户端的 WebClient 服务没有运行 | 启动它,并设为自动启动 |
| 站点上没有启用 WebDAV | 检查响应里是否带 DAV: 头 |
| 用 HTTP 而不是 HTTPS 配 Basic 认证 | 提高 BasicAuthLevel,或把端点换成 HTTPS |
| Windows 认证的 FQDN 站点缺少代理绕过条目 | 在客户端的绕过列表里加上该站点 |
第一步:确认重定向程序还活着
映射出来的 WebDAV 驱动器由 WebClient 服务处理。微软在 2023 年 11 月弃用了它,并在同一份公告里写明 Webclient 服务在 Windows 上默认不启动。在较新的机器上,这一条是答案的概率最高。
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服务起来后再试一次映射。如果之前已经失败过,等一分钟:ServerNotFoundCacheLifeTimeInSec 默认 60 秒,在这个窗口内 WebClient 会直接返回缓存的失败,根本不联系服务器。
第二步:把命令写对
net use 对 WebDAV 接受两种形式。纯 URL 形式出现在微软的操作说明里:NET USE * http://www.example.com,其中 * 表示用下一个空闲盘符。UNC 形式由 DavGetHTTPFromUNCPath 函数的文档定义为 \\server[@SSL][@port][\path],@SSL 表示 HTTPS,@port 在端口不是 80 或 443 时必须写。DavWWWRoot 指向 WebDAV 服务器的根。
cmd
rem 默认端口的 HTTPS
net use Z: \\dav.example.com@SSL\DavWWWRoot\files /user:alice *
rem 显式写端口的 HTTPS
net use Z: \\dav.example.com@SSL@443\DavWWWRoot\files /user:alice *
rem 自定义端口的明文 HTTP
net use Y: http://dav.example.com:8080/remote.php/dav/files/alice /user:alice *末尾那个 * 不是装饰。文档里的 net use 语法接受密码或 *,写 * 时 Windows 会提示你输入,这样密码不会留在命令历史里。想让映射在重启后仍然存在,加 /persistent:yes。
单靠写法就能造成错误 67 的有三种:漏掉协议(于是走了 SMB)、漏掉非默认端口、以及服务器在 /dav 或 /remote.php/dav/files/alice 这类子路径下发布 WebDAV,你却映射了站点根。
第三步:允许 HTTP 上的 Basic 认证
如果端点是 http:// 且使用 Basic 认证,Windows 会在弹出密码框之前就拒绝。开关是 WebClient 参数键下的 DWORD BasicAuthLevel,文档给出三个取值:0 禁用 Basic 认证,1 仅 SSL 站点,2 SSL 与非 SSL 都允许。默认是 1。
cmd
reg query "HKLM\SYSTEM\CurrentControlSet\Services\WebClient\Parameters" /v BasicAuthLevel
reg add "HKLM\SYSTEM\CurrentControlSet\Services\WebClient\Parameters" /v BasicAuthLevel /t REG_DWORD /d 2 /f
net stop WebClient
net start WebClient重启服务是必须的,微软文档对这个键下的每个值都这么写。同时要明白取舍:级别 2 会让凭据以明文传输。对 127.0.0.1 合理,对自己的局域网可以接受,对公网就是错的。
当错误号不是 67 的时候
同一份文档还列出了 net use 对 WebDAV 端点返回的其他编号,它们比 67 有用得多。认得它们,就不会把 WebClient 的修法套到权限问题上。
| 错误 | Windows 打印的文本 | 实际含义 |
|---|---|---|
| 5 | Access is denied | 账号或密码错误,或对内容没有权限 |
| 58 | The specified server cannot perform the requested operation | 服务器主机名绑定不匹配 |
| 59 | An unexpected network error occurred | 站点或其应用程序池已停止 |
| 224 | Access Denied. Before opening files in this location, you must first add the web site to your trusted sites list | URL 所在的区域不被重定向程序信任 |
| 1244 | The operation being request was not performed because the user has not been authenticated | 没有启用任何认证方式,或登录类型不匹配 |
| 1920 | The file cannot be accessed by the system | 该账号没有对应的创作规则 |
1244 那句话连拼写错误都是微软原文。
重启之后就消失的映射
映射能用但注销后消失,这是有记录的行为而不是 bug:微软明确说明从 Windows 7 起,Basic 认证的凭据无法由凭据管理器保存,并在自家排障文章里建议用登录脚本重新执行 net use。对包括本机服务在内的 Basic 认证 WebDAV,这就是实际答案。
powershell
if (-not (Test-Path Y:)) {
net use Y: http://127.0.0.1:3211/ /user:anystorage
}映射本机的 WebDAV 服务,比如 AnyStorage
AnyStorage 就在你面前这台机器上跑 WebDAV 服务:侧边栏 Services,WebDAV 标签,Start,端点是 http://127.0.0.1:3211。应用里打开的每个连接都是根下的一个文件夹,所以一个盘符就能到达 S3 桶、Cloudflare R2、Backblaze B2、MinIO、Google Drive、OneDrive、Dropbox 或 SFTP 主机。不用装文件系统驱动,所以 WinFsp 从不出场。
Windows 并不因为服务器在本机就放宽规则,所以上面的条目照样适用:HTTP 端点需要 BasicAuthLevel 为 2。用户名默认 anystorage,密码是首次使用时生成的 24 个字符,两者都在 WebDAV 标签里带复制按钮。免费版挂载只读,读写属于 Pro。连接是懒加载的,所以启动后只有在应用里打开过的连接才会出现在根目录。
错误 67 和 0x80070043 是一回事吗?
是。67 是 Win32 的 ERROR_BAD_NET_NAME,0x80070043 是同一个值包成 HRESULT 以便外壳显示。
net use 成功了,但资源管理器里看不到这个盘?
它们运行在不同的安全上下文里。在管理员命令提示符下建立的映射,非管理员的资源管理器看不到,反之亦然。想在资源管理器里看到,就用普通命令提示符执行。
URL 末尾要加斜杠吗?
加了没坏处。重定向程序的第一个请求是对你给的路径发 OPTIONS,有些服务器对此敏感。不加失败时,先补上斜杠再去怀疑凭据。
这些步骤能全部跳过吗?
只为浏览的话,盘符确实方便。批量传输则建议在直接对接存储 API 的客户端里做:没有服务要启动,没有注册表要改,也没有 4GB 的单文件上限。
接着看
- 资源管理器里的同一个错误:WebDAV 错误 0x80070043
- 还有什么会弄坏 Windows 的 WebDAV 映射:Windows 连不上 WebDAV
- 复制到 50MB 就停:Windows WebDAV 50MB 限制