Windows:如何让程序认为它们没有在终端服务器会话中运行?

Windows:如何让程序认为它们没有在终端服务器会话中运行?

我在 Windows 7 PC 上使用 Miniframe 的“SoftXPand 2011 Duo”程序。它将一台计算机变成两个工作站。它使用 Windows 内置的终端服务来创建附加会话。我使用两个屏幕、两个键盘和两个鼠标来创建两台计算机的“幻觉”。它运行良好,我甚至可以在这台机器上的两个屏幕上玩两个不同的 3D 游戏(使用 Radeon HD5770 和 Core i5 2500k,配备 8 GB RAM)。

这有几个缺点。我刚发现一个乍一看就隐藏的缺点。你所在的会话(即使在第一个工作站上)将被识别为终端服务器会话!现在,一些程序将以有限的效果(图形)运行,而有些程序根本无法运行。

这也导致一些游戏根本无法运行。它们只是说“无法在终端服务器会话中运行”然后退出。我已经证明顶级现代游戏(DirectX 10、11)的运行效果与没有 SoftXPand 的同一台机器一样好,所以这是一个相当人为的限制!

那么,我能以某种方式破解我当前的会话,使它看起来不再像终端服务器会话吗?IE

#include <windows.h>
#pragma comment(lib, "user32.lib")

BOOL IsRemoteSession(void)
{
   return GetSystemMetrics( SM_REMOTESESSION );
}

将返回 FALSE?(这不是编程问题!只是一个程序如何检测它们是否处于终端服务器会话中的示例!)

答案1

应用程序可以通过多种方式检查其是否在终端服务器会话中运行。其中一些方法您可以破解,如下所示:

  1. 註冊 :HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server\TSAppCompat
    此键在我的桌面上的正常会话中丢失了。
    如果可以,您可以尝试将其删除。
  2. SESSIONNAME 环境变量值:控制台 / “RDP#” / (空)。您可以在执行(我的桌面值) 或(空)
    后尝试从命令提示符 (cmd) 运行游戏。 要找出其当前值,请在更改任何内容之前输入。
    SET SESSIONNAME=ConsoleSET SESSIONNAME=
    SET SESSIONNAME
  3. 系统调用获取系统指标(SM_REMOTESESSION)获取版本信息操作系统版本信息.wSuiteMask) 返回执行上下文。
    除了为它编写系统钩子外,你对此无能为力。
    如果感兴趣,请参阅此 codeproject.com 文章:API 挂钩揭秘

答案2

我找到了一个解决方案:通过“runas”运行你想要的程序

通过桌面登录后,在cmd中输入:

runas /user:您的名称“您的程序路径”

我根据 Bently 的软件对其进行了测试,它们确实运行良好。

答案3

我使用的是 Microsoft 远程桌面,我尝试了 @harrymc 发布的前两种方法,但它们对我而言不起作用。第三种方法对我来说太复杂了,所以我没有尝试。

最后,我发现 Parallel Access 可以让我使用显示错误的程序。它不如 RDP 那么流畅,所以如果我真的必须使用该程序,我就会使用它。

答案4

没有直接解决 SoftXPand 问题,但我通过 Google 搜索来到这里,它与 @harrymc 的答案一致。

我创建了一个批处理文件,延迟 60 秒,然后启动我想要运行的应用程序。我启动了批处理文件,退出我的 RDP 连接,等待了大约 5 分钟,然后重新连接到 RDP。当我重新连接时,我想要的那个烦人的应用程序正在等着我。以下是批处理文件的内容:

timeout 60

start /D "your path here" yourExecutable.exe

如果路径中有空格,则需要用引号括住路径。

从这里获取批次信息: https://stackoverflow.com/questions/8324352/creating-a-batch-file-for-programs-to-start-using-a-delay

向这个家伙致敬: https://stackoverflow.com/users/959263/raihan

(它说要提供详细信息并分享我的研究)

相关内容