2017-01-03 64 views
1

我有一个作为域用户运行的Windows服务(.NET),它具有对所需数据库资源和文件系统的完全权限。该服务调用一个在SQL Server中调用批量插入语句的过程。使用SQL Server和集成安全性的权限错误

该服务使用集成安全性运行,该帐户已被授予登录作为服务权限。但是,如果服务在除SQL Server所在位置以外的其他服务器上运行,则会面临权限问题。

应用程序服务器被称为Srv01,而数据库服务器是Sql01。该过程生成pdf并使用Sql01中的过程调用批量插入。当我在Srv01中安装Windows服务时,出现以下错误:

Cannot bulk load because the file "//Srv01/Output/Letter.pdf" could not be opened. Operating system error code 5(Access is denied.). 

网络共享拥有所有人的完全权限。我只是试图让这个工作,并在以后收紧安全。

当我运行相同的服务时,与数据库在同一台服务器上的同一个域用户,即Sql01,该进程正常工作。

我们正在运行:Windows Server 2012,SQL Server 2012 Enterprise,并且该服务是使用.NET 4.5编写的。我试图在sql server和app server上查看本地安全策略,但没有任何结果。是的,我也重新启动了应用服务器(不是数据库)。

+0

看起来像一个双跳问题:从srv01到sql01的身份验证有效,但是当sql01试图模拟该帐户访问srv01上的共享时,它会失败。有很多事情可能会在这里出错; [this site](https://www.roelvanlisdonk.nl/2009/05/22/microsoft-sql-2005-bulk-insert-kerberos-double-hop-and-operating-system-error-code-5-access -is-denied /)详细描述了一种情况。 –

+0

谢谢@JeroenMostert。那篇文章很有用,但它指向的论坛无法访问。我终于明白了!它与服务主体名称和Kerberos身份验证相关。我会写一个更大的条目作为答案。 – Candide

回答

0

我终于想通了这一点,我将分享以下结果:

  1. 安装Kerberos配置工具为SQL Server 2012,并确保所有的SPN配置正确。 URL:https://www.microsoft.com/en-us/download/details.aspx?id=39046 如果此工具在连接到SQL Server时出现任何错误,请检查本地组(可能是管理员),您可能会将删除的用户作为UUID出现,并将其删除。重新启动工具并修复任何问题。

  2. 配置windows服务的SPN。语法是:

    SETSPN -a [service_class]/[FQDN]:端口DOMAIN_NAME \ domain_user,你必须在网络中使用的FQDN

    注意,IP只不起作用。该端口是可选的。此外,从[service_class]只能从一个选定的关键字列表。列表在这里找到: https://technet.microsoft.com/en-us/library/cc772815(WS.10).aspx (归功于: https://serverfault.com/questions/350782/can-someone-please-explain-windows-service-principle-names-spns-without-oversi

    在我来说,我使用的HTTP服务器类(为什么没有理由的定制服务类并没有为我工作?!)

    setspn -a http/Srv01.mydomain.com MYDOMAIN \ myuser

  3. 接下来转到两个用户SQL Server域用户和Windows服务域用户的Active Directory属性。进入“委派”选项卡,然后选择“信任此用户以委派任何服务(仅限Kerberos)”。

  4. 最后,重新启动windows服务(我重新启动了SQL Server服务,以确定)。监视服务所在服务器的连接:

    从sys中选择session_id,net_transport,client_net_address,auth_scheme。dm_exec_connections WHERE client_net_address = 'XXX.XXX.XXX.XXX'

您应该看到Kerberos进行从应用服务器来连接。这也解决了文件权限问题。