使用 SQL 服务器和集成安全性的权限错误

Permission Error using SQL Server and Integrated Security

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

该服务 运行 具有集成安全性,该帐户已被授予作为服务登录的权限。但是,当服务 运行s 在 SQL 服务器所在的不同服务器中时,我遇到了权限问题。

应用服务器名为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.).

网络共享对 Everyone 具有完全权限。我只是想让它工作并稍后加强安全性。

当我运行相同的服务,在与数据库相同的服务器上有相同的域用户,即Sql01,进程运行正常。

我们是运行ning:Windows Server 2012,SQL Server 2012 Enterprise,服务是用.NET 4.5编写的。我尝试查看 sql 服务器和应用程序服务器上的本地安全策略,但没有任何结果。是的,我也重新启动了应用服务器(虽然不是数据库)。

我终于弄明白了,我将分享以下发现:

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

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

    setspn -a [service_class]/[FQDN]:端口DOMAIN_NAME\domain_user

    注意网络中必须使用FQDN,仅IP是不行的。端口是可选的。此外,from [service_class] 只能来自 selected 关键字列表。列表可在此处找到: 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 服务器 class(为什么?没有理由!自定义服务 class 对我不起作用)

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

  3. 接下来转到两个用户 SQL 服务器域用户和 Windows 服务域用户的 Active Directory 属性。进入委派选项卡,然后 "Trust this user for delegation to any service (Kerberos only)".

  4. 最后,重启windows服务(为了确定,我重启了SQL服务器服务)。监视来自安装服务的服务器的连接:

    select session_id,net_transport,client_net_address,auth_scheme 来自 sys.dm_exec_connections 其中 client_net_address = 'XXX.XXX.XXX.XXX'

对于来自应用程序服务器的连接,您应该会看到 Kerberos。这也解决了文件权限问题。