是否有“在terminal会话中运行”的谎言?

Windows提供了许多解决方法来解决程序中的错误和限制。

Shims可以骗一个关于各种事物的程序

  • 谎报Windows的版本
  • 谎报文件操作失败
  • 说谎它无法打开的registry项

对terminal会话 (例如远程桌面运行的软件有没有足够的谎言

我有一个软件,检测它是否在terminal会话中运行,并相应地改变其行为。 另一个软件拒绝运行,因为它说simiply不支持。

而且就像一个拒绝在Windows 2000以上的程序运行的程序一样,它可以正常运行 – 只要它给自己一个机会。

有没有“ terminal会话 ”的垫片?


想象一下包含以下内容的伪代码

static class Program { if (System.Windows.Forms.SystemInformation.TerminalServerSession) { System.Environment.FastFail("We're too lazy to make our software work under TS."); } ... } 

其他应用程序在terminal会话下更改其行为:

 //Don't enable animations if we're in a TS window, or on battery Boolean animationsEnabled = (!System.Windows.Forms.SystemInformation.TerminalServerSession) && (System.Windows.Forms.SystemInformation.PowerStatus.PowerLineStatus != PowerLineStatus.Offline); 

我希望Windows对应用程序说谎,以便它不认为它运行在terminal会话/远程桌面会话中。


这与其他程序不知道如何编写版本检查代码的方式类似,所以在Windows XP上的任何更新都失败:

 static class Program { //Make sure we're on Windows 5.0 or later: if (!(WinMajorVersion >= 5) && !(WinMinorVersion >= 0)) FastFail("Requires Windows XP or later"); } 

上面的代码prompty在Windows版本6.0上失败 – 这正是版本lie shims存在的原因。

我不相信这是可能的。 您的程序可能正在查看的特定标志代码是SM_REMOTESESSION标志。 正如SQLChicken所指出的那样,您可以通过尝试获取控制台会话来打败单个用户,这将使您的SM_REMOTESESSION = 0 ,但对于多个用户,我认为不能这样做。

我很欣赏这令人沮丧,但是您可能需要与程序供应商合作解决此问题。 这是很多工作纠正在TS下行事不当的软件,因为它通常是由于所有的计算机只是大屏幕PDA和多个用户是不可能的(而networking实际上是为高级用户)造成的蹩脚的Windows心态造成的。 由此造成的问题不仅限于你描述的“不能被打扰”的function(例如:

 #include <windows.h> #pragma comment(lib, "user32.lib") BOOL IsRemoteSession(void) { return GetSystemMetrics( SM_REMOTESESSION ); } 

),还包括共享资源的使用和graphics的正确使用(这是Raymond Chen所讨论的 )。

所以除非你有其他的机制来certificate这个软件可以和多个用户正常工作,否则我会倾向于认为打败SM_REMOTESESSION检查实际上是不够的。

我有点困惑,但我会采取一些措施。 在远程login到使用RDP的服务器方面,您可以使用控制台连接,以便您可以运行需要该控制台状态的应用程序。 点击开始 – >运行并input'mstsc.exe /?' (没有单引号)。 这将为您正在运行的任何版本的RDP提供帮助开关。 您可以使用这些交换机使用控制台会话启动RDP。 例如对于我正在运行的版本(Windows 7 RC),我将键入'mstsc.exe / v:exampleserver / admin'来连接到名为exampleserver的服务器的控制台会话。 请注意,在RDP版本中存在差异,因为/ admin开关曾经是/ console。 如果你想确定,然后连接到你的目标服务器并运行/? 命令,并查看它对控制台连接的期望。

解决方法,而不是解决scheme。

你正在寻找运行一个单一的pipe理软件,或提供一个应用程序到terminal服务器?

如果以前,你可以使用诸如VNC / LogMeIn之类的东西连接到控制台 – 而系统不知道你是远程连接的。

后来的危险是有些应用程序使用共享资源(我们使用的应用程序具有相同的命名临时文件,所以多个用户导致损坏),并且由于devise不佳而无法在多个实例下的terminal服务器上运行。