web-dev-qa-db-ja.com

EXEがネットワークパスから実行された場合のSqlConnectionエラー

まず第一に:この投稿で読むすべてが起こりますonlyif Windows 10 April 2018更新プログラムがインストールされています。 インストール前およびアンインストール後に問題はありません。

Windows 10 1803更新プログラムをインストールした後、ネットワークマップドライブまたはUNCパスから実行しているすべてのmy VBプログラム(VB6、.NETおよびWPF)はSQLサーバーに接続できません。同じ実行可能ファイルであれば問題ありませんローカルドライブから配置および実行されます(同じネットワーク内の2台のPCでテスト済み):

  1. リモートSQLサーバー、ローカルドライブ上のexe:[〜#〜] ok [〜#〜]
  2. 同じリモートSQLサーバー、sameマップされたネットワークドライブ上の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

何か案は?

Update:2018年4月のアップデートをアンインストールすると、問題はなくなり、ネットワークドライブで実行してもプログラムは正常に動作しますが、これはできませんソリューション...

2018年8月5日更新:2018年4月の更新により、いくつかの セキュリティの変更

Windows 10バージョン1803は、追加の保護を提供します。

  • 新しい攻撃対象領域削減ルール
  • フォルダーアクセスの制御により、ディスクセクターをブロックできるようになりました

それが問題の原因になりますか?私はセキュリティマネージャーではないので、これが私の問題を引き起こす可能性があるかどうかは言えません

2018年5月5日更新:this post:

Windows 10アップデート1803は、SMBv1共有上の実行可能ファイルのネットワーク接続を開きません(Windows Server 2003として)

しかし、私はSMBv1が何であるか知りません...誰かが私を助けることができますか?

20

最後に問題が見つかりました。共有フォルダーのあるサーバーでは、SMBv2が無効になっているため(理由はわかりません)、SMBv1のみがアクティブになります。同じネットワーク内の同じクライアントから実行された同じプログラムが、SMBv2が有効になっているサーバー上で正常に動作します。

したがって、問題はSMBv1共有に関するもので、Windows 10 1803から非推奨になりました

16

このブログは、これに対する解決策を提供します。 「M.Hermann」からの答えを具体的に見てください: Windows 10 1803は実行されませんODBCネットワークからのSQL接続アプリケーション

以下のリンクは、SMBv1が無効になっている理由を説明しているようです: SMBv1は、Windows 10 Fall Creators UpdateおよびWindows Serverバージョン1709以降のバージョンではデフォルトでインストールされません

SMBv1は1709年以降無効にされているため、なぜこれが1803年以降にのみ問題となるのかはわかりません。

1
Charl

「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

これですべてうまくいきました!

0
Olivier