如何从Windows服务使用Windows身份验证连接到SQL Server?

17

我用C#编写了一个Windows服务,应该使用System.Data.SqlClient连接到SQL Server 2005 Express数据库。

由于Microsoft更喜欢使用Windows身份验证而不是SQL身份验证,因此我尝试使用受信任的连接/集成安全性来连接数据库。

但是,这并不起作用,因为我遇到了以下错误:

System.Data.SqlClient.SqlException:用户“NT AUTHORITY\LOCAL SERVICE”的登录失败。

是否可以使用其他Windows帐户登录?

5个回答

21

当前,该服务似乎是在LocalService帐户下运行的,而这个服务帐户目前没有被SQL授权。

可以通过以下两种方式解决这个问题:将帐户更改为已在SQL中得到授权的帐户,或将LocalService帐户作为SQL登录添加。 具体来说:

  • 更改服务在服务管理控制台中的运行帐户(例如:计算机管理|服务和应用程序|服务,然后右键单击要更改的服务的“属性”)。
  • 另一种方法是在“Microsoft SQL Management Studio”中,将LSA帐户添加为登录帐户,并以使其可以访问所需数据库对象的方式设置此新主体(登录帐户)。

编辑:第一种方法可能更可取,因为LocalService帐户在系统中如此普遍,授予它访问SQL后,如果使用它的特定服务或驱动程序被攻击,则会暴露SQL和数据库。相反,通过引入特定帐户,可以更好地控制谁以及如何访问SQL对象。当然,这也带来了配置此帐户的问题,包括授予它应该拥有的权限的系统级别配置,取决于底层服务的功能,可能需要使此帐户非常强大,因此在其他方面可能会存在潜在风险....


更改服务的用户听起来不错。但是如何以编程方式完成呢?我想在我的C#程序中实现这一点,而不是在服务管理控制台中进行操作。谢谢。 - räph
1
LSA代表本地安全机构,而不是LocalService。http://msdn.microsoft.com/en-us/library/ms721592%28VS.85%29.aspx#_security_local_security_authority_gly#_security_local_security_authority_gly - Remus Rusanu
@Remus:你说得很对,感谢你指出这一点。我已经进行了编辑;我的重点是让帐户和SQL主体匹配,所以我没有太关注LSA及其性质。重新审视答案促使我建议最好使用另一个帐户,我想你会同意这一点。此外,你是否偶然有关于OP寻找以编程方式在C#中更改某些服务配置参数的建议? - mjv
1
LSA是一个系统组件(lsass.exe),而不是一个账户。我编辑了你的帖子。在C#中以编程方式操作服务,可以使用ServiceController类:http://msdn.microsoft.com/en-us/library/system.serviceprocess.servicecontroller.aspx。为了设置特定的服务账户,最好的方法是在程序集中拥有一个ServiceInstaller,并让服务适当地配置自己:http://msdn.microsoft.com/en-us/library/system.serviceprocess.serviceinstaller.aspx。在应用程序中更改已安装的外部服务是不可取的。 - Remus Rusanu
1
已解决:在我的C#程序中,我将ServiceProcessInstaller.Account设置为USER并将服务分配给Windows用户帐户。在克服https://dev59.com/JUfRa4cB1Zd3GeqP8VpY后,它正在按预期工作! - räph
显示剩余3条评论

4
当Windows服务由服务控制管理器启动时,该进程与运行在操作系统上的任何其他进程一样,作为特定用户执行。
有许多“内置”用户帐户用于运行Windows服务。如果查看计算机管理中的“服务”节点,则可以看到完整的Windows服务集以及它们所运行的帐户(在Windows 7中称为“登录为”)。
根据我的经验,当我们想要使用集成安全性使Windows服务与数据库通信时,采取以下第二种方法:
1)将一个内置帐户分配为“登录为”帐户,并将此帐户添加为具有适当DB权限的SQL Server实例上的登录。
2)使用/创建本地或域帐户供Windows服务使用,然后将此帐户添加为具有适当DB权限的登录。通过安装程序提示安装服务期间的用户帐户凭据是可能的。
我不能自称足够专家以指出每种方法的所有优缺点,但值得考虑以下几点:
- 使用第1种方法的所有服务和进程都可以访问您的数据库。第2种方法则不是这种情况。 - 使用第1种方法,密码配置由机器本身管理,但使用第2种方法,管理员也可以管理密码,并符合任何必需的安全策略。
希望这可以帮助您。

3

如果您想使用可信的Windows身份验证,最简单的方法是使用具有所需最低权限的域帐户来运行服务,并授予该帐户对SQL Server数据库的权限。


1

您需要授予 SQL Express 中的 LOCAL SERVICE 帐户访问权限。根据我的评论,我的建议是创建一个新帐户,使您的服务可以在其下运行,然后在 SQL Express 中添加相关权限,换句话说,不要在 LOCAL SERVICE 下运行您的服务。


2
我考虑过这个问题,但是这样会不会每个服务都能访问我的数据库? - räph
每个服务都在该帐户下运行。您应该创建一个单独的帐户,并仅指定它所需的权限。 - James

1
如mjv所说,您需要为Local Service Account授予对数据库的访问权限或使用其他帐户运行服务。您询问了如何在编程方式下更改帐户,这可以通过为服务创建Installer并将Account属性更改为“User”,然后指定用户名和密码来运行服务来实现。
如果您向下滚动,以下链接包含有关创建安装程序的信息:

http://msdn.microsoft.com/en-us/library/aa984464(VS.71).aspx

以下内容提供了有关“账户属性”的更多详细信息:

http://msdn.microsoft.com/en-us/library/system.serviceprocess.serviceprocessinstaller.account(VS.71).aspx

希望这能帮到你。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接