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

时间:2018-05-04 09:49:19

标签: sql-server vb.net windows-10

  

首先:如果安装了Windows 10 April 2018更新,那么您在此帖中阅读的所有内容都会。 安装前更新卸载后没问题。

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

  1. 远程SQL服务器,exe在本地驱动器上:确定
  2. 相同远程SQL服务器,相同 exe映射网络驱动器(具有完全读/写访问权限):错误
  3. 这是错误(可能没有意义解决这个问题):

      

    建立与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
    

    例外:

    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
    

    有什么想法吗?

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

    更新08/05/2018: 我注意到2018年4月更新带来了一些changes in security

      

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

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

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

    更新09/05/2018:我在this帖子中找到了这些信息:

      

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

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

4 个答案:

答案 0 :(得分:16)

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

所以问题是关于SMBv1共享,从Windows 10 1803开始弃用

答案 1 :(得分:1)

此博客为此提供了解决方案,对我们有用。具体看看“M.Hermann”的答案: Windows 10 1803 won't run ODBC SQL connected application from network

以下链接似乎解释了为什么禁用SMBv1: SMBv1 is not installed by default in Windows 10 Fall Creators Update and Windows Server, version 1709 and later versions

我不确定为什么这只会在1803之后出现问题,因为自1709年以来SMBv1已被禁用。

答案 2 :(得分:0)

我对“Rad Studio 10.2”中的某些应用程序写入有同样的问题

我找到了一个解决方案,我通过删除参数"Network Library = dbmssocn"

来更改我的连接字符串

我改变了这个:

Provider=SQLOLEDB.1;Password=MyPassword;Persist Security Info=True;User ID=MyUser;Initial Catalog=MyDb;Data Source=MyServer;Network Library=dbmssocn;

对此:

Provider=SQLOLEDB.1;Password=MyPassword;Persist Security Info=True;User ID=MyUser;Initial Catalog=MyDb;Data Source=MyServer

现在一切正常!

答案 3 :(得分:-1)

您正在尝试执行和不受信任的可执行文件(默认情况下,网络共享上的任何.exe)。因此,它的功能受到限制。

尝试右键单击exe并执行“以管理员身份运行”。

您也可以尝试查看本地安全策略。