用于SQL批量插入的Kerberos委派(访问被拒绝)

在下列情况下尝试批量插入到SQL时遇到问题:

  • 在Workstation A上运行pipe理工作室
  • 在服务器B上运行的SQL
  • 从位于服务器C上进行批量上传的文件

当我尝试和批量上传时,我得到的错误

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

现在我知道我们在这里有一个双跳的问题,需要整理委托。 已经为SQL设置了SPN,如下所示(SQL正在另一个端口上运行)。 SQL以域用户身份运行,并且SPN位于该帐户上。

 command: setspn -l domain\sqluser result: MSSQLSvc/WIN-D04V1IOTESN MSSQLSvc/WIN-D04V1IOTESN.domain.local MSSQLSvc/win-d04v1iotesn.domain.local:55037 MSSQLSvc/WIN-D04V1IOTESN:55037 

我也设置了从SQL用户帐户到CIFS和HOST的文件服务器的委派,但是无济于事。

我已启用Kerberos日志logging,并在事件查看器中看到以下事件:

  A Kerberos Error Message was received: on logon session Client Time: Server Time: 14:44:10.0000 8/9/2011 Z Error Code: 0xe KDC_ERR_ETYPE_NOTSUPP Extended Error: Client Realm: Client Name: Server Realm: domain.LOCAL Server Name: krbtgt/domain.LOCAL Target Name: krbtgt/[email protected] Error Text: File: 9 Line: efb Error Data is in record data. 

那么,有什么想法,我在这里失踪? 我以前有过这种委派,但是在默认端口上总是使用SQL,可能会有什么影响吗?

编辑

我现在也看到这个Kerbors错误和第一个一起:

 A Kerberos Error Message was received: on logon session Client Time: Server Time: 15:4:10.0000 8/9/2011 Z Error Code: 0xe KDC_ERR_ETYPE_NOTSUPP Extended Error: Client Realm: Client Name: Server Realm: domain.LOCAL Server Name: krbtgt/domain.LOCAL Target Name: krbtgt/[email protected] Error Text: File: 9 Line: efb Error Data is in record data. 

从注释中,您使用域login连接到SQL,因此SQL在连接到文件共享时试图模拟您。 如果您没有为您的域帐户设置此委派,那么它将失败。

当运行存储过程作为SQLlogin连接时,SQL将尝试使用它所运行的域服务帐户,对此,您已经设置了委派。

如果您使用域服务帐户连接您的查询窗口SQL正在运行,因为它应该工作,因为该委派已经configuration。 为您自己的域帐户设置代理信任到文件服务器,它应该开始工作。

SPN的外观正确的SQL Server。 文件服务器是否注册了正确的SPN?

另一件可以搞砸Kerberosauthentication到SQL Server的问题是DNS问题。 我读的地方,SQL客户端将做服务器的地址反向DNS查找,并使用该名称形成SPN。

我知道你已经做了许多这些步骤,但这应该是你需要做的一切。
确保SQL服务器和文件服务器的DNSparsing正常工作。
注册SQL Server的SPN。 确保没有重复的SPN。 在SQL 2008 setspn可以做这个检查你。
注册文件服务器的SPN。 确保没有重复。
在SQL Server服务帐户上启用“受信任委派”。
同时检查您的账户是否被标记为不可延迟。 (这是一个字?)

如果您无法使其正常工作,则可以设置SQL代理作业来取消批量插入。 然后它将在您configuration作业运行的帐户下运行。

错误消息中缺less客户端时间使我感到疑惑。 如果客户机上的时间和服务器上的时间太不相同,Kerberos身份validation将会失败。 (我从来不知道“真是太不一样了”,我知道一分钟可以做到这一点,因为昨天我们再次遇到了这个问题)。

Kerberos身份validation失败时,SSMS可能仍会连接,但会默默地回退到使用NTLM身份validation。

你可以通过调整连接设置和string来强制kerberos,这样如果Kerberosauthentication连接将会很难,但是有一个更简单的方法来查看你是否连接了Kerberos。 为确保您使用Kerberos身份validation进行连接,请通过SSMS正常连接,并在SSMS查询窗口中运行此操作:

从master.sys.dm_exec_connections中selectauth_scheme,其中session_id = @@ spid

你应该看到“KERBEROS”。 如果你不这样做,你可能会看到“NTLM”,你会知道有什么地方是错的。