使用SMBLibrary调用ListShares时遇STATUS_USER_SESSION_DELETED错误
我之前也碰到过类似的SMB会话异常问题,结合SMBLibrary的工作逻辑和常见的服务器配置坑,给你几个具体的排查和解决方向:
1. 补全登录时的域名/工作组参数
你当前调用Login时第一个参数传了空字符串,很多SMB服务器(尤其是加入域或有明确工作组设置的环境)需要指定正确的域名或工作组才能维持有效会话。试试把这个参数改成服务器所在的工作组或域名:
// 替换成实际的工作组/域名,比如默认的WORKGROUP var status = client.Login("WORKGROUP", "user", "pass");
如果不确定具体值,可以在命令行执行net view \\192.21.1.40查看服务器的工作组信息,或者咨询服务器管理员。
2. 指定兼容的SMB协议版本
部分服务器会限制SMB协议的版本,默认自动协商可能会出现会话不稳定的情况。你可以在连接后、登录前强制指定SMB版本:
var success = client.Connect(System.Net.IPAddress.Parse("192.21.1.40"), SMBTransportType.DirectTCPTransport); if (success) { // 强制使用SMB 2.1或3.0,根据服务器支持情况选择 client.SMB2Dialect = SMB2Dialect.SMB210; var status = client.Login("WORKGROUP", "user", "pass"); // ... 后续代码 }
3. 检查会话超时与权限配置
- 会话超时问题:有些服务器会设置较短的空闲会话超时,如果你登录后间隔了一段时间才调用
ListShares,可能会话已经被服务器回收。试试登录后立即执行列表查询。 - 用户权限不足:虽然登录返回成功,但该用户可能没有获取共享列表的权限(比如需要
SeNetworkLogonRight权限)。可以先用管理员账号测试,确认是否是权限问题。
4. 调试获取更详细错误信息
建议你打印actionStatus的具体值,有时候能得到比主错误码更详细的提示:
var shares = client.ListShares(out var actionStatus); Console.WriteLine($"ListShares Status: {actionStatus}");
5. 排查网络层面干扰
防火墙、路由设备可能会中断空闲的SMB会话,导致会话被标记为已删除。可以临时关闭客户端或服务器的防火墙测试,或者确保SMB默认端口445的通信没有被拦截。
内容的提问来源于stack exchange,提问作者vishwas-trivedi
相关产品推荐
相关产品推荐

