SQL 服务器身份验证在不同服务帐户下的行为不同

SQL Server Authentication behaves differently under different 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,那么我会收到 "Login failed"。 (当 运行 启用服务时也会发生同样的情况)。

我花了一天多的时间研究这个问题,所以如果有人有任何想法可能是错的,我将不胜感激。

更新: SQL 服务器日志中的错误消息是

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' 列在安全 --> 登录下。

当我尝试启动服务时发生的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 池、String accessToken、Boolean applyTransientFaultHandling) 在 System.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions 选项、DbConnectionPoolKey poolKey、对象 poolGroupProviderInfo、DbConnectionPool 池、DbConnection owningConnection、DbConnectionOptions userOptions)

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

(localdb) 对特定用户而言是本地的。使用 sqllocaldb share(从提升的命令提示符)公开一个跨用户可用的实例:

sqllocaldb share MSSQLLocalDB SharedLocalDB

如果实例是运行,共享实例可用前需要重启:

sqllocaldb stop MSSQLLocalDB
sqllocaldb start MSSQLLocalDB

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

请注意,LocalDB 的预期用途是隔离测试,无需管理 SQL 服务器(实际上,管理它的选项很少)。如果您需要一个持续可用的数据库实例,最好安装一个 SQL Server Express 实例。