无法批量加载,因为无法打开文件“”。操作系统错误代码 5(访问被拒绝。)

Cannot bulk load because the file “" could not be opened. Operating system error code 5(Access is denied.)

好的。我确实看到已经提出了很多类似的问题。从表面上看,我可能不应该问这个问题,因为很多人已经尝试回答这个问题,但我会解释我的情况是不同的:

首先我的设置:

我在负载均衡器后面有两台服务器

服务器 A:运行 作为域的 windows 服务 Service_account 服务器 B:运行 windows 服务作为域 service_account

然后这个 windows 服务最终调用 SQL 服务器来执行存储过程,该过程当然会尝试从 \network\location 上的文件进行批量插入。现在,我不知道他的信息有多重要,但这个网络位置实际上是在 Server B 上共享为网络共享的文件夹,所以基本上 \network\location = 服务器 B:C/something.

现在,我已将所有人添加为该文件夹的用户,并将其设置为完全控制,以确保任何试图访问该文件夹的人都不会出现权限问题。

现在,我确实收到了这个错误:Cannot bulk load because the file “" could not be opened. Operating system error code 5(Access is denied.).

只是有时候。这里的整个问题是错误不能始终如一地重现。它每周只发生一次。我尝试绕过负载均衡器并直接从服务器发出请求,但没有发现任何问题。此外,我还观察到在这个失败的请求之前和之后发出的请求都是成功的。这意味着这是 in a true sense 一个偶发错误。

浏览SO之后,我发现传统上导致这个错误的两个主要原因是:

  1. 当用户 运行 该服务确实无权访问此文件夹时。事实并非如此,因为实际上每个人都可以访问此文件夹。

  2. 我遇到了一些线程,其中人们指出潜在的 Kerberos Double Hop 是一个潜在的问题。如此处所述:https://docs.microsoft.com/en-us/previous-versions/msp-n-p/ff649317(v=pandp.10)?redirectedfrom=MSDN

可能是 Kerberos,我正在进一步研究以查看它是否是问题所在。但与此同时,说 Kerberos double hop 是罪魁祸首,如何解释这个错误的偶发性?如果 kerberos 正在丢弃凭据,那么不会一直丢弃它而不是只选择几次吗?

或者,如果这两个中的 none 是此错误背后的真正原因。真正的问题不是错误本身,而是错误的偶发性。会不会是网络中的某些东西导致连接中断?

确保 SQL 服务器可以看到共享。我发现对此进行测试的一种好方法是使用 xp_cmdshell 对共享执行 DIR。例如

exec sp_configure 'show advanced' , 1
RECONFIGURE
exec sp_configure 'xp_cmdshell' , 1
RECONFIGURE
exec xp_cmdshell 'dir \host.domain.local\sharename'

如果是偶发的,可能是因为 DNS/network 名称解析有问题?确保使用 FQDN。 如果它与 Kerberos 相关,那么您可以使用托管共享的服务器的 IP 地址来排除问题,即 exec xp_cmdshell 'dir \10.10.10.x\sharename' 当您使用 IP 时,身份验证必须回退到 NTLM。根据服务器的安全设置,您可能需要更改一些 GPO 才能使其正常工作。

另一个原因可能是 CONCURRENCY

当 excel 文件已被网络中的另一个用户打开时,在此期间我们打开文件时,我们会收到类似 "File will be in Read only mode" 的消息(记错了)。

类似地,当我们通过C#等应用程序读取excel文件时,如果有很多用户同时使用同一个文件,我们也会得到同样的错误。

我们的应用程序将此类错误转换为“Access is denied...”。 所以有时它工作正常,有时它会抛出错误。

所以你可以尝试在CONCURRENT环境下重现。

按照 this link 中的描述对 excel 进行更改。

我很想知道使用 xp_dirtree 说了什么。我会将它用于根文件夹并设置变量,以便它 "deep enough" 找到您的文件夹。

 EXEC master.sys.xp_dirtree ‘filePath1’,0,1;

非常感谢您花时间回复,非常感谢您的回复。

只是花了一些时间才获得有关此问题的更多信息。结果是 kerberos-double-hop 问题。

我们确实深入研究了机器日志,我们发现机器上的以下日志与我们面临的 random errors 完全一致。日志如下所示:

The delegated TGT for the user (username@domainname) has expired. A renewal was attempted and failed with error 0xc0000001. The server logon session (0x9:8748fa4a) has stopped delegating the user's credential. For future unconstrained delegation to succeed, the user needs to authenticate again to the server.

我们看到错误的用户名是运行 Web 服务并最终调用失败存储过程的服务帐户的用户名。

所以这确定它是一个 kerberos-double-hop 问题。我们仍然不确定为什么它只发生 sometimes-randomly。但它仍然是 kerberos-doublehop