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



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,我认为在 ADODB 中使用 Delphi 自己的对象包装器包含 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 在做什么,它破坏了应用程序 - 我如何告诉它停止它?

  • 客户端电脑:视窗 10 内部版本 17134
  • SQL Server
  • SQL Server2005
  • 网络共享: Windows Server 2003 R2

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

奖金喋喋不休

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

中小企业版本 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    SOVERFLOWian SOVERFLOWian 2.0.2   6
hydrogen    Contoso    SOVERFLOWian SOVERFLOWian 1.5     6

奖金阅读

  • 🕗https://changewindows.org/build/redstone4/17134/pc
  • Windows 10 版本 1803 更新中断某些应用程序(🕗(
  • KB4284835:2018 年 6 月 12 日 - KB4284835(操作系统内部版本 17134.112((🕗(
  • 视窗 10 秋季创作者更新和群晖网络存储(🕗(
  • KB4034314:默认情况下,SMBv1 未安装在 Windows 10 秋季创意者更新和 Windows Server 版本 1709 及更高版本中(🕗(
  • Windows 10 1803 无法从网络共享文件夹运行 EXE 文件(🕗(
  • [RS4:1803]Windows 10 1803 无法从网络运行 ODBC SQL 连接的应用程序(🕗(

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


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

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

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

Microsoft正在制定一项决议,将于6月晚些时候提供。

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

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


编辑 6/28/2018- 已修复

Microsoft 已在操作系统内部版本 17134.137 中发布了修补程序:

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

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

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

最新更新