Windows可执行文件在Linux Samba服务器运行时无法访问共享PDF目录
解决C#程序在Linux服务器远程执行时访问Samba共享的认证问题
在Linux服务器上预挂载Samba共享
既然程序跑在Linux服务器上,直接把目标Samba共享挂载成服务器本地目录,程序里直接访问本地路径即可。- 临时挂载命令:
mount -t cifs //目标机器IP/共享名 /本地挂载目录 -o username=AD域用户名,password=密码,domain=AD域名 - 开机自动挂载:编辑
/etc/fstab添加一行,确保重启后挂载依然生效://目标机器IP/共享名 /本地挂载目录 cifs username=AD域用户名,password=密码,domain=AD域名 0 0
之后程序里直接写
/本地挂载目录/xxx.pdf就能访问,完全绕开Windows端的认证环节。- 临时挂载命令:
在C#代码中手动添加Samba认证逻辑
用Windows API的WNetAddConnection2函数在程序启动时手动建立带认证的网络连接,之后再访问共享路径。示例代码:using System; using System.Runtime.InteropServices; public class SambaAuthHelper { [StructLayout(LayoutKind.Sequential)] private struct NETRESOURCE { public int dwScope; public int dwType; public int dwDisplayType; public int dwUsage; public string lpLocalName; public string lpRemoteName; public string lpComment; public string lpProvider; } [DllImport("mpr.dll")] private static extern int WNetAddConnection2(ref NETRESOURCE lpNetResource, string lpPassword, string lpUsername, int dwFlags); public static int EstablishSambaConnection(string remoteSharePath, string username, string password, string domain) { NETRESOURCE resource = new NETRESOURCE(); resource.dwType = 0x00000001; // 指定为磁盘资源 resource.lpRemoteName = remoteSharePath; return WNetAddConnection2(ref resource, password, $"{domain}\\{username}", 0); } } // 在访问共享PDF前调用认证 // SambaAuthHelper.EstablishSambaConnection(@"\\目标IP\共享目录", "你的AD用户名", "密码", "AD域名");注意:密码别硬编码,存在配置文件或环境变量里更安全。
以域用户身份运行Linux上的程序
既然服务器已经加入AD域,可以让程序以域用户身份启动,继承域认证权限访问Samba共享:- 先获取域用户票据:
kinit 你的AD用户名@AD域名 - 再用mono运行程序:
mono 你的程序.exe
也可以配置systemd服务,指定运行用户为域用户,确保服务启动时自动完成域认证。
- 先获取域用户票据:
检查Samba共享的权限配置
确认目标Samba共享允许Linux服务器的AD账户访问:- 编辑Samba配置文件
/etc/samba/smb.conf,对应共享段添加:valid users = @AD域组名 你的AD用户名 - 重启Samba服务生效:
service smbd restart
- 编辑Samba配置文件
内容的提问来源于stack exchange,提问作者Diego Gavani
相关产品推荐
相关产品推荐

