【问题标题】:C# connect WinForm App running locally via Remote Desktop (or other) to a DatabaseC# 通过远程桌面(或其他)将本地运行的 WinForm App 连接到数据库
【发布时间】:2019-10-10 07:57:56
【问题描述】:

编辑

RDP 只是我当前执行此操作的方式,如果有其他方式可以连接到不同环境中的数据库,我将执行此操作。理想情况下,我希望它像可执行文件在 RDP 环境中一样连接到数据库,并且没有显示通过其他环境连接到数据库的指示。

编辑 2

我也尝试过添加第二个连接字符串并打开它,然后立即使用我当前的连接字符串,但这不起作用。


我有一个连接到数据库的 C# Win Forms 应用程序,它工作正常,但我需要将 RDP 放入正确的环境并从那里运行可执行文件。

是否可以在应用程序内部进行 RDP 连接,然后连接到数据库,而不必在 RDP 中包含可执行文件。

我尝试使用我找到的here 的 MSTSCLib 库建立一个连接字符串,但无论如何这在代码级别不起作用。

代码:

    private void rdpConnect_Click(object sender, EventArgs e)
    {
        MSTerminalServiceControl1.Server = rdpServer.Text;
        MSTerminalServiceControl1.UserName = rdpUserName.Text;
        IMsTscNonScriptable secured = (IMsTscNonScriptable)MSTerminalServiceControl1.GetOcx();
        secured.ClearTextPassword = rdpPassword.Text;
        MSTerminalServiceControl1.Connect();
    }

    private void rdpDisconnect_Click(object sender, EventArgs e)
    {
        MSTerminalServiceControl1.Disconnect();
    }

当前路径:

所需路径:

【问题讨论】:

  • 这听起来像是一个 XY 问题。为什么需要 RDP 服务器上的可执行文件?
  • 因为这是数据库所在的环境,我希望在本地拥有可执行文件,然后通过 RDP “隧道”然后到数据库。
  • 为什么不直接使用公共 IP 地址连接到数据库并将服务器锁定到 VPN? RDP 协议不是为您想要的用途而设计的。
  • 您可以连接到您可以访问的任何数据库。这是一个网络问题。您的数据库只需要在您运行应用程序的任何地方都可用。 RDP 不是数据库连接协议,因此尝试将其转换为一个是没有意义的,您想要的是从 EXE 到数据库的箭头(而不是通过 RDP)。听起来您真正需要的是 VPN
  • 如果有一种方法可以在不使用 RDP 的情况下连接到另一个环境中的数据库,我会很乐意这样做。 RDP 正是我目前以非编程方式执行的方式

标签: c# winforms networking database-connection rdp


【解决方案1】:

我确定,那行不通,因为...

RDP(远程桌面协议)是一种将您从远程计算机连接到终端服务器上的会话的协议。这就是目的。在该会话中,您可以启动程序、打开文档并完成您的工作。就像你坐在那台机器前一样。好处是,这可以由多个用户完成,仅取决于用户许可证的数量和硬件能力。

有一些特殊情况,例如您可以在启动时自动启动程序。然后,您的会话仅限于该程序,并将在程序结束时结束。但这只是一种限制。你仍然会为此开始一个会话。

此外,每个 Windows 版本中都有一个小型版本的终端服务器,而不仅仅是服务器。这可以以相同的方式用于远程连接。

所以,很遗憾,RDP 无法连接到数据库。绝不。你需要一个程序。您可以在内部构建一个带有 RDP-Client 的本地程序。这可以连接到远程机器上的会话并启动另一个连接到数据库的程序。但是默认情况下,您将无法在 to 程序之间进行通信,因此没有任何好处。

我认为,就像其他人说的那样,最好是直接连接到数据库。

【讨论】:

    【解决方案2】:

    您似乎没有对 ActiveX 控件的引用。

    在您的工具箱中选择 COM 组件:Microsoft RDP Control - 版本 x

    这里的版本很重要,它应该与安装的 RDP 版本匹配,一旦你在工具箱中添加了这个,就把它放到你的表单上,如果版本不匹配,它会抛出错误。我会说从最新版本的控件开始,直到你能够成功地将它添加到你的表单中。代码中的MSTerminalServiceControl1 实际上是这个控件的名称,因此您应该将它放在表单上。

    【讨论】:

    • 它实际上应该安装在您的系统中,DLL 是 mstscax.dll,它应该位于 Windows\System32,尝试通过 COM 组件选项卡上的浏览选项引用它。
    【解决方案3】:

    你需要的是将多个sql用户连接到一个数据库,而不是使用RDP。

    您应该为每个用户编写一个特殊的连接字符串,如下所示:

    using System.Data.SqlClient;
    
    SqlConnection conn = new SqlConnection();
    conn.ConnectionString =
        "Data Source=ServerName;" +
        "Initial Catalog=DataBaseName;" +
        "User id=" + UserName + ";"
        "Password=" + Password + ";";
     conn.Open();
    

    把它放在一个接受用户名和密码的类中。

    完整示例:

    class myConnection
    {
        public static SqlConnection GetConnection(string UserName, string Password)
        {
            string str = "Data Source=ServerName;Initial Catalog=DataBaseName;User id=" +             
            UserName + ";Password=" + Password + ";";
            SQlConnection con = new SqlConnection(str);
            con.Open();
            return con;
        }
    }
    

    然后将每个用户直接连接到 DB。

    【讨论】:

      【解决方案4】:

      如果您有可执行文件的 app.config 文件,请更新连接字符串参数以指向 rdp 服务器的 ip。 在您执行此操作之前,请在防火墙上启用数据库端口并启用与数据库的远程连接。 对于 mssql 服务器。 运行 sql server 配置管理器。 选择数据库实例。 在网络配置下启用 tcp/ip。 在 io 地址选项卡下。 将 tcp 端口设置为 1443。 重启实例。

      数据源=IP,1443\dbservername; 我希望这可以作为一个起点。

      【讨论】:

        【解决方案5】:

        我看到一位网络管理员将我们的普通 winform 应用程序配置为通过 the Internet 使用 Citrix 远程打开。 我们对可执行文件没有更改。 它将在Citrix Virtual Server 中启动应用程序。

        问题在于它是一款付费软件。

        【讨论】:

          猜你喜欢
          • 2015-06-14
          • 1970-01-01
          • 2012-01-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-10-10
          相关资源
          最近更新 更多