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 实例。
我有一个应用程序,需要在给定的服务帐户下 运行 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 实例。