从Windows 10上的网络共享运行的应用程序无法连接到SQL Server

时间:2018-06-13 16:08:56

标签: windows-10 oledb ado smb delphi-xe6

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

软件:

  • 从网络共享运行(例如\\ hydrogen \ Contoso \ Grobber.exe)
  • 连接到SQL Server数据库
  • 使用OLEDB

失败并显示错误:

  

[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,它正在破坏应用程序 - 我该怎么告诉它停止它?

  • 客户端PC :Windows 10 Build 17134
  • SQL Server :SQL Server 2005
  • 网络共享:Windows Server 2003 R2

查看release notes from Build 17134,没有任何相关的变化;所以我认为这是一个错误。

Bonus Chatter

  • 对可执行文件进行数字签名没有区别
  • 按IP地址(而不是名称)指定SQL Server没有区别
  • 以管理员身份运行应用程序没有任何区别
  • 关闭公开私有防火墙没有区别
  • 关闭Windows Defender没有区别
  • 关闭Windows Defender实时保护没有区别

SMB版本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

奖金阅读

1 个答案:

答案 0 :(得分:1)

Windows Defender存在问题,预计将在6月(2018年)晚些时候进行修复。

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

Microsoft已经承认这是一个"热点问题"

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

微软正在制定一项将于6月晚些时候推出的决议。

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

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

编辑6/28/2018 - 已修复

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

  

June 26, 2018—KB4284848 (OS Build 17134.137) archive

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

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