如果从网络路径执行EXE,则SqlConnection错误

Mas*_*lli 20 vb.net sql-server windows-10

首先:只有在安装了Windows 10 April 2018更新后,您才能阅读本文中的所有内容.安装和更新卸载没问题.

安装Windows 10 1803更新后,从网络映射驱动器或UNC路径运行的所有VB程序(VB6,.NET和WPF)都无法连接到SQL服务器,如果从本地驱动器放置并执行相同的可执行文件,则没有问题(已测试在同一网络中的2台电脑上):

  1. 远程SQL服务器,exe在本地驱动器上:好的
  2. 相同的远程SQL服务器,映射网络驱动器上的相同 exe(具有完全读/写访问权限):ERROR

这是错误(可能没有意义解决这个问题):

建立与SQL Server的连接时发生与网络相关或特定于实例的错误.服务器未找到或无法访问.验证实例名称是否正确,以及SQL Server是否配置为允许远程连接.(提供程序:SQL网络接口,错误:26 - 查找指定的服务器/实例时出错).

简单的VB.NET代码重现问题(将代码放在一个简单的表单中,在button_click事件中有一个按钮,设置值以连接到SQL服务器,编译,将exe文件保存在网络路径上并执行它):

Dim myConnectionString As String
Dim mySqlConnectionStringBuilder As New SqlConnectionStringBuilder()
mySqlConnectionStringBuilder.DataSource = myServer
mySqlConnectionStringBuilder.InitialCatalog = myDatabase
mySqlConnectionStringBuilder.UserID = myUtente
mySqlConnectionStringBuilder.Password = myPassword
myConnectionString = mySqlConnectionStringBuilder.ConnectionString

Dim mySqlConnection As New SqlConnection(myConnectionString)
mySqlConnection.Open()  <- error
Run Code Online (Sandbox Code Playgroud)

例外:

System.Data.SqlClient.SqlException (0x80131904): Si è verificato un errore di rete o specifico dell'istanza mentre si cercava di stabilire una connessione con SQL Server. Il server non è stato trovato o non è accessibile. Verificare che il nome dell'istanza sia corretto e che SQL Server sia configurato in modo da consentire connessioni remote. (provider: SQL Network Interfaces, error: 26 - Errore nell'individuazione del server/dell'istanza specificata)
   in System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity, SqlConnectionString connectionOptions, SqlCredential credential, Object providerInfo, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance, SqlConnectionString userConnectionOptions, SessionData reconnectSessionData, DbConnectionPool pool, String accessToken, Boolean applyTransientFaultHandling, SqlAuthenticationProviderManager sqlAuthProviderManager)
   in System.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions options, DbConnectionPoolKey poolKey, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection, DbConnectionOptions userOptions)
   in System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnectionPool pool, DbConnection owningObject, DbConnectionOptions options, DbConnectionPoolKey poolKey, DbConnectionOptions userOptions)
   in System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection owningObject, DbConnectionOptions userOptions, DbConnectionInternal oldConnection)
   in System.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection owningObject, DbConnectionOptions userOptions, DbConnectionInternal oldConnection)
   in System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, UInt32 waitForMultipleObjectsTimeout, Boolean allowCreate, Boolean onlyOneCheckConnection, DbConnectionOptions userOptions, DbConnectionInternal& connection)
   in System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal& connection)
   in System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal oldConnection, DbConnectionInternal& connection)
   in System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)
   in System.Data.ProviderBase.DbConnectionClosed.TryOpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)
   in System.Data.SqlClient.SqlConnection.TryOpenInner(TaskCompletionSource`1 retry)
   in System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource`1 retry)
   in System.Data.SqlClient.SqlConnection.Open()
   in RiepilogoOreTimer.RiepilogoOreTimerWindow.ConnessioneOK()
ClientConnectionId:00000000-0000-0000-0000-000000000000
Error Number:-1,State:0,Class:20
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

更新: 如果我卸载2018年4月更新,问题就会消失,即使在网络驱动器上执行该程序也能正常运行,但这不是解决方案......

更新08/05/2018: 我注意到2018年4月更新带来了一些安全性方面的变化:

Windows 10,版本1803提供了额外的保护:

  • 新的攻击面减少规则
  • 受控文件夹访问现在可以阻止磁盘扇区

这可能是问题的原因吗?我不是安全经理所以我不能说这是否会导致我的问题

更新09/05/2018:我在这篇文章中发现了这个信息:

Windows 10更新1803无法打开SMBv1共享上的可执行文件的网络连接(作为Windows Server 2003)

但我不知道SMBv1是什么......有人可以帮助我吗?

Mas*_*lli 16

最后我发现了问题:在具有共享文件夹的服务器中,SMBv2被禁用(我不知道为什么)所以只有SMBv1处于活动状态; 从同一网络中的同一客户端执行但位于启用SMBv2的服务器上的相同程序工作正常.

所以问题是关于SMBv1共享,从Windows 10 1803开始不推荐使用