【问题标题】:Hosting RemoteAPP session within Winform在 Winform 中托管 RemoteAPP 会话
【发布时间】:2013-05-30 13:39:07
【问题描述】:

继续回过头来,无法弄清楚...我正在创建一个工作应用程序,它基本上将我们所有的工具编译成一个更易于使用的 GUI。我们使用的工具之一是我们从第 3 方使用的工具,并通过 RDWeb 作为远程应用程序托管。现在我也只有常规的远程桌面访问权限,我可以通过我的 Winform 使用 MSTSC 和 this process 访问桌面,效果很好。我很好奇是否可以在 MSTSC 控件中只加载 RemoteAPP 而不是整个桌面,这样我的用户就不会进入完整的桌面。或者,如果有任何其他方式仅在 Winforms 中托管 RemoteAPP。

我已经查看了 ITSRemoteProgram 上的 MSDN 文档,但是当我尝试以下操作时,它只会引发异常。调试器在 rdp.RemoteProgram.RemoteProgramMode = true; 处停止并给出 HRESULT E_FAIL 异常。

我也尝试在 OnConnected 事件触发后使用 remoteprogram,得到相同的结果。

try
{
    rdp.Server = "FFWIN2008R2DC.fflab123.net";
    rdp.Domain = "fflab123";
    rdp.UserName = "administrator";
    IMsTscNonScriptable secured = (IMsTscNonScriptable)rdp.GetOcx();
    secured.ClearTextPassword = "password123";
    rdp.OnConnected += rdp_OnConnected;
    rdp.RemoteProgram.RemoteProgramMode = true;
    rdp.RemoteProgram2.RemoteApplicationName = "Calculator";
    rdp.RemoteProgram2.RemoteApplicationProgram = @"C:\Windows\system32\calc.exe";

    rdp.Connect();
}
catch (Exception Ex)
{
    MessageBox.Show("Error Connecting", "Error connecting to remote desktop " + " Error:  " + Ex.Message, MessageBoxButtons.OK, MessageBoxIcon.Error);
}

也许我走错了路,或者甚至不可能。我只是想朝着正确的方向轻推,我不需要任何人为我写这篇文章。

【问题讨论】:

  • 没人有这方面的信息吗?我想这解释了为什么我也无法弄清楚,哈哈。

标签: c# winforms rdp remoteapp


【解决方案1】:

IMsRdpClient.RemoteProgram.RemoteProgramMode 仅在从 MsRdpClientNotSafeForScripting 类 ID 初始化的客户端上有效。请参阅 this MSDN page 以获取适当的 CLSID,或使用 AxMsRdpClientNotSafeForScripting 互操作类。

var rc = new AxMsRdpClient7NotSafeForScripting();
rc.Dock = DockStyle.Fill;
this.Controls.Add(rc);
rc.RemoteProgram.RemoteProgramMode = true;
// ServerStartProgram can only be called on an open session; wait for connected until calling
rc.OnConnected += (_1, _2) => { rc.RemoteProgram.ServerStartProgram(@"%SYSTEMROOT%\notepad.exe", "", "%SYSTEMROOT%", true, "", false); };
rc.Server = "server.name";
rc.UserName = "domain\\user";
// needed to allow password
rc.AdvancedSettings7.PublicMode = false;
rc.AdvancedSettings7.ClearTextPassword = "password";
// needed to allow dimensions other than the size of the control
rc.DesktopWidth = SystemInformation.VirtualScreen.Width;
rc.DesktopHeight = SystemInformation.VirtualScreen.Height;
rc.AdvancedSettings7.SmartSizing = true;

rc.Connect();

【讨论】:

  • 感谢您的回复!所以我部分成功地实现了这一点。我认为这让我向前迈进了一步,但并不完全在那里。现在,当我尝试连接它时,至少连接 RemoteProgramMode true 并且我可以看到它登录,然后因为它将加载记事本,例如它只是坐在蓝屏上并且从未实际加载程序。我没有获得桌面,也没有像要加载应用程序一样的蓝屏,但仍然失败。有什么想法吗?
  • @Nabbic,如果您不启动应用程序,或者如果您尝试启动不允许或不存在的应用程序,您最终将只看到蓝色桌面。确保您正在打开程序。您可以使用任务管理器或目标服务器上运行的其他程序进行验证。此外,请确保您设置了 DesktopWidthDesktopHeight 成员,否则您将受限于放置在表单上的控件的大小。 5 分钟超时是在远程服务器上没有打开应用程序的情况下。
  • 我有同样的要求来实现类似的东西。答案几乎对我有用。唯一的区别是远程应用程序在 WinForm 之外打开。 WinForm 打开空白,但另一个窗口打开远程应用程序。我希望它在我拥有 ActiveX 组件的 Winform 中打开。上面的代码中缺少什么会导致这种情况发生?
猜你喜欢
  • 2011-11-07
  • 1970-01-01
  • 2011-12-05
  • 2018-04-02
  • 2012-03-30
  • 2012-12-26
  • 2011-12-23
  • 2016-06-13
  • 2014-03-24
相关资源
最近更新 更多