如何检测我是否在InnoSetup脚本中的终端服务器上安装?

时间:2009-05-26 10:29:17

标签: installer inno-setup terminal-services

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

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

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

3 个答案:

答案 0 :(得分:3)

这正是您所需要的:

Detecting Whether Terminal Services Is Installed

请注意,除此之外,您还可以使用 GetVersion()的值来确定您是否在运行NT。如果不是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或更高版本,该链接会显示您需要查询的代码

答案 1 :(得分:3)

感谢Magnus Skog提供的链接,我发现InnoSetup已经支持GetWindowsVersionEx API函数。因此我所要做的就是:

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上本地登录时还没有机会进行测试。我有时会更新这篇文章。

答案 2 :(得分:1)

我猜这个问题可能有很多答案,所有这些答案似乎都不尽如人意。

例如,有哪些可能的情况:

  • 启用了RDP的工作站(即启用了远程帮助的XP)
  • 服务器,启用RDP(通过检查操作系统类型可以轻松区分工作站)

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

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