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