3

当程序安装在终端服务器上时,我的设置应该会略有不同。我知道,GetSystemMetrics(SM_REMOTESESSION)但据我所知,这只会告诉我我是否在 RDP 会话中运行。它不会捕获服务器管理员在本地登录以安装软件的情况,还是会这样?

检查终端服务器服务似乎也不可行,因为启用远程桌面后,它也在工作站上运行。我需要将此与允许多个并发登录会话的真正 TS 区分开来。

我没有检查任何其他服务或注册表项吗?

4

3 回答 3

4

这正是您需要的:

检测终端服务是否安装

请注意,除此之外,您还可以使用GetVersion()的值来确定您是否正在运行 NT。如果不是新台币,那么保释。

// Are we running Windows NT?
DWORD dwVersion = GetVersion();
if (!(dwVersion & 0x80000000)) {
    // Is it Windows 2000 or greater?
    if (LOBYTE(LOWORD(dwVersion)) > 4) {
        // Check with VerSetConditionMask() and VerifyVersionInfo()
        return ..;
    }
    else  {
        // Windows NT 4.0 or earlier. Check ProductSuite value in
        // HKLM\\System\\CurrentControlSet\\Control\\ProductOptions
        return ..;
    }
}

return false;

链接显示版本是Win2k或更高版本需要查询的代码

于 2009-05-26T10:54:22.040 回答
3

感谢 Magnus Skog 提供的链接,我发现 InnoSetup 已经支持GetWindowsVersionExAPI 功能。因此,我所要做的就是:

function IsRunningOnTS: Boolean;
var
  lWinVer: TWindowsVersion;
begin
  GetWindowsVersionEx(lWinVer);
  Result := (lWinVer.SuiteMask and VER_SUITE_TERMINAL) <> 0;
end;

我已经成功测试了以下场景:

  • 本地登录到启用 RDP 的 XP 工作站(返回False
  • 通过 RDP 远程登录到终端服务器(返回True
  • 通过 RDP 远程登录到工作站(返回False

在 TS 上本地登录时,我还没有机会进行测试。当我有时会更新这篇文章。

于 2009-05-26T12:49:18.250 回答
1

我猜这个问题有很多答案的可能性,所有这些都看起来有点不令人满意。

例如,可能的场景有哪些:

  • 启用 RDP 的工作站(即启用远程帮助的 XP)
  • 服务器,启用了 RDP(通过检查操作系统类型很容易与工作站区分开来)

但是,启用了 RDP 选项但未使用的服务器呢?如果服务器启用了 RDP 选项,但管理员正在控制台上安装您的软件,而一天中没有人通过 RDP 登录,情况如何?您将无法确定服务器是否实际在使用中,RDP 明智的,或者没有。

给你一个具体答案的最好方法是问你为什么需要确定这个?如果您能够可靠地检测到这一点,您将启用或禁用哪种功能?

于 2009-05-26T11:01:46.703 回答