【发布时间】:2009-03-26 20:42:11
【问题描述】:
我正在尝试追踪我的应用无法连接到数据库服务器的可能原因。
我有一个 Windows 服务,它在启动时连接到数据库。该服务在具有可靠有线网络连接的机器上运行。它与启动自动一起安装,因此通常它在 Windows 启动时启动,并且在几乎所有情况下都可以正常工作。
但是,对于一组 XP 机器(我无法控制),当服务在 windows 启动时启动时,数据库连接会失败。引发标准异常:
System.Data.SqlClient.SqlException:一个 建立时发生错误 与服务器的连接。什么时候 连接到 SQL Server 2005,这 失败可能是由于以下事实引起的 默认设置下 SQL Server 不允许远程连接。 (提供者:SQL 网络接口, 错误:26 - 错误定位 服务器/实例指定)
在这些机器上,如果用户登录并手动启动服务,它会正确连接到数据库,这很奇怪。所以我猜windows启动时的问题是:
- 服务在网络连接之前启动
- 服务在机器连接到 DNS 以解析服务器名称之前启动(如果这是解析 db 服务器名称的方式)
- 机器上有一个策略/防火墙/等最初阻止传出连接
- 别的...
当用户手动启动服务时不会出现问题,因此一定是发生了一些事情来解决问题。我猜这可能是一个在启动时运行但在我的服务启动时尚未完成的进程,或者是用户已登录的事实 - 可能是他们的登录脚本中的某些内容。
我没有直接访问机器的权限,因此需要想出问题可能是什么以及确定问题是否正确的方法。我不能重复部署诊断程序,所以第一次需要彻底。
所以第一个问题是:是否有人知道可能导致这种情况的桌面策略、网络策略或软件?第二个问题:我可以做些什么来准确诊断正在发生的事情?
我正在考虑创建一个新的诊断服务,该服务也将安装为自动启动,并将执行各种操作以查看发生了什么,并记录此信息。例如:
- 运行“ipconfig /all”(查看是否有网络连接)
- 通过IP地址ping数据库服务器(看是否能找到服务器)
- 按名称 ping 数据库服务器
- 检查包含服务器名称的 HKLM 注册表项(以防以后更新 HKLM 注册表)
- 创建与数据库的 sql 连接(以了解何时开始工作)
- 每隔几秒重复一次这些步骤。
我将安装此服务,重新启动机器,然后在一段时间后让用户登录。诊断程序应该会显示一些有用的信息...但是有人有更好的想法或其他建议吗?
我还尝试将服务更改为以具有适当权限的用户帐户运行,但这并没有解决问题。请注意,本地系统帐户确实有足够的权限来连接到数据库服务器,因为手动启动时服务工作正常。所以和this question不一样。
更新:麻烦的机器正在运行 Win XP。
更新:this article 很好地讨论了错误代码 26
【问题讨论】:
标签: .net networking windows-services database-connection