【问题标题】:Why can't I add WORKGROUP\.. as a user in SQL Server?为什么我不能将 WORKGROUP\.. 添加为 SQL Server 中的用户?
【发布时间】:2016-12-05 00:30:58
【问题描述】:

背景故事:

我花了 20 多个小时试图通过我的 Windows 服务连接到我的 Sql Server 数据库,每次我修复异常时,我都会找到另一个。

作为一个测试我有

    protected override void OnStart(string[] args)
    {
        EventLog.WriteEntry(ServiceName + " started");
        PageLoadTimer.Enabled = true;

        using(var conn = new SqlConnection("Data Source=DESKTOP-300NQR3\\SQLEXPRESS;Initial Catalog=MyDb;Integrated Security=True"))
        {
           string q = "INSERT INTO [dbo].[PageDocument] (Html, PageType, DateAdded, DateProcessed) VALUES ('<p>Hi!</p>', 0, GETDATE(), NULL)";
           using(var comm = new SqlCommand(q, conn))
           {
               conn.Open();
               comm.ExecuteNonQuery();
               conn.Close();
           }
        }
    }

然而当我尝试启动我在 EventViewer 中看到的服务时

服务无法启动。 System.Data.SqlClient.SqlException (0x80131904): 无法打开请求的数据库“LrcPageTask” 登录。登录失败。用户登录失败 '工作组\桌面-300NQR3$'。在 System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity 身份、SqlConnectionString 连接选项、SqlCredential 凭证、对象 providerInfo、字符串 newPassword、SecureString newSecurePassword、布尔重定向用户实例、SqlConnectionString userConnectionOptions, SessionData reconnectSessionData, DbConnectionPool 池,字符串 accessToken,布尔值 applyTransientFaultHandling) 在 System.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions 选项,DbConnectionPoolKey poolKey,对象 poolGroupProviderInfo, DbConnectionPool 池,DbConnection owningConnection, DbConnectionOptions 用户选项)在 System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnectionPool 池,DbConnection owningObject,DbConnectionOptions 选项, DbConnectionPoolKey 池...

顺便说一句,我从服务器资源管理器 -> VS 中的连接字符串获得了该连接字符串,并且我的 Windows 服务在 LocalSystem 下运行。

我尝试通过执行 Security -> Logins -> New Login 在 SQL Server 中添加用户 WORKGROUP\DESKTOP-300NQR3$,但随后出现错误

登录“WORKGROUP\DESKTOP-300NQR3$”创建失败

我已经厌倦了试图解决这个问题,所以我将发布一个指向我的整个源代码的链接https://github.com/jamkin/lrcvault/tree/master/BoardScanner

【问题讨论】:

  • 用户名应该是NT AUTHORITY\SYSTEM,在我看来您使用的客户端无法应对这种情况。 (但您可能应该尝试将SYSTEM 添加为 SQL 登录,并确保您也检查 SQL 服务器上的日志,以防真正的问题是其他问题。)假设我的第一个猜测是正确的,您可以尝试运行服务作为本地服务而不是系统。其他选项包括虚拟帐户、托管服务帐户或常规帐户。
  • 该账户是否有权限作为服务登录? technet.microsoft.com/en-us/library/cc794944(v=ws.10).aspx
  • @Mick 什么账号?
  • WORKGROUP\DESKTOP-300NQR3$
  • @Mick,这不是一个有效的帐户名,尽管如果机器在域中而不是工作组中。 (它将代表计算机在域中的帐户。)

标签: c# .net sql-server windows


【解决方案1】:

要在计算机之间运行集成的 Windows 安全性,您需要域控制器和域上的帐户(所有计算机都知道)以进行身份​​验证。如果您要在机器之间使用集成安全性,您应该:-

  1. 创建域服务帐户。在您的域控制器上,打开 Active Directory 用户和计算机,选择用户,右键单击新用户,取消选中下次登录时更改密码,检查密码永不过期,输入密码。帐户属于域中的哪些组由您决定,但不必是任何组的成员。
  2. 将 windows 服务的登录更改为使用在步骤 1 中创建的域服务帐户。在托管 windows 服务的计算机上,转到控制面板 -> 管理工具 -> 服务 -> 您的服务 -> 属性 ->登录。
  3. 确保托管 Windows 服务的计算机上的服务帐户具有login in as a service 的权限。
  4. 将服务帐户的安全登录添加到 SQL Server(服务器 -> 安全 -> 登录)
  5. 为步骤 3 中添加的 sql 用户(服务器 -> LrcPageTask -> 安全 -> 用户)添加一个用户到数据库,并且该用户具有适当的角色成员身份

如果您没有域控制器,则需要在同一台机器上运行 windows 服务和 SQL Server,并使用本地用户帐户而不是域帐户,按照上述步骤,使用本地用户帐户代替域帐户。

或者不使用集成安全性,使用 SQL 登录名和密码。

【讨论】:

  • 如果您可以为步骤 1-3 提供更多详细信息,我将选择最佳答案
  • 我添加了一些细节。周围没有很多好的向导。我看了看,大多数指南最终将服务帐户添加到管理员组,我永远不会这样做,您应该授予服务帐户访问它需要访问的特定资源的权限。但作为指导尝试...youtube.com/watch?v=wHa_eh96UHg
【解决方案2】:

对于非域/非网络上下文,提供对数据库的访问权限与运行进程的身份相关。当机器连接到域并访问另一台机器上的数据库时,使用 domainname\machinename$ 代替 NT Authority\Network Service。

在 IIS 中也有与应用程序池相关联的特殊标识,因此如果您使用应用程序池标识,这些标识的格式为 IIS APP POOL\AppPoolname。

我刚刚遇到了 workgroup\servername$ 错误,我受到以下事实的挑战:我收到了一个错误,告诉我添加一个我无法添加的登录名,我认为这是一个错误。

这里有一些关于这如何适用于正常网络上下文的参考。

http://msdn.microsoft.com/en-us/library/ms998292.aspx http://msdn.microsoft.com/en-us/library/ms998358.aspx

【讨论】:

    【解决方案3】:

    如果 Windows 服务和 SQL 服务器在同一台机器上,这是一种可能的解决方法:

    Services -&gt; Service Properties -&gt; Login -&gt; not with a system account, but with a local account.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-07
      • 1970-01-01
      • 2017-07-03
      • 2011-07-31
      • 2014-05-19
      • 2011-01-30
      • 2018-12-02
      相关资源
      最近更新 更多