Windows Service SQL Server 错误 - "Login failed for user"



我有一个用c#编写的Windows Service在Windows Server 2012 R2机器上运行,该机器连接到Windows Server 2012 R2服务器上的远程SQL Server 2012实例。

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

<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):用户登录失败"myuser"。

错误编号:18456,状态:1,类别:14

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

用户myuser登录失败原因:密码不匹配提供登录"

来源:Logon Message: Error: 18456, Severity: 14, State: 8.

问题是我知道这些凭证是正确的。我反复检查过了。

我能够通过在源机器上打开SQL Server Management Studio来证明凭证工作,并使用完全相同的服务器,用户ID和密码与"SQL Server身份验证"身份验证模式连接到远程SQL Server。

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

我不明白,有谁能告诉我是什么问题吗?

编辑:我甚至可以使用以下命令成功连接到远程机器:
sqlcmd -S 10.42.42.10 -U myuser -P mypass -d mydb

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

Server=10.42.42.10;初始目录=mydb;用户ID=myuser;密码=mypass

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

有可能你的密码中有一个字符出错了。分号和等号尤其有问题。试着用双引号括住你的用户名和密码,比如:

服务器=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值输出到日志。它将显示至少使用了哪些值

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

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

我用这个网站找到了正确的模式

你有什么是有效的:服务器= myServerAddress;数据库= myDataBase;;上的用户名都用户Id = dangillmor密码=我的密码;

您正在尝试连接到一个实例sql server吗? Server = 10.42.42.10/SomeInstance

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

我还想知道:在你的实际密码中是否有一个分号?

也许你正在尝试一个Windows帐户,但也有一个SQL帐户以相同的方式命名。如果是这样,请确保在Windows帐户前加上域名。例如,您可能有P@sswordMYDOMAINsa Windows帐户,而SQL服务器帐户是sa,其密码是P@ssw0rd

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

我有同样的问题,下面是我的解决方案:

我发现我正在使用SQL服务器的命名实例,并将我的连接字符串的ServerServer=localhost更改为Server=localhostSQLEXPRESS,一切对我来说都很好!:)

最新更新