一、问题背景
虚拟机内运行 Ubuntu Linux,希望通过 Samba 服务实现 Windows 与 Linux 之间的文件共享。但 Windows 在文件资源管理器中输入\\xxx.xxx.xx.xxx后,提示"Windows 找不到\\xxx.xxx.xx.xxx",无法访问。但使用FileZilla或MobaXterm则可使用该ip连接到虚拟机中。
用命令行直接尝试连接,获取更具体的错误信息:
使用ifconfig命令获取虚拟机IP:
cmd使用管理员输入一下内容:
net use \\xxx.xxx.xx.xxx\IPC$ /user:xxx.xxx.xx.xxx\用户名 (上方指令中“xxx.xxx.xx.xxx”指虚拟机IP,“用户名”指虚拟机用户名)返回错误码及错误内容:
发生系统错误 1219。 不允许一个用户使用一个以上用户名与服务器或共享资源的多重连接。 中断与此服务器或共享资源的所有连接,然后再试一次。系统错误 1219 的含义是:Windows 已经用某个凭据与目标服务器建立了连接,此时又尝试用另一个用户名连接,导致凭据冲突。
二、解决方案
2.1 第一步:清除所有现有 SMB 连接
在管理员 CMD 中执行:
net use * /delete /y2.2 第二步:清除凭据管理器中的残留条目
在管理员 CMD 中执行:
cmdkey /list删除所有涉及xxx.xxx.xx.xxx(虚拟机IP)的条目:
cmdkey /delete:xxx.xxx.xx.xxx2.3 第三步:重启 Workstation 服务(如仍有残留)
在管理员 CMD 中执行:
net stop workstation /y net start workstation2.4 第四步:重新访问
清理完成后,在文件资源管理器地址栏输入:
\\xxx.xxx.xx.xxx弹出凭据框时输入用户名及密码
三、问题总结
3.1 造成本次问题的核心原因
Windows 的 SMB 客户端凭据缓存冲突(系统错误 1219)。
在反复排查过程中,Windows 累积了针对目标 IP 的多个失败会话和错误凭据。当网络层和端口层最终确认正常时,Windows 却因为"已存在一个连接"而拒绝用新用户名建立新连接。
3.2 关键排查经验
1. 区分不同协议通道
FileZilla 使用 SFTP(端口 22),Samba 使用 SMB(端口 445)。两者是完全独立的服务通道,一个通不代表另一个通。不能用 FileZilla 能连作为 Samba 可用的证据。
2. 分层排查思路
排查顺序应该是:
网络层(ping) → 端口层(Test-NetConnection) → 服务层(systemctl status) → 用户层(pdbedit) → 客户端层(net use / cmdkey)每一层确认无误后再进入下一层,避免在错误的方向上浪费时间。
4. 部分常见错误码
系统错误 1219:多重连接冲突,需清除现有会话
系统错误 53:找不到网络路径,通常是 NetBIOS 或签名问题
0x80070035:找不到网络路径,常见于 SMB 协议版本不匹配
0x80004005:未指定错误,常见于认证或来宾登录被拒
5. Windows 凭据管理器是排查 SMB 问题的重要工具
cmdkey /list和cmdkey /delete是清除陈旧凭据的有效手段,在排查"能 ping 通、端口也通,但就是访问不了"的问题时,应优先考虑凭据缓存问题。
附:完整排查命令速查
| 步骤 | Linux 端 | Windows 端 |
|---|---|---|
| 网络连通性 | ip addr | ping <IP> |
| 端口监听 | sudo ss -tlnp | grep 445 | Test-NetConnection <IP> -Port 445 |
| 服务状态 | sudo systemctl status smbd | — |
| 用户检查 | sudo pdbedit -L | — |
| 配置检查 | testparm -s | — |
| 凭据清理 | — | cmdkey /list、cmdkey /delete:<IP> |
| 会话清理 | — | net use * /delete /y |
| 服务重启 | sudo systemctl restart smbd | net stop workstation /y |