如何用C#从非域环境的远程SQL Server获取FileStream存储的数据?
解决方案
1. 修复连接字符串冲突问题
你的连接字符串同时指定了Integrated Security=true(Windows身份验证)和User ID=sa;Password=sensure(SQL身份验证),两种验证逻辑冲突会导致验证混乱。若使用SQL身份验证(sa账号),需将Integrated Security=true改为Integrated Security=false,修正后的连接字符串如下:
SqlConnection sqlConnection = new SqlConnection("Integrated Security=false;Password=sensure;User ID=sa;Initial Catalog=DataTest;Data Source=192.168.1.122\\SQLEXPRESS;MultipleActiveResultSets=True;encrypt=false");
2. 解决SqlFileStream远程访问的核心权限问题
使用SQL身份验证连接远程SQL Server时,SqlFileStream访问底层FileStream数据的SMB共享时,默认会用本地程序运行的Windows账号访问远程共享,而该账号在远程服务器无权限,这才是“用户名或密码错误”的根源。有两种解决思路:
思路A:改用Windows身份验证连接
- 将连接字符串改回
Integrated Security=true,移除User ID和Password参数。 - 确保运行程序的Windows账号:
- 在远程SQL Server中创建对应登录名,授予
DataTest数据库的访问权限(含FileStream相关权限)。 - 拥有远程服务器上FileStream共享目录的读取/写入权限(默认共享路径类似
\\192.168.1.122\MSSQL$SQLEXPRESS\Filestream\...,需在远程服务器给该账号配置共享权限和NTFS权限)。
- 在远程SQL Server中创建对应登录名,授予
思路B:配置FileStream代理账户(适用于必须用SQL身份验证的场景)
- 先启用SQL Server的FileStream远程访问:
- 打开SQL Server配置管理器,找到目标实例(SQLEXPRESS),右键选择属性。
- 切换到FileStream选项卡,勾选“允许远程客户端访问FileStream数据”,点击确定。
- 重启SQL Server服务使配置生效。
- 在SQL Server中执行语句启用FileStream访问级别:
EXEC sp_configure 'filestream_access_level', 2; RECONFIGURE; - 配置FileStream代理账户(需为Windows本地/域账户,SQL Server将用它代理共享访问):
- 在远程服务器创建Windows账户(如
FileStreamProxy)并设置强密码。 - 给该账户授予FileStream存储目录的NTFS权限和共享权限。
- 在SQL Server中执行存储过程配置代理账户(替换为实际账户名和密码):
EXEC sp_filestream_configure @enable_level = 2, @share_name = N'MSSQL$SQLEXPRESS', @account_name = N'192.168.1.122\FileStreamProxy', @account_password = N'你的代理账户密码';
- 在远程服务器创建Windows账户(如
- 确保远程服务器防火墙允许SMB端口(445)和SQL Server端口(默认1433,或SQLEXPRESS的动态端口)的入站连接。
3. 验证FileStream路径访问权限
获取到的filePath是远程服务器的UNC路径,可先尝试在本地资源管理器访问该路径(如\\192.168.1.122\MSSQL$SQLEXPRESS\Filestream\...,替换为实际PathName返回值),若能正常访问则权限配置正确,若不能则先解决共享访问的权限问题。
内容的提问来源于stack exchange,提问作者SimColombs
相关产品推荐
相关产品推荐

