如何使用Windows服务的Windows身份验证连接到sql-server?

时间:2010-02-11 13:54:33

标签: c# .net sql-server sql-server-2005 windows-services

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

由于Microsoft更喜欢使用基于SQL身份验证的Windows身份验证,因此我尝试使用Trusted Conenction / Integrated Security连接到数据库。

然而,这不起作用,因为我得到一个System.Data.SqlClient.SqlException:用户登录失败 'NT AUTHORITY \ LOCAL SERVICE'。

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

5 个答案:

答案 0 :(得分:16)

目前,该服务似乎目前在LocalService Account下运行,此服务帐户目前尚未获得SQL授权。

可以通过以下两种方式之一修复此情况:在SQL中授权的帐户下运行帐户,或者将LocalService帐户添加为SQL中的登录帐户。具体做法是:

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

编辑:第一种方法可能更可取,因为在系统中普遍存在LocalService帐户,授予它访问SQL的权限会暴露SQL,数据库将使用特定的服务或驱动程序因此,通过引入特定帐户,可以更好地控制谁访问SQL对象以及如何访问SQL对象。这当然会带来配置这样一个帐户的问题,关于应该授予的权限,在系统级别(而不是SQL),并且根据底层服务的作用,可能需要创建此帐户相当强大,因此在其他方面可能承担责任......

答案 1 :(得分:4)

当服务控制管理器启动Windows服务时,该进程作为特定用户执行,就像在操作系统上运行的任何其他进程一样。

有许多“内置”用户帐户用于运行Windows服务。如果查看“计算机管理”中的“服务”节点,您可以看到完整的Windows服务及其运行的帐户(在Windows 7中称为“登录身份”)。

根据我的经验,当我们希望Windows服务使用集成安全性与数据库通信时,我们采用以下第二种方法:

1)将其中一个内置帐户指定为“登录身份”帐户,并将此帐户添加为具有相应数据库权限的SQL Server实例上的登录

2)使用/创建要使用的Windows服务的本地或域帐户,然后将此帐户添加为具有相应数据库权限的登录帐户。安装程序可以在安装服务期间提示用户帐户凭据。

我不能声称自己足够专业,可以指出每种方法的所有优点和缺点,但值得考虑以下几点:

  • 使用方法1,作为所选内置帐户运行的所有服务和进程都有权访问您的数据库。方法2不是这种情况。

  • 使用方法1,密码配置由机器本身管理,但使用方法2,密码可以由管理员管理,并且还符合任何所需的安全策略。

我希望这会有所帮助

答案 2 :(得分:2)

如果要使用受信任的Windows身份验证,最简单的方法是使用权限为sql server数据库的域帐户(需要最少的权限)运行该服务。

答案 3 :(得分:1)

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

答案 4 :(得分:1)

正如mjv所说,您需要为本地服务帐户授予对数据库的访问权限,或者使用其他帐户来运行该服务。您询问了如何以编程方式更改帐户,这可以通过为服务创建安装程序并将“帐户”属性更改为“用户”,然后指定用户名和密码来运行服务来实现。

以下链接包含有关创建安装程序的信息,如果您滚动到底部:

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

希望这有帮助。