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

sin*_*800 11 windows windows-7 terminal-services

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

这有一些缺点。我刚刚发现了一个隐藏在第一眼的东西。您所在的会话(即使在第一个工作站上)将识别为终端服务器会话!现在有些程序会以有限的效果(图形)运行,而有些程序根本不会运行。

这也导致一些游戏根本无法运行。他们只是说“不能在终端服务器会话中运行”然后退出。我已经证明了顶级现代游戏(DirectX 10、11)在没有 SoftXPand 的情况下在同一台机器上运行时一样好,所以这是一个非常人为的限制!

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

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

BOOL IsRemoteSession(void)
{
   return GetSystemMetrics( SM_REMOTESESSION );
}
Run Code Online (Sandbox Code Playgroud)

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

har*_*ymc 9

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

  1. 注册表:HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server\TSAppCompat。在我的桌面上的正常会话中缺少
    此密钥
    如果可以,您可以尝试删除它。
  2. SESSIONNAME 环境变量值:控制台/“RDP#”/(空)。
    您可以尝试在执行
    SET SESSIONNAME=Console(my desktop value) 或SET SESSIONNAME=(empty)后从命令提示符 (cmd) 运行您的游戏。
    要找出其当前值,请SET SESSIONNAME在更改任何内容之前输入。
  3. 系统调用GetSystemMetrics(SM_REMOTESESSION)GetVersionEx ( OSVERSIONINFOEX.wSuiteMask ) 返回执行上下文。
    除了为它编写一个系统钩子之外,你对它无能为力。
    如果有兴趣,请参阅这篇 codeproject.com 文章:API 挂钩显示