在 Winform 中托管 RemoteAPP 会话

13

我一直在尝试解决这个问题,但是还无法弄清楚...... 我正在为工作创建一个应用程序,实质上将我们所有的工具编译成一个更易于使用的GUI。我们使用的其中一项工具是来自第三方的东西,通过RDWeb作为远程应用程序进行托管。现在我也有常规的远程桌面访问权限,我可以使用MSTSC和该过程通过我的Winform访问桌面,这非常好用。我想知道是否可能仅在MSTSC控件中加载RemoteAPP而不是整个桌面,以便我的用户无法访问完整的桌面。或者是否还有其他方法在Winforms中仅托管RemoteAPP。

我已经查看了MSDN关于ITSRemoteProgram的文档,但是当我尝试以下操作时,它会抛出异常。调试器停止在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);
}

也许我正在错误的方向上思考,或者也许这根本不可能。我只想在正确的方向上获得一点指引,我并不需要任何人为我写作。


没有人有关于这个的任何信息吗?我猜这就解释了为什么我也想不通 lol。 - Nabbic
1个回答

4

IMsRdpClient.RemoteProgram.RemoteProgramMode 只适用于从 MsRdpClientNotSafeForScripting 类 ID 初始化的客户端。请参见此 MSDN 页面以获取适当的 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
@Nabbic,如果您不启动应用程序,或者尝试启动不允许或不存在的应用程序,则最终只会看到蓝色桌面。确保您正在打开程序。您可以使用任务管理器或在目标服务器上运行的另一个程序进行验证。此外,请确保设置DesktopWidthDesktopHeight成员,否则您将受限于放置在表单上的控件大小。如果远程服务器上没有打开任何应用程序,则5分钟超时。 - Mitch
我有同样的需求,需要实现类似的东西。这个答案对我几乎有用。唯一的区别是远程应用程序在WinForm之外打开。WinForm打开为空白,但另一个窗口打开远程应用程序。我想让它在我拥有ActiveX组件的Winform内部打开。上面的代码缺少什么可以让这种情况发生呢? - Ray

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接