web-dev-qa-db-fra.com

Erreur SqlConnection si EXE est exécuté à partir du chemin réseau

Tout d'abord: tout ce que vous allez lire dans cet article se passe seulement si la mise à jour Windows 10 avril 2018 est installée. Aucun problème avant l'installation de et après la désinstallation de la mise à jour.

Après l'installation de la mise à jour Windows 10 1803, tous mes programmes VB (VB6, .NET et WPF) exécutés à partir d'un lecteur mappé sur le réseau ou d'un chemin UNC ne peuvent pas se connecter au serveur SQL. Aucun problème si le même exécutable est placé et exécuté à partir lecteur local (testé sur 2 PC du même réseau):

  1. Serveur SQL distant, exe sur lecteur local: OK
  2. Same serveur SQL distant, same .exe sur un lecteur réseau mappé (avec accès complet en lecture/écriture): ERREUR

C'est l'erreur (peut-être pas significative pour résoudre ce problème):

Une erreur liée au réseau ou à une instance spécifique s'est produite lors de l'établissement d'une connexion à SQL Server. Le serveur est introuvable ou inaccessible. Vérifiez que le nom de l'instance est correct et que SQL Server est configuré pour autoriser les connexions à distance. (fournisseur: interfaces réseau SQL, erreur: 26 - Erreur lors de la localisation du serveur/de l’instance spécifiée).

Code VB.NET simple pour reproduire le problème (placez le code sous une forme simple avec un bouton dans l'événement button_click, définissez les valeurs pour vous connecter au serveur SQL, compilez, enregistrez le fichier exe sur un chemin d'accès réseau et exécutez-le):

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

Exception:

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

Des idées?

Mise à jour: Si je désinstalle la mise à jour d'avril 2018, le problème disparaît et le programme fonctionne correctement, même s'il est exécuté sur un lecteur réseau, mais cela ne peut pas être la solution ...

Mise à jour 08/05/2018: J'ai remarqué que la mise à jour d'avril 2018 apportait des modifications de la sécurité :

Windows 10, version 1803 fournit des protections supplémentaires:

  • Nouvelles règles de réduction de la surface d'attaque 
  • L'accès aux dossiers contrôlé peut maintenant bloquer les secteurs du disque

Pourrait-il être la cause du problème? Je ne suis pas un responsable de la sécurité, je ne peux donc pas dire si cela peut causer mon problème

Mise à jour 09/05/2018: J'ai trouvé cette information dans this post:

Windows 10 update 1803 n'ouvre pas de connexion réseau sur fichiers exécutables sur le partage SMBv1 (en tant que Windows Server 2003)

mais je ne sais pas ce qu'est SMBv1 ... quelqu'un peut m'aider?

20

Finalement, j'ai trouvé le problème: sur le serveur avec le dossier partagé, SMBv2 est désactivé (je ne sais pas pourquoi), donc seul SMBv1 est actif; le même programme exécuté à partir du même client dans le même réseau mais situé sur un serveur sur lequel SMBv2 est activé fonctionne correctement.

Le problème concerne donc le partage SMBv1, obsolète à partir de Windows 10 1803

16

Ce blog donne une solution à cela qui a fonctionné pour nous. Examinez plus particulièrement la réponse de "M.Hermann": Windows 10 1803 n’exécutera pas ODBC une application connectée SQL à partir du réseau

Le lien ci-dessous semble expliquer pourquoi SMBv1 est désactivé: SMBv1 n’est pas installé par défaut dans Windows 10 Fall Creators Update et Windows Server, versions 1709 et supérieures

Je ne sais pas pourquoi cela ne semble être un problème qu'après 1803, puisque SMBv1 est désactivé depuis 1709.

1
Charl

J'ai le même problème avec certaines applications écrites dans "Rad Studio 10.2"

Je trouve une solution pour moi, je change de chaîne de connexion en supprimant le paramètre "Network Library = dbmssocn"

Je change ceci:

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

Pour ça :

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

Maintenant tout fonctionne bien!

0
Olivier