【问题标题】:SqlConnection Error if EXE is executed from network path如果从网络路径执行 EXE,则 SqlConnection 错误
【发布时间】:2018-05-04 09:49:18
【问题描述】:

首先:您将在这篇文章中阅读的所有内容在安装 Windows 10 April 2018 更新时才会发生。没有问题之前安装和之后更新卸载。

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

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

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

在建立与 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 月的更新,问题就会消失,即使在网络驱动器上执行程序也能正常工作,但这不是解决方案......

2018 年 8 月 5 日更新: 我注意到 2018 年 4 月的更新带来了一些 changes in security:

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

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

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

2018 年 9 月 5 日更新:我在 this 帖子中找到了此信息:

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

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

【问题讨论】:

  • 我已经阅读了四五个与您类似的实例,它们表明它在网络级别阻塞(如果您在某处打开 TCP 套接字,它也会失败,您收到的错误支持这一点好)。我会尝试像 Putty 这样的东西来测试它。我还会查看 Windows 防火墙,看看它是否导致了问题(例如,它可能是阻止连接的原因)。
  • 我已经尝试禁用防火墙,但问题仍然存在。
  • 我不认为连接在网络级别被阻止,因为如果从本地驱动器和 SQL Management Studio 执行程序,同一台电脑可以连接到同一台服务器。 IMO,Windows 集成 SQL 客户端 2018 年 4 月更新发生了一些变化
  • 我可以验证这发生在 VB6/VB.NET/WPF 之外。我们已经在一种称为 DataFlex 和 Delphi 的小众语言中发生了这种情况。
  • 尝试禁用 windows Defender 看看是否有帮助?

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


【解决方案1】:

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

所以问题在于 SMBv1 共享,从 Windows 10 1803 开始​​已弃用

【讨论】:

  • 感谢您分享您的答案!
  • 我们也发现了这种情况,但实际上我们也需要看看微软的解释,迁移到 SMBv2 确实可以解决它,但似乎没有人能够从中找到任何东西MS 显示从 SMBv1 共享启动的可执行文件的网络连接被阻止。
【解决方案2】:

这个博客提供了一个解决方案,它对我们有用。具体看“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 已被禁用。

【讨论】:

  • 虽然这不是 MS 的回答,但它肯定指出 Windows Defender 是原因。我们已经确认,正在安装的 AVG 还将恢复对从 SMBv1 共享启动的可执行文件的网络访问。
【解决方案3】:

我在“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

现在一切正常!

【讨论】:

  • 不幸的是不适合我...我没有在连接字符串中设置该参数,顺便说一句,我尝试了该参数的所有选项,但没有任何改变
  • 该参数强制使用 TCP/IP。因此,通过删除它,您的应用程序能够使用命名管道或共享内存来访问服务器。此解决方案仅在您的服务器位于本地时才有效。如果服务器位于您必须使用 TCP/IP 的网络上,问题将持续存在。
【解决方案4】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-07
    • 2018-08-21
    • 2016-12-18
    • 2013-01-24
    • 1970-01-01
    • 2017-01-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多