首页 > 解决方案 > 从 Windows 10 上的网络共享运行的应用程序无法连接到 SQL Server

问题描述

Windows 10 Build 17134(2018 年 4 月)已开始影响用户。

软件:

它失败并出现错误:

[DBNETLIB][ConnectionOpen (Connect()).]SQL Server 不存在或访问被拒绝

如果该软件是从本地 PC 运行的,它可以正常工作。

使用 ADO

我试过使用 ADO COM 对象:

String connectionString = "Provider=sqloledb;Data Source=screwdriver;Integrated Security=SSPI;";

Connection cn = CreateComObject("ADODB.Connection") AS Connection;
cn.Open(ConnectionString, "", "", 0);

[DBNETLIB][ConnectionOpen (Connect()).]SQL Server 不存在或访问被拒绝

使用 OLE DB

没人知道,ADO 是过度设计的 OLE DB API 的友好包装器:

String connectionString = "Provider=sqloledb;Data Source=screwdriver;Integrated Security=SSPI;";

IDataInitialize dataInit = CreateComObject(CLSID_MSDAInitialize) as IDataInitialize;
IDBInitialize provider;
dataInit.GetDataSource(nil, CLSCTX_INPROC_SERVER, ConnectionString, IDBInitializeSC, out provider);

provider.Initialize; //Actually opens the connection to the database

[DBNETLIB][ConnectionOpen (Connect()).]SQL Server 不存在或访问被拒绝

并使用 Delphi XE6 的 ADOdb 包装器

因为我使用 Delphi,所以我认为使用 Delphi 自己的 ADODB 对象包装器包含一个 CMRE 是没有用的:

program W10OleDbTest;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils,
  ComObj,
  ADOdb,
  ADOInt,
  ActiveX,
  WinApi.OleDb;

var
    cs: string;
    conn: TADOConnection;
begin
    conn := TADOConnection.Create(nil);
    conn.ConnectionString := 'Provider=sqloledb;Data Source=screwdriver;Integrated Security=SSPI;';
    WriteLn('Opening connection to database using TADOConnection...');
    try
        conn.Open;
        WriteLn('Successfully connected to database using TADOConnection');
    except
        on E:Exception do
            WriteLn('Exception connecting to database using TADOConnection: '+E.Message);
    end;

    Writeln('Press enter to close.');
    ReadLn;
end.

Windows 10 正在做什么,它正在破坏应用程序 - 我如何告诉它停止它?

查看Build 17134 的发行说明,没有与此类相关的更改;所以我认为这是一个错误。

奖金喋喋不休

中小企业版本 1

如果应用程序从 SMB 1(与 SMB 2 或 SMB 3)共享启动,这似乎是一种意外的安全功能(即我无法禁用的安全功能),它会阻止应用程序打开网络连接:

| SMB Version | Result    | Example of product     |
|-------------|-----------|------------------------|
| 1.5         | Fails     | Windows 2000           |
| 1.5         | Fails     | Synology NAS           |
| 2.0         | Works     | Windows Server 2008    |
| 2.1         | Works     | Windows Server 2008 R2 |

显然,正确编写的应用程序在更新到 Windows 后失败是不好的。

您可以通过从 Powerhell 命令提示符运行来获取正在使用的 SMB 版本:

> Get-SmbConnection

ServerName  ShareName  UserName      Credential    Dialect NumOpens
----------  ---------  --------      ----------    ------- --------
screwdriver Fizbang    SOVERFLOW\ian SOVERFLOW\ian 2.0.2   6
hydrogen    Contoso    SOVERFLOW\ian SOVERFLOW\ian 1.5     6

奖金阅读

标签: windows-10oledbadosmbdelphi-xe6

解决方案


这是 Windows Defender 的一个问题,预计将在 6 月下旬(2018 年)修复。


如果应用程序从 SMBv1 共享运行并安装了 Windows Defender,则不允许该应用程序打开套接字连接。

微软承认这是一个“热点问题”

  • 症状:一些运行 Windows 10 版本 1803 的用户在使用 SMBv1 协议从共享文件夹访问文件或运行程序时可能会收到错误“提供了无效参数”。
  • 解决方法:在 SMB 服务器和 SMB 客户端上启用 SMBv2 或 SMBv3,如 KB2696547 中所述。

Microsoft 正在制定一项将于 6 月晚些时候推出的解决方案。

您还可以通过安装不同的防病毒产品来解决此问题。如果您安装其他防病毒产品,Windows Defender 将自行禁用,您可以运行您的应用程序。

注意:禁用 Windows Defender 是不够的,因为它实际上并没有禁用 Windows Defender。在 Windows Defender 实际禁用自身之前,您必须安装另一个 AV。


2018 年 6 月28 日编辑- 已修复

Microsoft 在 OS Build 17134.137 中发布了修复:

2018 年 6 月 26 日 - KB4284848(操作系统内部版本 17134.137) 存档

  • 解决了某些用户在使用 SMBv1 协议从共享文件夹访问文件或运行程序时可能会收到错误的问题。错误是“提供了无效的参数”。

安装 KB4284848,重新启动,并确认它已修复它。


推荐阅读