Windows服务SQL Server错误 - "用户登录失败"

时间:2015-10-26 22:37:48

标签: c# .net sql-server service windows-services

我使用C#编写的Windows服务在Windows Server 2012 R2计算机上运行,​​该计算机也连接到Windows Server 2012 R2服务器上的远程SQL Server 2012实例。

SQL连接字符串在App Config中定义如下:

<connectionStrings>
    <add name="destinationConnectionString" providerName="System.Data.SqlClient"
    connectionString="Server=10.42.42.10;Database=mydb;User ID=myuser;Password=mypass" />
</connectionStrings>

运行服务时,输出错误日志显示:

  

System.Data.SqlClient.SqlException(0x80131904):用户登录失败   &#39;为myuser&#39;

     

错误号码:18456,州:1,等级:14

因此,我检查SQL Server日志以找到有关错误的更多信息并找到此

  

用户myuser登录失败原因:密码与   登录提供&#34;

     

来源:登录消息:错误:18456,严重性:14,状态:8。

问题是我知道这些凭据是正确的。我检查过并仔细检查过。

我能够通过在源计算机上打开SQL Server Management Studio,并使用完全相同的服务器,用户ID和密码连接到远程SQL Server来证明凭据有效,并使用&#34; SQL Server身份验证&#34;验证模式。

事实上,我有2个不同的用户,我可以使用SSMS连接,但使用Windows服务失败。如果我能够在SSMS中直接使用混合模式auth连接到远程计算机。为什么不在我的Windows服务中?

我在这里不知所措,有人可以提出问题的原因吗?

编辑:我甚至可以使用以下命令成功连接到远程计算机:

sqlcmd -S 10.42.42.10 -U myuser -P mypass -d mydb

6 个答案:

答案 0 :(得分:3)

指定初始数据库的正确语法是:

服务器= 10.42.42.10; 初始目录 = mydb;用户ID = myuser;密码= mypass

我最好的猜测是它忽略了你的字符串中的“数据库”,并且可能试图连接到登录的默认数据库设置(可能是主人?)并且至少没有公共角色。虽然我发现“数据库”是一个有效的替代方案。

密码中有一个字符可能会绊倒它。分号和等号将特别成问题。尝试在用户名和密码周围加上双引号,如:

服务器= 10.42.42.10;初始目录= mydb;用户ID =“myuser”;密码=“mypass”

如果您的密码中有引号,则每次出现时都必须将其替换为两个。

一旦建立了连接字符串,就必须确保它将在XML中正确解析。这意味着转义控制字符和其他特殊字符,例如:

< with &lt;
> with &gt;
& with &amp;
' with &apos;
" with &quot;

如果您在浏览器中打开您的应用配置文件,它应该显示它是否正常。

我建议将整个连接字符串的内容添加到服务的输出日志中。这样你就可以看到它的样子。在您尝试打开连接之前,请使用以下命令:

string connStr = ConfigurationSettings.AppSettings("myConnectionString");

然后将connStr值输出到日志。它将向您显示至少使用的值。

答案 1 :(得分:1)

您可以在密码中使用一些特殊字符,这是为XML保留的。如果是这样,您将需要使用转义字符作为替代。

例如,如果您的密码为PASS<WORD,则配置文件中的有效条目为:PASS&lt;WORD

答案 2 :(得分:1)

我已使用此site来查找正确的模式

你拥有的是有效的: Server = myServerAddress; Database = myDataBase; User Id = myUsername; 密码= MYPASSWORD;

您是否尝试连接到实例化的SQL Server? 服务器= 10.42.42.10 / SomeInstance

答案 3 :(得分:1)

我建议在连接字符串中输入密码后面加分号;。也许它被奇怪地解析了。

我也想知道:你的实际密码是否是分号?

答案 4 :(得分:1)

也许您正在尝试使用Windows帐户,但也有一个以相同方式命名的SQL帐户。如果是这样,请确保在Windows帐户前添加域名前缀。例如。您可能拥有MYDOMAIN\sa的Windows帐户P@ssword,而SQL服务器帐户为sa且密码为P@ssw0rd

要确定存在哪些帐户,请以管理员身份登录SQL服务器,并检查&#34;安全&#34;下列出的帐户。服务器本身和感兴趣的数据库的节点。

答案 5 :(得分:0)

我遇到了同样的问题,这是我的解决方案:

我发现我正在使用SQL服务器的命名实例并将我的连接字符串的ServerServer=localhost更改为Server=localhost\SQLEXPRESS,一切正常对我有用! :)