我有一个托管在Windows服务中的WCF服务。此Windows服务设置为以LocalSystem身份运行。此WCF尝试登录到远程SQL Server 2008 Express数据库,但登录失败。
异常错误说明:
无法打开登录请求的数据库\“{database name} \”。登录失败。用户'{domain name} \ {machine name} $'登录失败。
我已经用标签替换了数据库,域名和机器名,但你明白了。
知道我如何解决这个问题吗?我想将此用户添加到SQL Server登录,但我在其属性中找不到此用户。
答案 0 :(得分:3)
我建议在sql server上创建一个新的用户帐户,然后从你的Windows服务模拟该帐户。
WindowsIdentity类有许多构造函数,您可以使用它们来创建您希望SQL服务器允许登录的用户的WindowsIdentity(http://msdn.microsoft.com/en-us/library/e599ywa6.aspx)。
您是否尝试使用WindowsIdentity.Impersonate方法将线程用户更改为SQL Server识别为有效用户的用户?
我相信您会将代码模拟为由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
答案 1 :(得分:1)
消息
'The login failed. Login failed for user '{domain name}{machine name}$'
表示您的服务正在尝试使用运行它的计算机的NETWORK SERVICE帐户连接到数据库。
如果您在域上创建服务帐户,请将服务更改为“以该方式运行”此用户,并授予服务帐户访问您的数据库的权限,这可以解决您的问题。
答案 2 :(得分:0)
为什么不为此程序创建自定义SQL Server登录?这样,运行服务的人无关紧要,您将获得一致的结果。