Microsft RDS RemoteApp - 在一个应用程序中调用不同帐户下的应用程序

时间:2015-07-30 06:03:55

标签: c# activex rdp rds remoteapp

使用RemoteApp ActiveX时遇到一个奇怪的问题......

背景: 在通过RemoteApp运行我们的GUI应用程序的特定场景中,我试图加载测试我们的远程桌面会话主机。大多数情况下,这种情况下的最大用户密度是我们感兴趣的,因为我们在生产环境中看到,当用户对会话主机的计数达到~450时(CPU和内存从最大输出中消失),用户开始获取RemoteApp连接错误。

因此,为了重现/调试问题,我想设置一个样本测试:

  1. 在客户端主机上安装测试用户(User1..User2..User3 ... User1000),连接到服务器主机(RD会话主机)以调用他们自己的RemoteApp实例/会话
  2. 连接负载将逐渐增加,因为我们将在客户端主机上每隔X秒再启动一个用户
  3. 我实现了一个简单的C#应用​​程序,它试图在不同的用户帐户下调用多个RemoteApp会话。 (我们已为此预先生成了1000个用户帐户)

    问题是:如果我一个接一个地创建会话,则在用户 1 下正确验证运行RemoteApp的第一个会话,即使我提供了不同的凭据,也会调用以下会话(用户 2 ,用户 3 等等)正在运行,但仍在同一用户 1 下进行身份验证(但我希望它是User2,User3等等)上...)。所以我基本上在服务器端(RD会话主机端)看到只有User1登录,并在其下运行应用程序的多个副本。

    所以某处某处缓存了用户名,但我不知道在哪里:(

    背后的代码是:

    主循环:

        for (int i = from; i < to; i++)
        {
            LaunchRDPSnapIn(i);
            Thread.Sleep(period);
        }
    

    启动器功能:

        static void LaunchRDPSnapIn(int number)
        {
            var rdpFileName = "SomeRemoteAppFile.rdp";
            var rdpFileContents = File.ReadAllText(rdpFileName);
            var rdpFile = new RDPFile(rdpFileContents);
    
            var msRdpClientShellType = Type.GetTypeFromProgID("MsRdpWebAccess.MsRdpClientShell");
            if (msRdpClientShellType != null)
            {
                dynamic shell = Activator.CreateInstance(msRdpClientShellType);
                dynamic workspace = shell.MsRdpWorkspace2;
                var result = workspace.StartWorkspaceEx(
                    rdpFile.WorkspaceId+number,
                    "RDPStressSession",
                    rdpFile.FullAddress,
                    "User" + number + "@domain.com", // Username is updated each time
                    "SomePassword",
                    "1E715D4A1234A0DDAF06E946AFB66F7045A4D12345",
                    20,
                    4);
    
                shell.RdpFileContents = rdpFileContents;
                shell.PublicMode = false;
                shell.Launch();
            }
        }
    

    作为启动上述代码的结果,创建的所有会话都是在第一个经过身份验证的用户(在本例中为User1@domain.com)下创建的。

    虽然我确实为工作区提供了凭据,但它并不尊重它,这很有趣。 任何建议欢迎。

    感谢。

0 个答案:

没有答案