我的情况如下。有三台服务器:
- Windows Server 2016(服务器-1)
- Windows Server 2016(服务器-2)
- Windows Server 2016 和 SQL Server 2016(服务器端SQL)
我有一些 C# 代码连接到服务器端SQL两者相同服务器-1和服务器-2具有相同的连接字符串。
连接字符串如下所示:
Provider=MSOLEDBSQL;Server=Server-SQL;Database=database;Uid=user;Pwd=password;Encrypt=yes
新的 2018 版 OLE DB 驱动程序已安装在两者上服务器-1和服务器-2。
启用/禁用加密的注册表项在两台服务器上设置相同。例如
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0\Client
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1\Client
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client
在以下位置运行相同的 C# 代码时服务器-1和服务器-2,服务器-1连接到数据库没有问题,但是服务器-2抛出以下错误信息:
建立与 SQL Server 的连接时发生与网络相关或特定于实例的错误。找不到或无法访问服务器。请检查实例名称是否正确以及 SQL Server 是否配置为允许远程连接。有关详细信息,请参阅 SQL Server 联机丛书。SQL Server 网络接口:未启用任何远程客户端协议,并且未在连接字符串 [xFFFFFFFF] 中指定任何远程协议。
具有以下堆栈跟踪:
at System.Data.OleDb.OleDbConnectionInternal..ctor(OleDbConnectionString constr, OleDbConnection connection)
at System.Data.OleDb.OleDbConnectionFactory.CreateConnection(DbConnectionOptions options, DbConnectionPoolKey poolKey, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection wningObject)
at System.Data.ProviderBase.DbConnectionFactory.CreateConnection(DbConnectionOptions options, DbConnectionPoolKey poolKey, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection, DbConnectionOptions userOptions)
at System.Data.ProviderBase.DbConnectionFactory.CreateNonPooledConnection(DbConnection owningConnection, DbConnectionPoolGroup poolGroup, DbConnectionOptions userOptions)
at System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal oldConnection, DbConnectionInternal& connection)
at System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)
at System.Data.ProviderBase.DbConnectionClosed.TryOpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)
at System.Data.ProviderBase.DbConnectionInternal.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
at System.Data.OleDb.OleDbConnection.Open()
at Squealer.Squealer.TryToConnectToDatabase(DatabaseConnectionInfo connectionInfo)
at Squealer.Squealer.Run(String[] args)
我在防火墙上没有看到任何规则服务器-1或者服务器-2这将阻止网络流量服务器端SQL。
WireShark 捕获以下之间的流量:服务器-1和服务器端SQL像这样:
WireShark 不会捕获任何流量服务器-2和服务器端SQL尝试建立 SQL 连接时。
SQL Server 配置为允许 TLS 1.1 和 TLS 1.2。当配置为使用 TLS 1.1 连接时,连接成功。
我已经使用 .net 4.6.2 和 4.7.0 编译了 .net 代码。两台服务器都安装了最高 .net 4.7.0。
测试具有 Provider=MSOLEDBSQL.1 的 UDL 文件实际上连接在两台服务器上。
尽管进行了广泛的谷歌搜索,我还是没有找到这个特定错误消息的任何踪迹,所以我在这里没有什么其他可以继续下去的。
我是不是在寻找某个被人弄乱的注册表项?我没主意了。
任何有关此情况的帮助或启示都将非常已收到。
谢谢。