Linux环境下SQL Server [28000] sa无密码登录失败求助
排查方案与替代数据获取方法
一、核心连接问题排查
1. 切换为Windows集成认证尝试
你的.NET客户端出现SMB2操作,大概率是用Windows集成认证而非SQL Server身份认证(即使客户端显示用sa账户,可能是配置显示误导)。把ODBC连接字符串改成以下内容重试:
isql -v -k "DRIVER={ODBC Driver 18 for SQL Server};SERVER=192.168.x.x,1433;DATABASE=db_name;TrustServerCertificate=yes;Trusted_connection=yes;"
如果成功,说明服务器启用了Windows认证,你之前用的SQL认证sa账户要么被禁用、要么需要密码、要么服务器未开启SQL认证模式。
2. 适配旧版SQL Server的驱动设置
SQL Server 2014(版本12.0.2000)默认不支持强制加密,而ODBC Driver 18默认开启Encrypt=Mandatory,会导致认证流程异常。尝试两个调整:
- 改用兼容性更好的ODBC Driver 17,连接字符串:
isql -v -k "DRIVER={ODBC Driver 17 for SQL Server};SERVER=192.168.x.x,1433;DATABASE=db_name;UID=sa;PWD=;TrustServerCertificate=yes;Encrypt=no;"
- 或在Driver 18中显式关闭加密:
isql -v -k "DRIVER={ODBC Driver 18 for SQL Server};SERVER=192.168.x.x,1433;DATABASE=db_name;UID=sa;PWD=;TrustServerCertificate=yes;Encrypt=no;"
3. 确认服务器实例名称
客户端用(local)指向本地实例,但远程连接可能需要指定实例名(默认实例为MSSQLSERVER),尝试修改SERVER参数:
isql -v -k "DRIVER={ODBC Driver 17 for SQL Server};SERVER=192.168.x.x\MSSQLSERVER;DATABASE=db_name;UID=sa;PWD=;TrustServerCertificate=yes;Encrypt=no;"
也可以回看Wireshark抓包,查找SQL Server握手阶段的实例名称字段,确认正确标识。
二、替代数据获取方法
1. 使用Linux原生mssql-tools工具
安装mssql-tools后,用sqlcmd尝试Windows认证连接:
sqlcmd -S 192.168.x.x,1433 -d db_name -E -C
参数说明:-E启用Windows集成认证,-C信任服务器证书。
2. 用Python pyodbc模拟客户端认证逻辑
如果Windows认证可行,用pyodbc直接建立连接:
import pyodbc conn_str = ( "DRIVER={ODBC Driver 18 for SQL Server};" "SERVER=192.168.x.x,1433;" "DATABASE=db_name;" "Trusted_Connection=yes;" "TrustServerCertificate=yes" ) conn = pyodbc.connect(conn_str) cursor = conn.cursor() # 示例查询 cursor.execute("SELECT TOP 10 * FROM your_table") for row in cursor: print(row)
3. 挖掘客户端凭证缓存
在局域网内的Windows客户端上,打开凭据管理器(控制面板→用户账户→凭据管理器),查找「Windows凭据」中SQL Server相关的存储凭证,提取后用于ODBC连接。
内容的提问来源于stack exchange,提问作者Morpheus
相关产品推荐
相关产品推荐

