Как определить, устанавливаю ли я на сервер терминалов сценарий InnoSetup? - PullRequest
2 голосов
/ 26 мая 2009

Мои настройки должны вести себя немного иначе, когда программа установлена ​​на сервере терминалов. Я знаю о GetSystemMetrics(SM_REMOTESESSION), но насколько я понял, это скажет мне только, работаю ли я внутри сеанса RDP. Не было бы случая, когда администратор сервера вошел в систему локально для установки программного обеспечения, или это так?

Проверка службы сервера терминалов также не представляется жизнеспособной, поскольку она также выполняется на рабочих станциях, когда удаленный рабочий стол включен. Мне нужно отличить это от истинного TS, который допускает несколько одновременных сеансов входа в систему.

Нет ли другой службы или ключа реестра, которые я проверяю?

Ответы [ 3 ]

3 голосов
/ 26 мая 2009

Благодаря ссылке, предоставленной Magnus Skog, я обнаружил, что InnoSetup уже поддерживает функцию API GetWindowsVersionEx. Поэтому все, что мне нужно было сделать, это:

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

Я успешно проверил это для следующих сценариев:

  • локально вошел на рабочую станцию ​​XP с включенным RDP (возвращает False)
  • удаленно вошел на сервер терминалов через RDP (возвращает True)
  • удаленно вошел на рабочую станцию ​​через RDP (возвращает False)

У меня еще не было возможности провести тестирование при локальном входе в систему на TS. Буду обновлять этот пост, когда у меня будет.

3 голосов
/ 26 мая 2009

Это именно то, что вам нужно:

Определение, установлены ли службы терминалов

Обратите внимание, что в дополнение к этому вы можете использовать значение 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 голос
/ 26 мая 2009

Я предполагаю, что у этого вопроса есть потенциал для многих ответов, каждый из которых покажется слегка неудовлетворительным.

Например, каковы возможные сценарии:

  • Рабочая станция с включенным RDP (т. Е. XP с включенной удаленной справкой)
  • Сервер с включенным RDP (его легко отличить от рабочей станции по типу ОС)

Однако как насчет сервера, у которого включена опция RDP, но она не используется? Как насчет сервера, у которого включена опция RDP, но администратор устанавливает ваше программное обеспечение на консоли в то время, когда никто не вошел в систему через RDP? Вы не сможете определить, действительно ли сервер используется, с точки зрения RDP или нет.

Лучший способ дать вам конкретный ответ - спросить, зачем вам это определять? Какую функцию вы включите или отключите, если сможете надежно определить это?

...