来自 Windows 10 上网络共享的应用程序 运行 无法连接到 SQL 服务器

Application run from network share on Windows 10 cannot connect to SQL Server

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

软件:

失败并出现错误:

[DBNETLIB][ConnectionOpen (Connect()).]SQL Server does not exist or access denied

如果软件是 运行 来自本地 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 does not exist or access denied

使用 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 does not exist or access denied

并使用 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,它正在破坏应用程序 - 我该如何告诉它停止它?

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

奖金聊天

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 命令提示符中获取 运行ning 使用的 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 Defender 的一个问题,预计将在 6 月晚些时候(2018 年)修复。


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

Microsoft 已确认此 "hot issue":

  • Symptom: Some users running Windows 10 version 1803 may receive an error "An invalid argument was supplied" when accessing files or running programs from a shared folder using the SMBv1 protocol.
  • Workaround: Enable SMBv2 or SMBv3 on both the SMB server and the SMB client, as described in KB2696547.

Microsoft is working on a resolution that will be available later in June.

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

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


编辑 2018 年 6 月 28 日 - 修复

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

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

  • Addresses an issue where some users may receive an error when accessing files or running programs from a shared folder using the SMBv1 protocol. The error is "An invalid argument was supplied".

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