【问题标题】:How do I detect whether I'm installing on a Terminal Server in an InnoSetup script?如何检测我是否在 InnoSetup 脚本中的终端服务器上安装?
【发布时间】:2009-05-26 10:29:16
【问题描述】:

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

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

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

【问题讨论】:

    标签: installation inno-setup terminal-services


    【解决方案1】:

    这正是你所需要的:

    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或更高版本需要查询的代码

    【讨论】:

    • 谢谢!该链接为我指明了正确的方向。但由于该问题专门针对在 InnoSetup 脚本中而不是在 C++ 中执行此操作,所以我将我的解决方案作为单独的答案发布。
    • @ralphtheninja 您注释掉的部分是我坚持的部分... // Windows NT 4.0 或更早版本。检查 // HKLM\\System\\CurrentControlSet\\Control\\ProductOptions 中的 ProductSuite 值我在获取注册表值之前从未遇到过这么大的麻烦 =(
    【解决方案2】:

    感谢 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 时,我还没有机会进行测试。当我有时会更新这篇文章。

    【讨论】:

      【解决方案3】:

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

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

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

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

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

      【讨论】:

      • 原因是有问题的应用程序是 Outlook 插件并且我们使用浮动许可证,即每个启动的 Outlook 实例通常都会用完一个许可证。但是,一些客户购买的许可证少于他们在服务器上拥有的用户总数。因此,在 TS 上安装时,我们提供了在停用状态下安装应用程序的附加选项,这样只有拥有许可证的用户才能启用插件。我想为非 TS 上的安装隐藏此选项,因为它会让那里的用户感到困惑。
      猜你喜欢
      • 2011-07-16
      • 1970-01-01
      • 2020-11-02
      • 2018-08-30
      • 1970-01-01
      • 1970-01-01
      • 2011-06-03
      • 2022-01-26
      • 1970-01-01
      相关资源
      最近更新 更多