簡體   English   中英

Windows服務SQL Server錯誤 - “用戶登錄失敗”

[英]Windows Service SQL Server error - “Login failed for user”

我有一個用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):用戶'myuser'登錄失敗。

錯誤號碼:18456,州:1,班級:14

所以我檢查SQL Server日志以找到有關錯誤的更多信息並找到它

用戶myuser登錄失敗原因:密碼與提供的登錄名不匹配“

來源:登錄消息:錯誤:18456,嚴重性:14,狀態:8。

問題是我知道這些憑據是正確的。 我檢查過並仔細檢查過。

我能夠通過在源計算機上打開SQL Server Management Studio,並使用完全相同的服務器,用戶ID和密碼以及“SQL Server身份驗證”身份驗證模式連接到遠程SQL Server來證明憑據有效。

事實上,我有2個不同的用戶,我可以使用SSMS連接,但使用Windows服務失敗。 如果我能夠在SSMS中直接使用混合模式auth連接到遠程計算機。 為什么不在我的Windows服務中?

我在這里不知所措,任何人都可以提出問題所在嗎?

編輯:我甚至可以使用以下命令成功連接到遠程計算機:

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

指定初始數據庫的正確語法是:

服務器= 10.42.42.10; 初始目錄 = mydb;用戶ID = myuser;密碼= mypass

我最好的猜測是它忽略了你的字符串中的“數據庫”,並且可能嘗試連接到登錄的默認數據庫設置(可能是主人?)並且至少沒有公共角色。 雖然我發現“數據庫”是一個有效的替代方案。

密碼中有一個字符可能會絆倒它。 分號和等號將特別成問題。 嘗試在您的用戶ID和密碼周圍加上雙引號,如:

Server = 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

我使用這個網站找到了正確的模式

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

您是否嘗試連接到實例化的SQL Server? 服務器= 10.42.42.10 / SomeInstance

我建議加分號; ,在連接字符串中的密碼之后。 也許它被奇怪地解析了。

我也想知道:你的實際密碼是否是分號?

也許您正在嘗試使用Windows帳戶,但也有一個以相同方式命名的SQL帳戶。 如果是這樣,請確保在Windows帳戶前添加域名前綴。 例如,您可能擁有帶有P@sswordMYDOMAIN\\sa Windows帳戶,而SQL服務器帳戶是sa ,其密碼是P@ssw0rd

要確定存在哪些帳戶,請以管理員身份登錄SQL Server,並檢查服務器本身和感興趣的數據庫的“安全”節點下列出的帳戶。

我有同樣的問題,這是我的解決方案:

我發現我使用SQL服務器的命名實例,改變了Server從我的連接字符串的Server=localhostServer=localhost\\SQLEXPRESS和一切工作只是對我很好! :)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM