我在使用 RemoteApp ActiveX 时遇到了一个奇怪的问题...
背景:我正在尝试在通过 RemoteApp 运行我们的 GUI 应用程序的特定场景中对我们的远程桌面会话主机进行负载测试。大多数情况下,这种情况下的最大用户密度是令人感兴趣的,正如我们在生产环境中看到的那样,当会话主机上的用户数达到约 450 时(CPU 和内存从最大值耗尽),用户开始收到 RemoteApp 连接错误。
因此,为了重现/调试问题,我想设置一个示例测试,该测试将:
- 当连接到服务器主机(RD 会话主机)以调用他们自己的 RemoteApp 实例/会话时,在客户端主机上有测试用户(User1..User2..User3...User1000)
- 连接负载将逐渐增加,因为我们将在客户端主机上每 X 秒再启动一个用户
我已经实现了一个简单的 C# 应用程序,它尝试在不同的用户帐户下调用多个 RemoteApp 会话。(我们为此预先生成了 1000 个用户帐户)
问题是:如果我一个接一个地创建会话,则运行 RemoteApp 的第一个会话在 User 1下正确验证,即使我提供不同的凭据(User 2、 User 3等),以下调用的会话也会运行,但是仍然在相同的用户1下进行身份验证(但我希望它是用户 2、用户 3 等等......)。所以我基本上在服务器端(RD 会话主机端)只看到用户 1 登录并在其下运行应用程序的多个副本。
所以某处缓存了用户名,但我不知道在哪里:(
后面的代码是:
主循环:
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)
这很有趣,尽管我确实为工作区提供了凭据,但它并没有兑现它。欢迎任何建议。
谢谢。