Управление специфичными для пользователя данными конфигурации приложения в среде службы терминалов
Запись в реестр
Сегодня мы считаем само собой разумеющимся, что при установке приложения Windows информация, относящаяся к приложению, записывается в реестр Windows. На самом деле эта практика настолько распространена, что большинству администраторов на самом деле все равно, какие данные установщик приложения записывает в реестр, пока приложение работает и ничего не ломает в процессе.
Microsoft изложила очень конкретные рекомендации для разработчиков относительно того, как данные приложения должны быть записаны в реестр во время установки приложения. Конечно, все мы знаем, что программисты не всегда играют по правилам. Логистика приложения может помешать разработчику использовать рекомендуемые передовые методы, или разработчик может не знать, как правильно хранить данные приложения в реестре, или разработчик может просто не хватать времени или лениться. Какой бы ни была причина, существует множество приложений, которые хранят данные в неподходящих местах реестра. В большинстве случаев это никого не волнует, и неправильное использование реестра на самом деле ничему не вредит. Однако все это меняется, если приложение должно запускаться в среде службы терминалов.
Если приложение будет запускаться через службы терминалов, крайне важно, чтобы данные приложения хранились в правильной части реестра. Обычно, когда вы устанавливаете правильно написанное приложение, приложение различает данные, относящиеся к компьютеру, и данные, относящиеся к пользователю. Информация о компьютере обычно записывается в часть реестра HKEY_LOCAL_MACHINE (HKLM). С другой стороны, данные пользователя обычно записываются в HKEY_CURRENT_USER (HKCU).
Так какое же все это имеет отношение к службам терминалов? Ну, я видел довольно много приложений, которые сохраняют все данные конфигурации приложения в HKLM, а не сегментируют данные на данные, специфичные для компьютера, и данные, специфичные для пользователя. На автономном компьютере это обычно не представляет проблемы, но может иметь некоторые интересные побочные эффекты в среде службы терминалов.
Возможные проблемы
Чтобы понять, почему это так, давайте рассмотрим приложение, с которым мы все хорошо знакомы; Интернет Эксплорер. Internet Explorer, как мы все знаем, является продуктом Microsoft и поэтому имеет правильный код. Однако для демонстрации предположим, что Internet Explorer был написан таким образом, что все данные его конфигурации хранились в разделе HKLM реестра Windows.
На отдельной машине с одним пользователем такой способ хранения данных в реестре, вероятно, не вызовет никаких проблем. Это изменится, если вы используете Internet Explorer через службы терминалов. Давайте представим, что пользователь (назовем этого пользователя Пользователем А) хотел добавить веб-сайт в свой список избранного. Internet Explorer позволит пользователю А добавить сайт в свой список избранного без проблем. Давайте представим, что теперь другой пользователь (я буду называть его пользователем Б) входит в систему через совершенно другой сеанс службы терминалов и ему нужно использовать Internet Explorer. Пользователь B начинает просматривать веб-страницы и вскоре находит сайт, который хочет добавить в избранное. Пользователь Б идет, чтобы добавить сайт в список избранного, и видит, что в списке избранного уже есть сайт, который был добавлен пользователем А. Конечно, пользователь Б не понимает, что сайт, который он видит в своем списке избранного, был поставил туда Пользователь А. Поэтому они просто удаляют сайт из списка и добавляют свой сайт. Позже, когда пользователь А снова войдет в систему, сайт, добавленный им в избранное, исчезнет, но сайт пользователя Б появится в списке избранного.
Еще один интересный побочный эффект описанной выше ситуации связан с тем фактом, что раздел реестра HKLM зависит от конкретной машины. В организациях с одним терминальным сервером использование ключа реестра для конкретной машины не имеет большого значения. Однако если в вашей организации несколько серверов терминалов, а приложения хранят пользовательские данные в HKLM, то пользователи будут иметь доступ к своим данным конфигурации только до тех пор, пока они продолжают выполнять вход на один и тот же сервер терминалов. В ту минуту, когда они входят на другой терминальный сервер, их данные конфигурации, кажется, исчезли (на самом деле они в целости и сохранности на другом сервере).
Надеюсь, вы уже поняли, что хранение пользовательских данных в разделе реестра HKLM — это плохо в среде службы терминалов. Проблема в том, что вы также не можете установить данные конфигурации в HKCU. Причина в том, что HKCU применяется только к текущему пользователю, а не ко всем пользователям, которые потенциально могут использовать сервер.
Решение
Хитрость установки приложений таким образом, чтобы они могли эффективно использоваться несколькими пользователями в среде служб терминалов, заключается в использовании преимуществ двух режимов работы служб терминалов. Сеанс службы терминалов можно запустить как в режиме выполнения, так и в режиме установки. Технически вы можете устанавливать приложения во время работы в любом режиме, но вы получите очень разные результаты в зависимости от вашего режима сеанса.
Режим выполнения — это рабочий режим сеанса службы терминалов по умолчанию. Если вы устанавливаете приложение во время работы в режиме выполнения, оно будет установлено точно так же, как если бы вы установили его на отдельный компьютер. Это означает, что программа установки приложения вносит прямые изменения в части реестра HKLM и HKCU.
Как вы, наверное, уже поняли, режим Install предназначен специально для установки приложений. Когда вы устанавливаете приложение во время работы в режиме установки, программа установки записывает данные реестра непосредственно в HKLM и HKCU так же, как в автономной среде. Разница в том, что любые записи реестра, которые записываются в HKLM или HKCU, дублируются в HKLM/Software/Microsoft/Windows NT/CurrentVersionTerminalServerInstall.
Итак, допустим, вы устанавливаете приложение во время работы в режиме установки. Давайте посмотрим, что происходит, когда пользователь A пытается запустить приложение. Когда пользователь A попытается запустить приложение, Windows заметит, что в HKCU отсутствуют некоторые важные ключи реестра. Поскольку Windows не может найти необходимые ключи реестра в HKCU, она ищет их в HKLM/Software/Microsoft/Windows NT/CurrentVersionTerminalServerInstall. Предполагая, что необходимые ключи реестра существуют в этом месте (они должны быть), они копируются в HKCU. Многие приложения также зависят от пользовательских файлов INI или DLL. Если приложение зависит от таких файлов, файлы автоматически копируются либо в домашний каталог пользователя, либо в каталог профиля пользователя, если домашний каталог не существует.
Итак, что все это означает на простом английском языке? Это означает, что при первоначальной установке приложения оно настраивается таким образом, что создается общий набор данных конфигурации для приложения. При первом доступе каждого пользователя к приложению общие данные конфигурации копируются в часть реестра этого пользователя, чтобы пользователь мог настроить приложение по своему вкусу. Имейте в виду, что конфигурация пользователя для приложения не возвращается в чистое и первозданное состояние, когда пользователь выходит из системы. Конфигурация пользователя для этого приложения сохраняется, поэтому она будет доступна от одного сеанса к другому.
Итак, я думаю, вопрос на миллион долларов сейчас заключается в том, как запустить сеанс службы терминалов в режиме установки? На самом деле это намного проще, чем вы думаете. Каждый сеанс терминала начинается как сеанс в режиме выполнения. Однако вы можете переключиться в режим установки, просто используя апплет «Установка и удаление программ» на панели управления для установки приложения. На самом деле у служб терминалов в Windows Server 2003 даже есть защита. Если программа установки приложения называется Setup.exe, Windows не позволит запустить программу установки напрямую. Это заставляет вас пройти через апплет панели управления «Установка и удаление программ», если вы хотите установить приложение. Если программа установки приложения называется не SETUP.EXE, то приложение можно установить либо в режиме выполнения, либо в режиме установки.
Вывод
В этой статье я объяснил, что то, как приложения используют реестр Windows, может серьезно повредить терминальные службы. Затем я объяснил, что вы можете обойти эти проблемы, устанавливая приложения в режиме установки, а не в режиме выполнения.