[英]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 <
> with >
& with &
' with '
" with "
如果您在瀏覽器中打開您的應用配置文件,它應該顯示它是否正常。
我建議將整個連接字符串的內容添加到服務的輸出日志中。 這樣你就可以看到它的樣子。 在您嘗試打開連接之前,請使用以下命令:
string connStr = ConfigurationSettings.AppSettings("myConnectionString");
然后將connStr值輸出到日志。 它將向您顯示至少使用的值。
您可以在密碼中使用一些特殊字符,這是為XML保留的。 如果是這樣,您將需要使用轉義字符作為替代。
例如,如果您的密碼是PASS<WORD
,配置文件中的有效條目將是: PASS<WORD
我使用這個網站找到了正確的模式
你擁有的是有效的:Server = myServerAddress; Database = myDataBase; User Id = myUsername; 密碼= MYPASSWORD;
您是否嘗試連接到實例化的SQL Server? 服務器= 10.42.42.10 / SomeInstance
我建議加分號;
,在連接字符串中的密碼之后。 也許它被奇怪地解析了。
我也想知道:你的實際密碼是否是分號?
也許您正在嘗試使用Windows帳戶,但也有一個以相同方式命名的SQL帳戶。 如果是這樣,請確保在Windows帳戶前添加域名前綴。 例如,您可能擁有帶有P@ssword
的MYDOMAIN\\sa
Windows帳戶,而SQL服務器帳戶是sa
,其密碼是P@ssw0rd
。
要確定存在哪些帳戶,請以管理員身份登錄SQL Server,並檢查服務器本身和感興趣的數據庫的“安全”節點下列出的帳戶。
我有同樣的問題,這是我的解決方案:
我發現我使用SQL服務器的命名實例,改變了Server
從我的連接字符串的Server=localhost
到Server=localhost\\SQLEXPRESS
和一切工作只是對我很好! :)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.