当程序安装在终端服务器上时,我的设置应该会略有不同。我知道,GetSystemMetrics(SM_REMOTESESSION)
但据我所知,这只会告诉我我是否在 RDP 会话中运行。它不会捕获服务器管理员在本地登录以安装软件的情况,还是会这样?
检查终端服务器服务似乎也不可行,因为启用远程桌面后,它也在工作站上运行。我需要将此与允许多个并发登录会话的真正 TS 区分开来。
我没有检查任何其他服务或注册表项吗?
当程序安装在终端服务器上时,我的设置应该会略有不同。我知道,GetSystemMetrics(SM_REMOTESESSION)
但据我所知,这只会告诉我我是否在 RDP 会话中运行。它不会捕获服务器管理员在本地登录以安装软件的情况,还是会这样?
检查终端服务器服务似乎也不可行,因为启用远程桌面后,它也在工作站上运行。我需要将此与允许多个并发登录会话的真正 TS 区分开来。
我没有检查任何其他服务或注册表项吗?
这正是您需要的:
请注意,除此之外,您还可以使用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或更高版本需要查询的代码
感谢 Magnus Skog 提供的链接,我发现 InnoSetup 已经支持GetWindowsVersionEx
API 功能。因此,我所要做的就是:
function IsRunningOnTS: Boolean;
var
lWinVer: TWindowsVersion;
begin
GetWindowsVersionEx(lWinVer);
Result := (lWinVer.SuiteMask and VER_SUITE_TERMINAL) <> 0;
end;
我已经成功测试了以下场景:
False
)True
)False
)在 TS 上本地登录时,我还没有机会进行测试。当我有时会更新这篇文章。
我猜这个问题有很多答案的可能性,所有这些都看起来有点不令人满意。
例如,可能的场景有哪些:
但是,启用了 RDP 选项但未使用的服务器呢?如果服务器启用了 RDP 选项,但管理员正在控制台上安装您的软件,而一天中没有人通过 RDP 登录,情况如何?您将无法确定服务器是否实际在使用中,RDP 明智的,或者没有。
给你一个具体答案的最好方法是问你为什么需要确定这个?如果您能够可靠地检测到这一点,您将启用或禁用哪种功能?