2011-08-15 81 views
3

我有一個WCF服務託管在Windows服務中。此Windows服務設置爲以LocalSystem身份運行。此WCF嘗試登錄到遠程SQL Server 2008 Express數據庫,但登錄失敗。WCF服務無法登錄到遠程數據庫

異常錯誤狀態:

無法打開數據庫\ 「{數據庫名稱} \」 由登錄請求。登錄失敗。用戶'{域名} \ {機器名稱} $'登錄失敗。

我用標籤取代了數據庫,域名和機器名稱,但你明白了。

任何想法如何解決這個問題?我想將此用戶添加到SQL Server登錄名,但我無法在其屬性中找到此用戶。

+0

向我們顯示您的連接字符串! –

回答

3

我會建議在sql服務器上創建一個新的用戶帳戶,然後從您的Windows服務模擬該帳戶。

WindowsIdentity類有許多構造函數,您可以使用它們來創建希望SQL Server允許登錄的用戶的WindowsIdentity(http://msdn.microsoft.com/zh-cn/library/e599ywa6.aspx) 。

您是否試圖通過使用WindowsIdentity.Impersonate方法將線程的用戶更改爲SQL服務器可識別的有效用戶?

我相信你會把代碼模仿用戶在由windows服務託管的服務類中,而不是在訪問服務的客戶端代碼中。

有關詳細信息和示例,請參見:http://msdn.microsoft.com/en-us/library/w070t6ka.aspx

存儲在加密的應用程序配置文件中的登錄信息。在服務項目下創建一個app.config文件。在該文件中爲敏感信息添加一個部分(最初以純文本形式),並且一旦保存ecnrypt文件。

詳情點擊這裏:http://msdn.microsoft.com/en-us/library/89211k9b(v=VS.100).aspx 和步行經過這裏:http://weblogs.asp.net/jgalloway/archive/2008/04/13/encrypting-passwords-in-a-net-app-config-file.aspx

+0

這意味着需要在某處存儲用戶名和密碼。什麼是最好的解決方案? – Jonnster

+0

修正答案,包括如何存儲憑據 –

+0

非常感謝,這是一個很好的解決方案,現在已經實施。感謝所有貢獻過的人。 – Jonnster

0

爲什麼不爲該程序創建自定義SQL Server登錄?這樣,你運行服務的人就沒有關係,你會得到一致的結果。

+0

從我可以告訴SQL Server 2008總是需要Windows身份驗證,即使需要進一步的SQL登錄。 – Jonnster

+0

這是不對的。從SQL Server Management Studio中,右鍵單擊服務器,選擇屬性,單擊「安全」選項卡,然後在「服務器身份驗證」下選擇「SQL Server和Windows身份驗證模式」 – AgileJon

1

消息

'The login failed. Login failed for user '{domain name}{machine name}$'

意味着你的服務正在試圖使用的網絡服務帳戶連接到數據庫它正在運行的機器。

如果您在您的域上創建服務帳戶,請將該服務更改爲以該用戶身份運行並授予服務帳戶對數據庫的訪問權限,這應該可以解決您的問題。