【发布时间】: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