我有一个以域用户身份运行的Windows服务(.NET),它具有所需数据库资源和文件系统的完全权限。该服务调用一个在SQL Server中调用批量插入语句的过程。
该服务以集成安全性运行,该帐户已被授予登录服务权限。但是,当服务在SQL Server所在的服务器以外的其他服务器上运行时,我将遇到权限问题。
app服务器名为Srv01,db服务器名为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,该过程可以正常工作。
我们正在运行:Windows Server 2012,SQL Server 2012 Enterprise,该服务是用.NET 4.5编写的。我已经尝试在sql server和app server上查看本地安全策略,但没有任何结果。是的,我也重新启动了应用服务器(虽然不是数据库)。
答案 0 :(得分:0)
我终于弄明白了,我将分享以下发现:
为SQL Server 2012安装Kerberos配置工具,并确保正确配置所有SPN。网址:https://www.microsoft.com/en-us/download/details.aspx?id=39046 如果此工具在连接到SQL Server时出现任何错误,请检查本地组(可能是管理员),您可能将已删除的用户显示为UUID,并将其删除。重启该工具并解决任何问题。
为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
接下来转到用户SQL Server域用户和Windows服务域用户的Active Directory属性。进入“委派”选项卡,然后“#34;信任此用户以获取任何服务的授权(仅限Kerberos)"。
最后,重新启动Windows服务(我重新启动SQL Server服务只是为了确定)。使用以下命令监视安装服务的服务器的连接:
从sys.dm_exec_connections中选择session_id,net_transport,client_net_address,auth_scheme WHERE client_net_address =' XXX.XXX.XXX.XXX'
您应该看到来自应用程序服务器的连接的Kerberos。这也解决了文件权限问题。