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

时间:2019-11-09 00:54:27

标签: .net sql-server active-directory kerberos access-denied

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

首先设置:

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

服务器A:将Windows服务作为域Service_account运行 服务器B:将Windows服务作为域service_account

运行

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

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

现在,我确实收到此错误: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删除凭据,那不是会一直删除它,而不是只选择几次吗?

或者,也可以说这两个都不是导致此错误的真正原因。真正的问题不是错误本身,而是错误的非常零星的本质。可能是网络中的某些东西导致连接中断吗?

4 个答案:

答案 0 :(得分:5)

确保SQL Server可以看到共享。我发现进行测试的一种好方法是使用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 /网络名称解析是一个问题?确保使用FQDN。 如果与Kerberos相关,则可以通过使用托管共享的服务器的IP地址(例如exec xp_cmdshell 'dir \\10.10.10.x\sharename')来排除问题,当您使用IP时,身份验证必须回退到NTLM。根据服务器的安全性设置,您可能需要更改一些GPO才能使其正常工作。

答案 1 :(得分:3)

另一个原因可能是CONCURRENCY

网络中的另一个用户已经打开了excel文件,然后在打开文件的过程中,我们收到诸如“文件将处于只读模式”之类的消息(记不清了)。

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

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

因此,您可以尝试在CONCURRENT环境中进行复制。

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

答案 2 :(得分:2)

我很想知道使用xp_dirtree会说什么。我将其用于根文件夹并设置变量,以使其“足够深”以找到您的文件夹。

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

答案 3 :(得分:0)

非常感谢您抽出宝贵的时间来回复,非常感谢您的回复。

花了一些时间来获得有关此问题的更多信息。事实证明,这是<div class="display"> <img id="modelos" src="images/modelos/1.png"> <img id="logo-maior" src="images/type-logo.png" alt="TYPE logo"> <!-- <button type="button" onclick="displayPreviousImage()">Previous</button> <button type="button" onclick="displayNextImage()">Next</button> --> </div> 的问题。

我们确实查看了机器日志,并在机器上找到了以下日志,这些日志与我们正面临的kerberos-double-hop恰好一致。日志如下所示:

random errors

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

因此,这将其确定为kerberos-double-hop问题。我们仍然不确定为什么只发生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.。但这仍然是kerberos-doublehop