【问题标题】:Accessing SQL Server over a network from a Windows Service从 Windows 服务通过网络访问 SQL Server
【发布时间】:2010-07-01 14:13:42
【问题描述】:

我创建了一个将连接到 SQL Server 以运行存储过程的类。在 Windows 窗体解决方案中使用此类时,可以成功访问数据库。将类放入 Windows 服务时,出现以下错误:

与网络相关或特定于实例的 建立时发生错误 连接到 SQL Server。服务器 未找到或无法访问。 验证实例名称是否为 正确,并且 SQL Server 是 配置为允许远程 连接。 (提供者:SQL 网络 接口,错误:26 - 错误定位 服务器/实例指定)

我怀疑问题与权限有关。

这是相关代码部分:

SqlConnection conn = new SqlConnection(j.ConnectionString);
SqlCommand cmd = new SqlCommand(j.Query, conn);
cmd.CommandType = CommandType.Text;
SqlDataAdapter da = new SqlDataAdapter(cmd);

DataSet ds = new DataSet("Table1");

da.Fill(ds, "Table1");    // <----- error occurs here (Windows Service only)

SQL Server 版本是

Microsoft SQL Server 2008 (SP1) - 10.0.2766.0 (X64)   
Enterprise Edition (64-bit) on Windows NT 5.2 <X64> 
(Build 3790: Service Pack 2)

Visual Studio 版本是Microsoft Visual C# 2008 框架版本为3.5 SP1。

【问题讨论】:

  • 我会查看运行服务的用户。是本地用户吗?
  • 你用的是什么连接字符串,你用的是集成认证还是sql server认证?
  • 我尝试过使用“LocalService”、“NetworkService”、“LocalSystem”和“User”。连接字符串是“Persist Security Info=False;User ID=call_tracker;Password=pCa11Tracker;Initial Catalog=CallData;Data Source=SQLData\CORP”,这与用于有效的 Windows 窗体应用程序的连接字符串完全相同(从配置文件中读取字符串)。
  • 你经常在公共论坛上泄露用户名和密码吗?
  • 它们不是真实的(为了保护无辜而改变)。

标签: c# sql-server windows-services


【解决方案1】:

当使用默认的“LocalService”登录时,Windows 服务被限制使用网络资源。因此,您需要让服务在允许访问网络的用户帐户下运行。以下是可能性:

1.) 如果您使用“NetworkService”连接,则不应在连接到 SQL 服务时使用 Windows 的集成身份验证,但您可以使用带有用户名和密码的 SQL 身份验证。 (从技术上讲,如果您向客户端计算机的域帐户(例如 CLIENT$)授予对数据库的权限,您可能能够使用集成身份验证...但不建议这样做。)

2.) 如果您将服务设置为在您选择的真实用户帐户下运行,则 SQL 连接可以使用 Windows 集成身份验证,但您必须授予该帐户访问数据库的权限。

【讨论】:

  • Windows 窗体使用什么类型的连接来连接 SQL Server? Windows 身份验证?但是 Windows 窗体应用程序连接成功,这就是我需要服务连接的方式。
  • 这取决于您将其配置为做什么。如果您使用了用户名和密码,则可能是 SQL 身份验证;如果你没有,它可能是 Windows 集成的身份验证(它使用来自登录和运行应用程序的人的凭据)。
【解决方案2】:

该特定错误仅表示客户端无法连接到服务器。这是在它甚至没有权限之前。检查以确保应用服务器可以连接。可以尝试的一些事情:

1) 通过端口 1433 远程登录到服务器 IP(假设默认端口) 如果这不起作用,是否有路由器或防火墙阻止访问服务器? 2) 转到应用服务器上的 ODBC(数据源)并设置 DNS 条目,最后点击“测试”按钮。这将测试客户端驱动程序是否可以与 SQL Server 通信。

第 1 步很可能会失败。如果您将服务器名称更改为“BigBird”,您会得到同样的错误。这是一个通用错误,说“您告诉我连接到此服务器,但没有服务器响应连接请求”。这发生在客户端和服务器之间的“握手”和权限检查之前。

HTH, 埃里克

【讨论】:

  • 我同意错误消息的含义,但是当在 Windows 窗体应用程序中使用完全相同的代码时,我可以连接到 SQL Server,将数据拉回我的系统并将该数据写入一个文本文件。奇怪的是,Windows 窗体应用程序可以工作,而 Windows 服务应用程序却不能。
  • 我只是想澄清这与权限无关。这不是您使用的用户名的问题。客户端和服务器根本无法相互通信。
  • 正确。谢谢你的cmets。当我说“权限相关”时,我的意思是“连接相关”。
猜你喜欢
  • 1970-01-01
  • 2015-03-21
  • 1970-01-01
  • 2016-04-01
  • 2014-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多