Ошибка SqlConnection, если EXE выполняется из сетевого пути

Прежде всего: все, что вы прочитаете в этом сообщении, произойдет только в случае обновления Windows 10 апреля 2018 года. Перед установкой и после удаления обновления проблем нет.

После установки обновления Windows 10 1803 вся моя VB-программа (VB6,.NET и WPF), запущенная из сетевого сопоставленного диска или UNC-пути, не может подключаться к SQL-серверу, без проблем, если один и тот же исполняемый файл размещен и выполнен с локального диска (проверен на 2 шт в той же сети):

  1. Удаленный SQL-сервер, exe на локальном диске: OK
  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

Исключение:

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 года, проблема исчезнет, и программа отлично работает даже при выполнении на сетевом диске, но это не может быть решением...

Обновление 08/05/2018: я заметил, что обновление за апрель 2018 года привело к некоторым изменениям в безопасности:

Windows 10, версия 1803 обеспечивает дополнительную защиту:

  • Новые правила сокращения поверхности атаки
  • Доступ управляемых папок теперь может блокировать сектора диска

Может ли это быть причиной проблемы? Я не менеджер безопасности, поэтому не могу сказать, может ли это вызвать мою проблему

Обновление 09/05/2018: Я нашел эту информацию в этом сообщении:

Обновление Windows 10 1803 не открывает сетевые подключения к файлам исполняемых файлов на общем ресурсе SMBv1 (как Windows Server 2003)

но я не знаю, что такое SMBv1... кто-нибудь может мне помочь?

Ответы

Ответ 1

Наконец, я нашел проблему: на сервере с общей папкой SMBv2 отключен (я не знаю почему), поэтому активен только SMBv1; одна и та же программа, выполненная от одного и того же клиента в той же сети, но находящаяся на сервере с включенным SMBv2, работает нормально.

Таким образом, проблема заключается в совместном использовании SMBv1, устаревшем, начиная с Windows 10 1803

Ответ 2

Этот блог дает решение для этого, которое сработало для нас. В частности, посмотрите на ответ от "M.Hermann": Windows 10 1803 не будет запускать подключенное ODBC SQL-приложение из сети

В приведенной ниже ссылке объясняется, почему SMBv1 отключен: SMBv1 не установлен по умолчанию в Windows 10 Fall Creators Update и Windows Server версии 1709 и более поздних версиях

Я не уверен, почему это только кажется проблемой после 1803 года, поскольку SMBv1 отключен с 1709 года.

Ответ 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

Теперь все работает нормально!

Ответ 4

Вы пытаетесь выполнить и не доверять исполняемый файл (по умолчанию для любого.exe на сетевом ресурсе). Поэтому он ограничен тем, что он может сделать.

Попробуйте щелкнуть правой кнопкой мыши exe и выполнить "запустить как администратор".

Вы также можете попробовать изучить локальную политику безопасности.