Windows服务出现SQL "login failed for user [username]"错误,但是在SSMS中登录正常

7
我正在编写一个Windows服务,需要连接到SQL服务器以检索一些信息,但是服务器不允许我连接:login failed for user [domain/username]。奇怪的是,从SSMS内部一切都能正常工作。我可以登录,查询数据库,一切都完美无缺。只有通过Windows服务才会出现此错误。
这是我使用的连接字符串:

Data Source=sqlserveraddresshere;Initial Catalog=databasenamehere;User ID=domain\username;Password=password`

我怀疑这与Integrated Security有关。它获取了我的计算机名称而不是我的用户名。我99%确定这是因为我们的杀毒软件和监控软件在我的Windows会话上模拟管理员用户来执行其任务。无论如何,只需输入正确的用户名和密码即应该有效。
我查看了一些其他涉及相同错误的问题,但它们都与本问题无关。从我所知道的情况来看,每个人都可以通过SSMS进入他们的SQL服务器,并且通过代码访问它。这是我找到的最相似的问题,但并没有帮助多少:Can't connect to SQL Server: "Login failed for user "."
在你询问之前,我已经检查过是否有错别字。实际上,我甚至尝试使用其他用户帐户,以确保我的权限没有什么奇怪的问题。如果您需要我发布任何代码,请告诉我。谢谢您的帮助!
更新:
我更改了服务的帐户,并切换回Integrated Security = true。似乎发生了一些变化,因为现在我收到了一个稍微不同的错误:

Cannot open database "mydatabase" requested by the login. The login failed. >Login failed for user 'MYDOMAIN\myUserName'.


4
请在管理工具中查看SQL事件日志(展开服务器,展开管理,展开SQL Server日志),并给我们提供登录失败的完整错误信息。它应该包括错误编号、严重性和状态。 - Kevin Aenmey
检查SQL事件日志帮助我学到了新东西:我正在尝试访问的服务器仅配置为Windows身份验证。但是,当我使用WA时,登录仍然失败,因为它仍然发送我的机器名称而不是帐户名称。现在我将进行更多研究以尝试解决该问题。以下是完整的错误信息(已匿名化凭据):failed for user 'DOMAIN\MACHINE_NAME$'。原因:基础结构错误导致基于令牌的服务器访问验证失败。请检查之前的错误。[CLIENT: 10.1.0.188] - VVander
错误信息中是否包含严重性和状态值高于您发布的消息? - Kevin Aenmey
3个回答

9

终于成功了!

首先,我按照Kevin在原问题下的建议查看了SQL Server日志(在管理工具中展开服务器,展开管理,展开SQL Server日志)。通过这种方式,我找到了更详细的错误报告,帮助我诊断了问题。

结果发现,服务器只允许使用Windows身份验证,所以我的手动输入用户名和密码的尝试失败了。

但是,我仍然有一个问题,即服务器将我的机器名称作为用户名称而不是我的用户名。根据Duncan的建议,我将服务运行的用户更改为我的用户名(在服务中右键点击->属性->登录选项卡),问题得以解决。

感谢大家的帮助,非常感激。


补充VVander的回答,在“登录”选项卡上,选择“此帐户”单选按钮并单击“浏览”。输入“您的名称”,系统将执行AD搜索以验证用户名。然后输入您的系统密码并应用。您应该会收到类似于“系统接受此服务的用户名/密码”的消息。就这样。它会起作用。 - bluwater2001

2
您需要检查服务正在运行的用户帐户。听起来它正在以“Local System”身份运行,这将尝试通过机器名称作为登录名传递。 尝试将其更改为最低特权域用户(或用于测试,您可以使用自己的帐户),然后授予该用户对SQL Server的登录权限。那应该就行了。

好的,我已经更改了服务的帐户,并切换回IntegratedSecurity = true。似乎有些东西已经改变了,因为现在我收到了一个稍微不同的错误:无法打开请求的登录名为“mydatabase”的数据库。登录失败。用户'MYDOMAIN\myUserName'的登录失败。我也会将这个问题添加到原始问题中。 - VVander
你可能需要为登录创建一个数据库用户。在 SSMS 的对象资源管理器中右键单击登录,然后在左侧窗格中检查用户映射。或者,您可以针对数据库运行 CREATE USER [blah] FOR LOGIN [login] 命令。 - Duncan Howe
最后发现我输入了错误的数据库名称,这就是为什么你的建议一开始没有起作用并给了我那个错误。这可能会帮助其他人。 - VVander

0

您正在传递给 SQL Server 以登录的用户名是什么?根据连接字符串,看起来您正在使用字面值“domain\username”作为用户。密码应更新为正确的密码,而不是字面值“password”。

当我开始使用 C# 编写基于数据库的应用程序时,我经常遇到这个错误。我的应用程序是混合模式环境,我传递 SQL Server 用户名和密码,而不是我用来登录计算机的用户名和密码。这是我喜欢执行的安全策略,以便数据库控制谁可以登录以及他们获得的权限。这是否适合您要做的事情?如果是,我可能能够提供更好的帮助,以及更具体的代码。


抱歉如果我在原始问题中没有表达清楚。在发布之前,我更改了连接字符串中的值。在我的程序中,我实际上正在使用应该具有访问服务器权限的用户名和密码。 - VVander
今晚回家后,我会发布我在应用程序中使用的连接字符串。它设置为使用SQL Server身份验证,但我认为它应该作为任何类型身份验证的起始模型。 - EastOfJupiter
谢谢,非常感谢您的帮助。虽然我一直在使用connectionstring.com的示例以及在.NET中使用MS的ConnectionStringBuilder类,但如果您的字符串不同,那么这可能会有所帮助。 - VVander
根据我使用connectionstring.com的经验(这是一个非常好的资源),它们非常通用。我应该在中央时间6:00-6:30左右发布一些内容。顺便问一下,您计划使用Windows身份验证还是SQL Server身份验证? - EastOfJupiter
我现在使用Windows身份验证,因为我发现服务器只接受这种方式。我最终弄清楚了一切,所以我不需要你的帮助了,但还是谢谢你。如果你好奇的话,我已经把解决方案发布为答案了。 - VVander

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接