Конечно терминальный сервер применяется не только в вузах, но так как я начал писать статьи про информатизацию в вузах, хочу отметить что я видел: очень часто из терминального сервера делают настолько уникальный сервер с кучей ролей и возможностей, что при его падении останавливаются все бизнес-процессы организации... И что удивляет каждый раз: что данный подход настолько сложно сломать и люди продолжают наступать на одни и те же грабли.

Итак давайте разберем кейс настройки пользовательского интерфейса на терминальном сервере. Я опишу свой опыт, и попрошу в комментариях написать то, что еще можно сделать для данного кейса – буду очень благодарен.

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

  • Клиент 1с или другого приложения – по тематике работы пользователей

  • Набор офисных программ.

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

Давайте пойдем от принципа единственной ответственности и пусть RDS обладает лишь функцией запуска приложений. Поэтому хранение файлов на терминальном сервере необходимо запретить – для хранения файлов существует dfs или просто расшаренная папка. При таком подходе мы минимизируем проблему, которая возникает при исчезновении свободного места на диске, но все же еще остается риск что это произойдет.

Почему нельзя хранить файлы на терминальном сервере, потому как это убирает гибкость из вашей инфраструктуры, и если терминальный сервер сломается, то вы потратите много времени на перенос информации с одного сервера на другой. Замена терминального сервера должна происходить незаметно для пользователя – поэтому лучше использовать ферму, в которую входит как минимум два сервера: один вывели из работы, а другой работает… Ну и терминальный сервер должен быть виртуальной машиной…

Для запрета хранения файлов на терминальном сервере необходимо:

  • Отключить отображение всех локальных дисков и запретить к ним доступ (для пользователей)

  • Отключить отображение всех элементов рабочего стола

  • Создать набор ярлыков необходимого ПО в панели задач

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

Будем отталкиваться от того, что терминальный сервер со всем ПО у нас уже установлен (это тоже можно автоматизировать, но это уже другая история).

На контроллере домена создаем объект групповой политики через оснастку «Управление групповой политикой» и редактируем его.

Отключаем рабочий стол:

Конфигурация пользователя – Административные шаблоны – Рабочий стол – Рабочий стол: Отключить все элементы

Конфигурация пользователя – Административные шаблоны – Рабочий стол: Скрыть и отключить все элементы рабочего стола

Скрываем диски:

Конфигурация пользователя - Административные шаблоны - Компоненты Windows - Проводник Windows: Скрыть указанные диски

Запрещаем доступ к локальным дискам:

Конфигурация пользователя - Административные шаблоны - Компоненты Windows - Проводник Windows: Запретить доступ к дискам через Мой компьютер - этот параметр политики не запрещает пользователям использовать другие программы для доступа к локальным и сетевым дискам. Он также не запрещает использовать оснастку «Управление дисками» для просмотра и изменения характеристик дисков. Поэтому все ПО, которое пишет в temp или в профиль пользователя должно работать…

Можно отключить известные папки, но через групповые политики у меня это не получилось – видимо необходимо это делать через реестр: политика «Отключить известные папки» не заработала – видимо она применяется после того как профиль пользователя создан и уже созданы известные папки… кто в теме поясните в комментариях.

Настройка фильтрации политики:

Так как данная политика применяется к пользователю и должна выполняться только на терминальных серверах то необходимо настроить фильтрацию:

На вкладке область в фильтрах безопасности удалить группу «Прошедшие проверку» так как эта группа включает все компьютеры и всех пользователей.

Добавить группу пользователей и учетки серверов где эту политику необходимо применить.

Политику считывает компьютер поэтому, если учетки компьютера нет в фильтре, то она не применяется.

Эти же группы должны быть и на вкладке делегирование (с этой вкладкой будьте осторожны!!!).

НО!!!! Скрывать диски нужно только пользователям, а администраторам это незачем, поэтому во вкладке «Делегирование нажимаем «Дополнительно» и на группе «Администраторы домена» ставим галку «Запретить» напротив «Применить
групповую политику»:

Есть другой путь фильтрации - на вкладке «Область» – применить WMI-фильтр – он из себя представляет запрос, но, чтобы его применить его надо сначала создать в оснастке "Управление групповой политикой" в подразделении "Фильтры WMI".

Поэтому можно в фильтрах безопасности и во вкладке «Делегирование» оставить группу «Прошедшие проверку», а ниже добавить WMI-фильтр, например, такого содержимого:

SELECT * FROM Win32_ComputerSystem WHERE Name='server-01' OR Name='server-02'

Но я бы применял и Secure и WMI фильтры.

Создания списка ПО в панели задач

Теперь попробуем создать групповую политику для создания списка ярлыков необходимых программ в панели задач и меню пуск. Для этого сначала разместим все необходимые ярлыки на начальном экране и затем выполним такую команду:

Export-StartLayout -path c:\ps\StartLayout.xml

В полученном файле содержится информация о ярлыках в формате xml. Теперь немного подредактируем его и добавим список программ на панель задач. Для этого после </DefaultLayoutOverride> добавим следующее:

  <CustomTaskbarLayoutCollection PinListPlacement="Replace" xmlns:taskbar="http://schemas.microsoft.com/Start/2014/TaskbarLayout">
    <defaultlayout:TaskbarLayout>
      <taskbar:TaskbarPinList>
        <taskbar:DesktopApp DesktopApplicationLinkPath="C:\Program Files\1cv8\common\1cestart.exe" />
        <taskbar:DesktopApp DesktopApplicationLinkPath="C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Excel 2016.lnk" />
        <taskbar:DesktopApp DesktopApplicationLinkPath="C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Word 2016.lnk" />
        <taskbar:DesktopApp DesktopApplicationLinkPath="%APPDATA%\Microsoft\Windows\Start Menu\Programs\System Tools\File Explorer.lnk" />
      </taskbar:TaskbarPinList>
    </defaultlayout:TaskbarLayout>
  </CustomTaskbarLayoutCollection>

Затем можно проверить получившийся файл командой:

Import-StartLayout -LayoutPath c:\ps\StartLayout.xml  -MountPath c:\

Нужно будет перелогиниться на сервере, если ярлыки появились на панели задач, то можно приступить к созданию политики.

Для начала положим получившийся xml в расшаренную папку и дадим разрешение всем только на чтение.

Теперь создадим политику:

"Конфигурация пользователя", "Административные шаблоны", "Компоненты Windows", “Меню ПУСК и панель задач”: Макет начального экрана – и в поле «Файл макета начального экрана» прописываем путь до xml: \\server\share\ StartLayout.xml

Одно пояснение: на панели задач не получилось создавать ярлыки того ПО, которое находится на сетевом диске - кто знает как решить, пожалуйста, поделитесь в комментариях.

Применяем к политику к соответствующему подразделению и добавляем фильтр.

В результате мы получим интерфейс, который направит пользователя в нужное русло….

Но так как на сервере будет создаваться много учетных записей пользователей и из-за этого будет исчезать свободное место на диске, то необходимо удалять хотя бы неактивные учетки – для этого создадим групповую политику:

Конфигурация компьютера - Административные шаблоны - Система - Профили пользователей: Удалять при перезагрузке системы профили пользователей по истечении указанного числа дней.

Теперь давайте собственно создадим политику для ежедневной перезагрузки сервера:

Конфигурация компьютера  - Настройка – Параметры панели управления – Назначенные задания:

Создаем задание:

Настраиваем расписание и создаем действие:

Обратите внимание, так как задание создаем в ветке Конфигурация компьютера, то в задании указываем пользователя: NT AUTHORITY\SYSTEM – но будьте осторожны, у системы большие привилегии, поэтому предварительно проверяйте ваши скрипты. Я пытался запускать это задание из-под пользователя, но оно не выполнялось по какой-то причине – но здесь я могу быть не прав и скорее всего все нормально запускается и из-под пользователя – поправьте в комментариях пожалуйста.

Мы вроде бы запретили пользователям использовать диск C, но политики не запрещают использовать диск программам, и, например, 1с может накешировать очень много, поэтому я использую скрипт, который удаляет большие профили – запуск скрипта в то время, когда нет пользователей на сервере и запуск аналогично заданию на перезагрузку - создадим политику для ежедневного удаление больших профилей пользователей:

Конфигурация компьютера  - Настройка – Параметры панели управления – Назначенные задания:

Создаем задание

Настраиваем расписание, а потом настраиваем действие:

И не забываем настроить фильтры для групповой политики.

Скрипт должен располагаться в расшаренной папке, у которой добавлены разрешения на чтение для доменных учеток терминальных серверов, а также расшарьте папку на запись для этих же учеток для логов. Предварительно еще настройте политику запуска скриптов на сервере - это тоже можно сделать доменной групповой политикой. Вот текст скрипта:

$h = hostname
#профили этих пользователей лучше не удалять
$NotDeletedUsers=@('All Users', 'Admin-01', 'VredniyBuh', 'Default', 'Все пользователи')
$sum=0
gci -force 'C:\Users'-ErrorAction SilentlyContinue | ? { $_ -is [io.directoryinfo] } | % {
$len = 0
gci -recurse -force $_.fullname -ErrorAction SilentlyContinue | % { $len += $_.length/1MB }
#write "$_.BaseName : $len" | out-file \\storage\logs\deUsers.txt -append
if($len -gt 400){
    $user=$_.BaseName
        if($_.BaseName -NotIn $NotDeletedUsers ){
            Write "$h $(get-date -format "dd.MM.yy.HH.mm.ss") Будем удалять профиль пользователя $user : $len"  | out-file \\storage\logs\deUsers.txt -append
            Write "__________________  $user  ______________________________" | out-file \\storage\logs\deUsers.txt -append
            Get-CimInstance -Class Win32_UserProfile | Where-Object { $_.LocalPath.split('\')[-1] -eq $user } | Remove-CimInstance
        }

}else {$sum = $sum + $len}

}
“Общий размер профилей”,'{0:N2} GB' -f ($sum) | out-file \\storage\logs\deUsers.txt -append

После создания политик – необходимо зайти на сервера и выполнить gpupdate /force

Чтобы посмотреть применение политик gpresult /r, gpresult /r /scope:computer

Теперь, благодаря доменным политикам новый терминальный сервер можно настроить в два клика

Если есть что добавить напишите пожалуйста в комментариях.

Комментарии (13)


  1. Kuznetsov_pa
    27.05.2023 20:06
    +2

    Мой совет найдите и почитайте вот эту книгу Эффективное администрирование. Ресурсы Windows Server 2008 книжка старая , но др сих пор актуально. Многое вам упростит https://bhv.ru/product/effektivnoe-administrirovanie-resursy-windows-server-2008-windows-vista-windows-xp-windows-server-2003/


  1. kerberos464
    27.05.2023 20:06
    +2

    Совет номер ноль: никогда не используйте локализованные версии Windows в продакшене.


    1. shmelfrol Автор
      27.05.2023 20:06

      да, русскую версию используем, пока не критично, но соглашусь с Вами - лучше не использовать локализованные версии...


    1. kus
      27.05.2023 20:06

      Почему? (Хотя бы кратко)
      ЗЫ: Беглый гуглёж ничего не выдал.


      1. shmelfrol Автор
        27.05.2023 20:06

        ну политики называются по-русски, а документация в большинстве своем на английском. И ошибки, в логах могут выглядить немного коряво на русском - и в поисковиках на русском отсекается очень много информации с англоязычных сайтов.


      1. kerberos464
        27.05.2023 20:06

        1. Любая проблема с виндой, которую не удаётся решить самому и вы с текстом ошибки идёте в гугл. Но по локализованному тексту ошибки ваши шансы найти и решить проблему значительно снижаются.

        2. Не знаю, как сейчас, но раньше на локализованные версии требовались и апдейты локализованные. И с ними была проблема в том, что они выходили позднее англоязычных, иногда значительно позднее.


  1. 4nariK
    27.05.2023 20:06

    всё таки "терминал" это максимально узкий и максимально быстрый/интерактивный канал для gui-интерактива - то что по обе стороны это может проксироваться или балансироваться в том числе с учетом доступа это уже удаленный гидра-компьютер а перечисленное в статье это multiseats-nt4ts


  1. W3n8f34
    27.05.2023 20:06

    Есть GPO для перемещаемых профилей, параметр который выделяет квоту на профиль пользователя сервера терминалов, который хранится на сетевом диске, у вас как раз ферма. Таким образом файлы хранятся в сети, файлы доступны при смене сервера, можно установить размер профиля 5 Гб к примеру

    А ещё вы используете алиасы когда публикуете код powershell. Не все смогут понять что вы хотели выразить


    1. shmelfrol Автор
      27.05.2023 20:06

      был опыт с перемещаемыми профилями, правда, очень давно, тогда была проблема с сетью из-за них. Можно использовать перемещаемые профили только для фермы, если в фильтрах политики поставить учетки терминальных серверов из фермы... но нужно ли... в чем преимущество перемещаемых профилей?


      1. W3n8f34
        27.05.2023 20:06

        Может это будет работать через targeting GPO, чтобы только для терминала, не пробовал. В свойствах учеток AD есть параметр хранения профиля пользователя сервера терминалов. А ещё начиная с 2012r2 появились перемещаемые диски пользователей сервера терминалов, там тоже задаётся органичение.


      1. W3n8f34
        27.05.2023 20:06

        Пардон, преимущество в отказоустойчивости, в доступности рабочего места, и само собой хранение документов на файловом сервере


        1. shmelfrol Автор
          27.05.2023 20:06

          у нас реализована более простая схема, на RDS серверах ничего не храним, а к учетке пользователя подключается сетевой диск - dfs - где есть папки по подразделениям - каждый пользователь работает в папке своего подразделения - всё лежит на файловом сервере, конечно, создаются бекапы (и версионность тоже включена). Если мы начнем использовать перемещаемые профили, что получим? - пользователь будет подключаться с любого компьютера или терминала и видеть свой рабочий стол и файлы, но тогда у них будет возможность насохранять в свой профиль кучу всего... Если перемещаемый профиль будет памиться как сетевой диск, то ничего плохого, в принципе, не будет, если же все файлы будут тянуться каждый раз по сети то нагрузка на сеть будет огромна.. Но если я правильно понял к перемещаемым профилям добавились еще папки перенаправления, которые немного упрощают эту схему, но все же можно попасть в ситуацию, когда придется разгребать неполадки перемещаемых профилей. А с другой стороны наш подход выглядит доисторическим и хотелось бы понять что народ использует и какие плюсы и минусы подходов.


  1. W3n8f34
    27.05.2023 20:06

    DFS это не то чтобы простая схема, это правильная схема. Но мы же говорим о том чтобы пользователи не оставляли свои файлы на рабочем столе конкретного сервера, и в случае поломки сервера у них будет настроенный профиль с помощью ваших политик и перемещаемого профиля. То есть сама идея прятать ярлыки на рабочем столе не нужна. Вам подходят перемещаемые профили, диски профилей, да с ними есть морока, какие то директории приходится исключать из перемещения, какие то обязательно указывать , это зависит от программ которые используются на терминале. И обязательно задаются ограничения на квоты, тогда сохранять у пользователя много не получится.