Ошибка SqlConnection, если EXE выполняется из сетевого пути
Прежде всего: все, что вы прочитаете в этом сообщении, произойдет только в случае обновления Windows 10 апреля 2018 года. Перед установкой и после удаления обновления проблем нет.
После установки обновления Windows 10 1803 вся моя VB-программа (VB6,.NET и WPF), запущенная из сетевого сопоставленного диска или UNC-пути, не может подключаться к SQL-серверу, без проблем, если один и тот же исполняемый файл размещен и выполнен с локального диска (проверен на 2 шт в той же сети):
- Удаленный SQL-сервер, exe на локальном диске: OK
- Тот же удаленный 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 и выполнить "запустить как администратор".
Вы также можете попробовать изучить локальную политику безопасности.