C#使用SMB2Client连接Samba后无法打开共享文件夹及访问子目录
问题根因
你的代码存在两个核心逻辑问题,导致资源管理器无法正常弹出、共享目录及子路径访问失败:
- 你使用的第三方
SMB2Client库维护的是独立于Windows原生SMB组件的连接会话,库内完成的登录认证不会同步给资源管理器依赖的系统SMB客户端,资源管理器访问路径时无有效凭据,会直接静默失败或被服务端拦截权限。 - 启动资源管理器的
Process.Start是异步调用,方法返回时资源管理器尚未完成路径初始化,且你未提前给系统层注入对应SMB凭据,直接导致窗口不弹出、子目录无访问权限。 - 代码存在冗余嵌套大括号的语法问题,虽不影响运行但建议清理。
修复方案
核心逻辑是先通过Windows系统命令建立原生SMB认证会话,再调用资源管理器打开路径,不要依赖第三方SMB库的连接给系统传递凭据。
修正后的可运行代码如下:
using System.Diagnostics; using System.Net; using SMBLibrary; using System.Collections.Generic; SMB2Client client = new SMB2Client(); bool isConnected = client.Connect(IPAddress.Parse("192.168.1.169"), SMBTransportType.DirectTCPTransport); if (isConnected) { NTStatus status = client.Login(string.Empty, "mint", "test12345"); if (status == NTStatus.STATUS_SUCCESS) { List<ShareInfo> shares = client.ListShares(out status); // 清除同地址残留的旧SMB会话,避免凭据冲突 Process.Start(new ProcessStartInfo("net.exe", @"use \\192.168.1.169 /delete /y") { CreateNoWindow = true, UseShellExecute = false }).WaitForExit(); // 注入凭据建立系统级SMB会话,会话不持久化留存 ProcessStartInfo authCmd = new ProcessStartInfo("net.exe", @"use \\192.168.1.169 test12345 /user:mint /persistent:no") { CreateNoWindow = true, UseShellExecute = false }; Process.Start(authCmd).WaitForExit(); // 强制资源管理器开新窗口跳转到指定共享路径 Process.Start("explorer.exe", $"/n,/e,\"{@"\\192.168.1.169\sambashare"}\""); // 第三方库连接可正常关闭,不影响系统已建立的SMB会话 client.Logoff(); } client.Disconnect(); Console.ReadKey(); }
补充说明
- 若不需要长期保留访问凭据,可在资源管理器使用完成后调用
net use \\192.168.1.169 /delete /y清除系统留存的SMB认证信息,避免安全风险。 - 子目录访问失败的本质是资源管理器默认以匿名身份访问Samba服务,被服务端权限规则拦截,注入正确凭据后权限与你第三方库登录的账号权限完全一致,可正常浏览所有授权目录。
- 若仍出现窗口不跳转问题,可检查Samba服务端是否启用SMB2及以上协议,Windows 10/11默认禁用SMB1协议,低版本协议配置会导致访问失败。
内容的提问来源于stack exchange,提问作者Pratiksha Pansara
相关产品推荐
相关产品推荐

