【问题标题】:How to connect to sql-server with windows authentication from windows-service?如何通过 windows-service 的 windows 身份验证连接到 sql-server?
【发布时间】:2010-02-11 13:54:32
【问题描述】:

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

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

但是这不起作用,因为我得到了:

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

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

【问题讨论】:

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


    【解决方案1】:

    目前,该服务似乎在 LocalService Account 下运行,并且该服务帐户当前未在 SQL 上授权。

    可以通过以下两种方式之一解决这种情况:在 SQL 中授权的帐户下运行帐户或在 SQL 中添加 LocalService 帐户作为登录。具体来说:

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

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

    【讨论】:

    • 谢谢。更改服务的用户听起来不错。但是如何以编程方式完成呢?我想在我的 c# 程序中执行此操作 - 而不是在服务管理控制台中..
    • @räph:不久前我会建议研究 ADSI API,但现在您应该能够使用 .NET System.ServiceProcess.ServiceController 类更轻松地“处理帐户”。虽然我用它来启动/停止服务,但我从来没有以这种方式改变过服务的设置。我见过的其他方法是生成一个 net 命令(尽管我不相信以这种方式更改服务是可能的)以及最近使用 PowerShell(确实允许更改服务属性,尽管我也没有这方面的经验.. .).
    • LSA 代表 Local Security Authorithy,而不是 LocalService。 msdn.microsoft.com/en-us/library/…
    • LSA 是一个系统组件 (lsass.exe),而不是一个帐户。我编辑了你的帖子。要在 C# 中以编程方式操作服务,请使用 ServiceController 类msdn.microsoft.com/en-us/library/…。要设置特定的服务帐户,最好的方法是在程序集中有一个 ServiceInstaller 并让服务自行配置:msdn.microsoft.com/en-us/library/…。不建议在安装后从应用程序更改外部服务。
    • 已解决:在我的 c# 程序中,我将 ServiceProcessInstaller.Account 设置为 USER 并将服务分配给 Windows 用户帐户。克服stackoverflow.com/questions/790795/… 后,它按预期工作!
    【解决方案2】:

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

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

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

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

    2) 使用/创建一个本地或域帐户供 Windows 服务使用,然后将此帐户添加为具有适当数据库权限的登录名。在安装服务期间,可以通过安装程序提示输入用户帐户凭据。

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

    • 使用方法 1,所有作为所选内置帐户运行的服务和进程都将有权访问您的数据库。方法 2 并非如此。

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

    希望对你有帮助

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 我想过,但不是每个服务都可以访问我的数据库吗?
        • 在该帐户下运行的每个服务都是。您应该创建一个单独的帐户并仅指定它所需的权限。
        【解决方案5】:

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

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

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

        虽然以下提供了有关 Account 属性的更多详细信息:

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

        希望这会有所帮助。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-07-27
          • 1970-01-01
          • 1970-01-01
          • 2013-05-07
          • 1970-01-01
          • 2013-09-07
          • 1970-01-01
          相关资源
          最近更新 更多