Настройка терминальной фермы. Установка и настройка FSLogix вместо User Profile Disks. Часть 4.

Remote Desktop Services

Введение.

После основной конфигурации терминальной фермы, профиль пользователя нужно централизованно подгружать на каждый из серверов сеанса удаленного рабочего стола. По умолчанию используется User Profile Disks начиная с Windows Server 2012R2, конечно мы не говорим об устаревших технологиях по типу перенаправляемых профилей\папок, но также есть и другие решения, в данном случае мы применяем FSlogix.

FSLogix Profile Container преобразует профиль пользователя в VHD\X-файл и перенаправляет его на общий сетевой ресурс (Fileshare). Пока пользователь входит в систему, агент подключается к FileShare и проверяет, существует ли VHD\X-файл для вошедшего в систему пользователя. Если это так, то виртуальный диск монтируется к папке C:\Users\. Если соответствующий VHD\X-файл не найден в FileShare, для пользователя создаётся и монтируется новый VHD\X-файл. 

Обзор

Если говорить о разнице UPD и FSLogix, у последнего больше возможностей и преимуществ. Для простых сред всё так же может использоваться UDP, но чисто практически я не вижу в этом ни какого смысла, UDP ни как не развивается Microsoft, имеет свои некоторые проблемы и недостатки.

1. Недостатки UDP:

  • Периодическое зависание диска и создание Temp профиля. При том, что даже была создана групповая политика, предотвращающая создание временного профиля, но это не помогло избежать данной проблемы. Как результат, приходиться очищать в реестре bak запись, чтоб профиль корректно вновь стал подгружаться.
  • При росте профиля, более длительный вход и выход из системы.
  • Техническая реализация UDP не позволяет обращаться программам в TEMP\TMP папки. С последним с чем столкнулся, это невозможность установить плагины для браузера. Костыли которые предлагают в интернете по перемещению этих папок вызывают другие проблемы.
  • Каждый раз, когда загружается профиль, пересоздается кэш индекса, что вызывает дополнительную нагрузку и проблемы с поиском.
  • Создаются backup папки профилей, которые дублируются и не очищаются.

2. Преимущества FSLogix:

  • Полнофункциональное решение для перемещаемых профилей. Он заботится обо всем, что происходит в папке C:\Users\%username%. Системные папки (например, Рабочий стол, Загрузки и т.д.) Присутствуют вместе со всеми пользовательскими настройками и предпочтениями ( То есть Реестром, данными приложений и т.д.). Поскольку компоненты Office 365 подпадают под эти категории, все, что с ними связано, обрабатывается как часть контейнера профиля.
  • Более высокая производительность.
  • Сокращает время входа в систему и выхода из системы.
  • Снижает трафик и нагрузку на файловые серверы.
  • Оптимизирован для Office 365.
  • Расширенные групповые политики.
  • Маскировка приложений (Application Masking) может управлять доступом к приложениям, шрифтам, принтерам и прочим элементам. Доступ может контролироваться на уровне пользователей, диапазонов IP-адресов или прочих критериев.
  • Контроль версий Java (Java Version Control) может указывать версию Java, которая будет использоваться определенными URL и/или приложениями.

Настройка файлового сервера.

Я сэкономлю ресурсы и время, потому расположу на контроллере домена.

1. Создаем структуру папок:

C:\FSLogix\Logs
C:\FSLogix\Profiles
C:\FSLogix\Redirections

2. Расшариваем папки и устанавливаем права:

C:\FSLogix\Profiles СОЗДАТЕЛЬ-ВЛАДЕЛЕЦИзменение: Только для подпапок и файлов.
Доступ к профилю владельца.
Пользователи доменаИзменение: Только для этой папки.
Требуется во время создания профиля.
C:\FSLogix\Logs Компьютеры доменаПолный доступ: Для этой папки, ее подпапок и файлов. Требуется доступ компьютерам для создания логов.
C:\FSLogix\RedirectionsПользователи доменаЧтение: Для этой папки, ее подпапок и файлов.
Требуется для чтения пользователями конфигурационного файла Redirections.xml.

Установка приложения.

  1. Переходим на сайт Microsoft и скачиваем FSLogix: https://docs.microsoft.com/en-us/fslogix/install-ht
  2. Открываем архив и инсталлируем \x64\Release\FSLogixAppsSetup.exe на RDSH сервера.

Установка и настройка групповых политик.

1. Установим на наш контроллер домена политики fslogix.adml и fslogix.admx из архива по пути: \oilservice.local\SYSVOL\oilservice.local\Policies\PolicyDefinitions, что бы они отреплицировались на другие КД.

2. Создаем новую политику, нацеливаем ее на объекты наших компьютеров RDSH серверов.

3. Настраиваем политику: Computer Configuration->Polices->Administrative Templates->FSLogix

FSLogix\Enable loggingEnabled. Only specifically enabled logs.
Включаем основные логи работы профилей.
FSLogix\Path to logging filesEnabled. \\ADDS\Logs\%COMPUTERNAME%
По этому пути создадутся подпапки с именем RDSH серверов.
FSLogix\Days to keep log filesEnabled. Days to keep log files 3.
Три дня более чем достаточно.
FSLogix\Profile Containers\Store search database in profile container Enabled. Store search database in profile container. Disabled.
Отключаем сохранение базы поиска в профиле.
FSLogix\Profile Containers\EnabledEnabled. Включаем сам FSLogix.
FSLogix\Profile Containers\VHD Location Enabled. \\ADDS\Profiles\
Путь хранения наших профилей.
FSLogix\Profile Containers\Delete local profile when FSLogix Profile should apply.Enabled.
Производит удаление локального профиля.
FSLogix\Profile Containers\Size in MBsEnabled. Установите максимальный размер профиля. По умолчанию 30Gb.
FSLogix\Profile Containers\Advanced\Provide RedirXML file to customize redirectionsEnabled. \\ADDS\Redirections
Путь конфигурационного файла.
FSLogix\Profile Containers\Advanced\Prevent login with temporary profileEnabled. Предотвращает создание Temp профиля.
FSLogix\Profile Containers\Advanced\Prevent login with failureEnabled. Предотвращает вход пользователя в систему в случае сбоя при подключении контейнера FSLogix.
FSLogix\Profile Containers\Container and Directory Naming\Virtual disk typeEnabled. Выбираем VHDX диск, вместо VHD по умолчанию.
FSLogix\Profile Containers\Container and Directory Naming\Swap directory name componentsEnabled. Косметическая правка, папка с профилем по умолчанию имеет имя SID_%username%, делаем обратно %username%_SID, считаю так более удобней.

4. Перезагружаем RDSH сервера. Видим в реестре, что политика применила изменения. Тестируем.

5. Вход произведен успешно. Профиль прицепился.

6. На условном нашем файловом сервере появились профили:

7. Так же создалась структура папок для логов:

Конфигурационный файл Redirections.xml

Мы сконфигурировали путь для этого файла: \\ADDS\Redirections\

Теперь необходимо положить туда этот файл и пользоваться его преимуществом.

Файл redirections.xml используется для управления тем, какие папки перенаправляются из контейнера профиля на диск C:\ 
Он также может, при желании, синхронизировать содержимое этих папок с контейнером профиля и из него при выходе пользователя из системы и входе в систему соответственно.

Более подробно можно ознакомиться здесь: Using Redirections.xml to configure what to copy to a profile with FSLogix

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

<?xml version="1.0"?>
<FrxProfileFolderRedirection ExcludeCommonFolders="0">
	<Excludes>
		<Exclude Copy="0">AppData\LocalLow\</Exclude>
		<Exclude Copy="0">AppData\Local\Packages\</Exclude>
		<Exclude Copy="0">AppData\Local\Adobe\</Exclude>
		<Exclude Copy="0">AppData\Local\Temp\</Exclude>
		<Exclude Copy="0">AppData\Local\Diagnostics\</Exclude>
		<Exclude Copy="0">AppData\Local\Comms\</Exclude>
		<Exclude Copy="0">AppData\Local\Google\Chrome\User Data\Default\Cache\</Exclude>
		<Exclude Copy="0">AppData\Local\Google\Chrome\User Data\Default\Cached Theme Image\</Exclude>
		<Exclude Copy="0">AppData\Local\Google\Chrome\User Data\Default\JumpListIcons\</Exclude>
		<Exclude Copy="0">AppData\Local\Google\Chrome\User Data\Default\JumpListIconsOld\</Exclude>
		<Exclude Copy="0">AppData\Local\Google\Chrome\User Data\Default\Storage\</Exclude>
		<Exclude Copy="0">AppData\Local\Google\Chrome\User Data\Default\Local Storage\</Exclude>
		<Exclude Copy="0">AppData\Local\Google\Chrome\User Data\Default\SessionStorage\</Exclude>
		<Exclude Copy="0">AppData\Local\Google\Chrome\User Data\Default\Media Cache\</Exclude>
		<Exclude Copy="0">AppData\Local\Google\Chrome\User Data\Default\GPUCache\</Exclude>
		<Exclude Copy="0">AppData\Local\Google\Chrome\User Data\Default\WebApplications\</Exclude>
		<Exclude Copy="0">AppData\Local\Google\Chrome\User Data\Default\SyncData\</Exclude>
		<Exclude Copy="0">AppData\Local\Google\Chrome\User Data\Default\SyncDataBackup\</Exclude>
		<Exclude Copy="0">AppData\Local\Google\Chrome\User Data\Default\Pepper Data\Shockwave Flash\CacheWriteableAdobeRoot\</Exclude>
		<Exclude Copy="0">AppData\Local\Google\Chrome\User Data\WidevineCDM\</Exclude>
		<Exclude Copy="0">AppData\Local\Google\Chrome\User Data\EVWhitelist\</Exclude>
		<Exclude Copy="0">AppData\Local\Google\Chrome\User Data\pnacl\</Exclude>
		<Exclude Copy="0">AppData\Local\Google\Chrome\User Data\recovery\</Exclude>
		<Exclude Copy="0">AppData\Local\Google\Chrome\User Data\ShaderCache\</Exclude>
		<Exclude Copy="0">AppData\Local\Google\Chrome\User Data\SwReporter\</Exclude>
		<Exclude Copy="0">AppData\Local\Google\Chrome\User Data\SwiftShader\</Exclude>
		<Exclude Copy="0">AppData\Local\Google\Chrome\User Data\PepperFlash\</Exclude>
		<Exclude Copy="0">AppData\Local\Microsoft\TokenBroker\Cache\</Exclude>
		<Exclude Copy="0">AppData\Local\Microsoft\Notifications\</Exclude>
		<Exclude Copy="0">AppData\Local\Microsoft\Internet Explorer\DOMStore\</Exclude>
		<Exclude Copy="0">AppData\Local\Microsoft\Internet Explorer\Recovery\</Exclude>
		<Exclude Copy="0">AppData\Local\Microsoft\MSOIdentityCRL\Tracing\</Exclude>
		<Exclude Copy="0">AppData\Local\Microsoft\Messenger\</Exclude>
		<Exclude Copy="0">AppData\Local\Microsoft\UEV\</Exclude>
		<Exclude Copy="0">AppData\Local\Microsoft\Windows\Application Shortcuts\</Exclude>
		<Exclude Copy="0">AppData\Local\Microsoft\Windows\Mail\</Exclude>
		<Exclude Copy="0">AppData\Local\Microsoft\Windows\WebCache\</Exclude>
		<Exclude Copy="0">AppData\Local\Microsoft\Windows\WebCache.old\</Exclude>
		<Exclude Copy="0">AppData\Local\Microsoft\Windows\AppCache\</Exclude>
		<Exclude Copy="0">AppData\Local\Microsoft\Windows\Explorer\</Exclude>
		<Exclude Copy="0">AppData\Local\Microsoft\Windows\GameExplorer\</Exclude>
		<Exclude Copy="0">AppData\Local\Microsoft\Windows\DNTException\</Exclude>
		<Exclude Copy="0">AppData\Local\Microsoft\Windows\IECompatCache\</Exclude>
		<Exclude Copy="0">AppData\Local\Microsoft\Windows\iecompatuaCache\</Exclude>
		<Exclude Copy="0">AppData\Local\Microsoft\Windows\Notifications\</Exclude>
		<Exclude Copy="0">AppData\Local\Microsoft\Windows\PRICache\</Exclude>
		<Exclude Copy="0">AppData\Local\Microsoft\Windows\PrivacIE\</Exclude>
		<Exclude Copy="0">AppData\Local\Microsoft\Windows\RoamingTiles\</Exclude>
		<Exclude Copy="0">AppData\Local\Microsoft\Windows\SchCache\</Exclude>
		<Exclude Copy="0">AppData\Local\Microsoft\Windows\Temporary Internet Files\</Exclude>
	</Excludes>
</FrxProfileFolderRedirection>

Исключение администраторов из группы FSLogix.

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

  • Открываем групповую политику и переходим в раздел: Computer Configuration->Windows Settings->Security Settings->Restricted Groups->Add Group-> Задаем имя: FSLogix Profile Exclude List и добавляем группу администраторы домена.
  • Так же есть группа включения: FSLogix Profile Include List. По умолчанию Все\Everyone. Можете переназначить на пользователей домена.

Критическая проблема FSLogix.

И вроде бы всё отлично, но вот почему-то Microsoft не может иногда что-то довести до ума или может годами делать исправления. Это коснулось и FSLogix.

Последний баг: Периодически возникает сбой при входе:The Group Policy Client service failed the sign-in. Access is denied.

Давняя и большая тема на technet посвященная данной ошибке: sLogix – Unclean logoff causing locked files until server reboot

RobertBerggren, дает временное решение и говорит, что выпуск новой версии FSLogix в ноябре решит это.

RobertBerggren-1701 asnwered

Необходимо найти сервер, на котором осталась папка local_username затронутого пользователя, добраться в реестре до:

HHKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileService\References\SID

И установить значение:

REG_BINARY: RefCount
Value: 00 00 00 00

После этого пользователь может успешно снова зайти.

UPD: 18.01.2022. Здесь я предлагаю решение с помощью PowerShell: https://techcommunity.microsoft.com/t5/fslogix-blog/fslogix-2105-hf-01-2-9-7979-62170-released/ba-p/2948136

Ну а тут: https://techcommunity.microsoft.com/t5/azure-virtual-desktop-feedback/idb-p/AzureVirtualDesktop/status-key/AzureVirtualDesktop_Planned багу признали и обещают исправить в следующей версии.

UPD: 1/25/2022 Исправлено: The FSLogix 2201 Public Preview is now available

FSLogix now correctly handles cases where the Windows Profile Service refCount registry value is set to an unexpected value.

Конвертация профилей UDP в FSLogix.

Моя ферма каждый день насчитывает примерно 400~ активных сеансов. Профилей около 500.

Конвертацию я начал с 9 вечера. До 8 утра успешно конвертировались все 500 профилей.

Скрипт который я использовал: convert-udp-fslogix

В интернете можно найти и аналоги, но этот быстрый, простой, удобный и делает исключения, которые не нужно переносить:

$Excludes = @("Profile", "Uvhd-Binding", "`$RECYCLE.BIN", "System Volume Information")

Ключом $updroot мы указываем путь до UDP профилей.
Ключом $fslogixroot указываем новое расположение профилей FSLogix.

На выходе получим папки с профилями SID_%username%, но как выше мы помним, мы поменяли политикой имя папки на %username%_SID, потому после конвертации и отдельным скриптом делаю переименование:

$path = '\\ADDS\Profiles'
 
(Get-ChildItem $path -dir).name | ForEach{sl $path}{
    $newName = $_ -replace "(s-.+?\d)_(.+)", '$2_$1'
    if($_ -ne $newName){Rename-Item -li $_ $newName}
}

Хотя то же самое можно поменять и в самом скрипте.

Заключение.

Если определяться, какую систему выбирать для профилей, я остановлюсь на FSLogix. На системе, которая поддерживается, дорабатывается и имеет расширенные настройки.

Да, как я выше написал, есть один неприятный баг( Хотя можно засунуть скрипт в планировщик и спать спокойно, у меня он уже оттестирован ), но, даже с моим количеством пользователей, я получаю пару заявок в неделю, а то и две, на проблемы со входом, потому с этим можно жить с учетом всех плюсов системы ну и дай Бог, Microsoft исправит и эту проблему.

Спасибо, что дочитали. В следующей статье мы будем разворачивать высокую доступность.

С Уважением, Андрей.
Mihalevskiy.com
Добавить комментарий

  1. Андрей

    Добрый день!
    Подскажите, пожалуйста, можно ли сделать разные размеры профиля для разных групп?
    Пробовал делать групповой политикой, привязывая к отдельной группе пользователей разные настройки размера профиля, но почему-то используется минимальный размер.
    Хочется сделать разделение на 15-30-50 гб профиля, пока получается только 15.
    Искал инструкции, но ничего подобного не нашел.

    Ответить
    1. mihalevskiy автор

      Здравствуйте. FSLogix не имеет групповых политик для пользователя. Есть глобальная настройка для всех.

      FSLogix\Profile Containers\Size in MBs

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

      https://social.msdn.microsoft.com/Forums/en-US/f0ecc72e-78e8-48a9-99e6-e159f87f2cef/how-to-resize-the-current-vhdx-in-fslogix?forum=FSLogix

      Ответить
      1. Андрей

        Спасибо за ответ, это немножко не то что мне нужно.
        Нашел как делать, через ключи реестра и SID (группы или пользователя). В принципе все просто и логично. Минус в том что если сперва у пользователя был профиль в 30 гб и его переместили в группу 15 гб, то в управлении дисками останется 30, хотя в реестре будет 15.
        https://jkindon.com/fslogix-and-per-user-group-object-specific-configurations/

        Ответить
  2. n0name

    Добрый День а как можно прикрутить диск пользователя когда он не онлайн?(например чтобы добавить ярлыки или файлы)
    Также интересует поведения принтеров в профиле пользователя(в том числе установленного по умолчанию) подключенных с принтсервера и почтовых профилей(outlook/thunderbird)

    Ответить
    1. mihalevskiy автор

      Здравствуйте. По диску просто правой клавишей мышки – подключить. Он добавиться в систему. Далее в свойствах диска, в безопасности добавьте себе права. И Вы получите полный доступ к диску.

      По принтерам мне вопрос не потянет. Все работает так же, как если бы это был обычный локальный профиль.

      Настройки Outlook/Thunderbird естественно сохраняются.

      Ответить
      1. n0name

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

        Ответить
        1. mihalevskiy автор

          diskmgmt.msc, инициализируйте, дайте букву. Увидите его раздел, после выдайте себе права.

          Ответить
        2. mihalevskiy автор

          diskmgmt.msc, инициализируйте, дайте букву. Увидите его раздел, после выдайте себе права.

          Ответить
  3. Кирилл

    Доброго дня!
    Ну все хорошо в этом FSLogix. Воспользовался почти всеми Вашими советами, настроил политики. Огромная благодарность за Ваш труд! Все работает как часы, кроме странного поведения самой терминальной фермы, вернее балансировщика. В ферме 2 терминальных сервера и брокер отдельной машиной. Балансировка 50 на 50. Пользователи подключаются через брокера, я им скачал ярлык из Work Resources. Балансировка работает четко. Но…… Если пользователь закрыл окно RDP сеанса (не отключился, а именно закрыл) и сеанс остался разъединенным (но остался), тогда при подключении через брокера, брокер может попытаться залогинить пользователя на другой терминальник из коллекции…. Результат предсказуем… VHDX не может одновременно быть примонтированным на двух серверах. Пользователь не может залогиниться… висит на экране подключения профиля FSLogix… Если зайти под админом и закрыть сеанс, то он моментально залетает. Где я только уже не читал. Не могу найти параметр, который заставил бы ферму логинить пользователя в существующий сеанс. Можно выставить ограничение разъединенного сеанса в настройках коллекции хоть 1 минуту… Можно сделать скрипт, который пользователи смогут запускать, чтобы сбросить свой сеанс и не тревожить админа… да, но есть пользователи, которые уходя домой просто закрывают окошко RDP сеанса на рабочем компе, выключают его, идут домой, подключаются по VPN и хотят поработать со своим сеансом, где в это время, например запущена обработка 1С (многочасовая) или пересчет итогов или еще что-то. Может Вы подскажете, как заставить ферму логинить пользователя в имеющийся сеанс? Терминальная ферма Windows Server 2019.
    Заранее благодарен за ответ!

    Ответить
    1. mihalevskiy автор

      Здравствуйте. Где-то у Вас ошибка в проектировании. Такого поведения не должно быть. Вы ведь читали с введения настройки терминальной фермы мои статьи ?

      Если да и у Вас такая проблема, потребуется диагностика.

      Покажите вывод для начала Get-RDServer. А так же откройте ярлык рдп с клиента текстовым редактором и покажи его содержимое. Можете добавиться в телеграм канал для удобства. Я Вам там помогу.

      Ответить