SQL Server身份验证在不同的服务帐户下表现不同

时间:2017-07-12 10:26:47

标签: sql-server service-accounts

我有一个应用程序,它需要在给定服务帐户下的Windows上运行。 .NET应用程序连接到MSSQL数据库,在连接字符串中我指定了使用的SQL服务器身份验证,即

<add name="conn" connectionString="Data Source=(localdb)\MSSQLLocalDB;initial catalog=MyDB;User Id=testuser;Password=xxx" providerName="System.Data.SqlClient" />

如果我在常规域帐户下运行SSMS,那么我可以使用SQL用户'testuser'连接到数据库。但是,如果我在应该运行应用程序的服务帐户下运行SSMS,那么我会收到“登录失败”。 (运行服务时也是如此)。

我花了一天多的时间来研究这个问题,所以如果有人有任何想法可能会出错,我会非常感激。

更新 SQL Server日志中的错误消息是

07/12/2017 12:18:32,Logon,Unknown,Login failed for user 'testuser'. Reason: 
Could not find a login matching the name provided. [CLIENT: <named pipe>]
07/12/2017 12:18:32,Logon,Unknown,Error: 18456<c/> Severity: 14<c/> State: 5.

但是,如果我使用我的域帐户登录SSMS,则“安全性”下会列出“testuser” - &gt;登录。

当我尝试启动服务时发生的SQL异常是

该服务未成功启动 System.Data.SqlClient.SqlException(0x80131904):用户'testuser'登录失败。    在System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity标识,SqlConnectionString connectionOptions,SqlCredential凭证,Object providerInfo,String newPassword,SecureString newSecurePassword,Boolean redirectedUserInstance,SqlConnectionString userConnectionOptions,SessionData reconnectSessionData,DbConnectionPool pool,String accessToken,Boolean applyTransientFaultHandling)    在System.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions选项,DbConnectionPoolKey poolKey,Object poolGroupProviderInfo,DbConnectionPool池,DbConnection owningConnection,DbConnectionOptions userOptions)

我省略了一些堆栈跟踪,因为它很长。

1 个答案:

答案 0 :(得分:3)

(localdb)是特定用户的本地用户。使用sqllocaldb share(从提升的命令提示符)公开可在用户之间使用的实例:

sqllocaldb share MSSQLLocalDB SharedLocalDB

如果实例正在运行,则需要在共享实例可用之前重新启动它:

sqllocaldb stop MSSQLLocalDB
sqllocaldb start MSSQLLocalDB

您现在可以(localdb)\.\SharedLocalDB连接到共享实例(请注意额外的.\)。

请注意,LocalDB的预期用途是单独测试,而不必管理SQL Server(实际上,管理它的选项很少)。如果您需要一个可以连续使用的数据库实例,那么最好安装SQL Server Express实例。