当程序安装在终端服务器上时,我的设置应该略有不同。我知道GetSystemMetrics(SM_REMOTESESSION)
但据我所知,这只会告诉我我是否在RDP会话中运行。它不会发现服务器管理员在本地登录以安装软件的情况,或者不是吗?
检查终端服务器服务似乎不可行,因为当启用远程桌面时,它也会在工作站上运行。我需要将它与允许多个并发登录会话的真正TS区分开来。
我没有检查过任何其他服务或注册表项吗?
答案 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;
我已成功测试了以下情况:
False
)True
)False
)我在TS上本地登录时还没有机会进行测试。我有时会更新这篇文章。
答案 2 :(得分:1)
我猜这个问题可能有很多答案,所有这些答案似乎都不尽如人意。
例如,有哪些可能的情况:
但是,启用了RDP选项但未使用的服务器呢?如果服务器启用了RDP选项,但管理员是在一天中没有人通过RDP登录时在控制台上安装软件?您将无法确定服务器是否实际使用,RDP方式是否正确。
给你一个具体答案的最好方法是问你为什么需要确定这个?如果能够可靠地检测到这种功能,您将启用或禁用哪种功能?