Внедряем User Profile Disks в Windows Server RDS

User Profile Disks ( UPD , диски профилей пользователей) позволяет хранить профиль каждого пользователей Remote Desktop Services ( %USERPROFILE% ) в отдельном виртуальном VHDX диске. Такой профиль подключается при входе пользователя в Windows и отключается при выходе (с сохранением изменений в профиле). User Profile Disks можно хранить на внешнем файловом ресурсе, благодаря чему пользователь может получить доступ к своему окружению (профили) при входе на любой сервер фермы RDS . UPD диски представляют собой альтернативу использованию технологий перемещаемых профилей (roaming profile) и перенаправления папок (folder redirection) в терминальных сценариях RDS.

В этой статье мы рассмотрим особенности настроить и использовать профили User Profile Disks на серверах с ролью Remote Desktop Services на Windows Server 2022/2019/2016/2012R2.

Настройка User Profile Disks в Windows Server RDS

Создайте общую сетевую папку для хранения файлов профилей UPD. Эту папку нужно разместить на любом файловом сервере за пределами фермы RDS ( рекомендуем расположить сетевую папку на кластере для обеспечения высокой доступности UPD профилей). В нашем примере, путь к такому каталогу будет выглядеть так: \srv01RDSProfiles .

Создайте в AD группу безопасности, в которую нужно включить все хосты в вашей RDS коллекции. МОжете создать группу с помощью графической консоли ADUC или с помощью PowerShell командлетов из модуля Active Directory for Windows PowerShell :
New-ADGroup mskRDSHCollection1 -path "OU=Groups,OU=MSK,OU=RU,DC=remontka,DC=loc" -GroupScope Domain -PassThru –Verbose
Add-AdGroupMember -Identity mskRDSHCollection1 -Members msk-rds1$, msk-rds2$, msk-rds3$

Чтобы добавить компьютеры в группу AD , нужно добавить $ в конце имени компьютера (это атрибут SAMAccountName).

Теперь предоставьте права Full Control на папку \srv01RDSProfiles для группы mskRDSHCollection1.

Настройки доступа к сетевой папке для хранения UPD профилей пользователей

Вы можете включить User Profile Disks в настройках коллекций Remote Desktop при ее создании. Если коллекция уже создана, найдите ее в консоли Server Manager и в верхнем левом углу выберите Tasks -> Edit Properties .

Настройка параметров коллекции RDS

Затем в разделе User Profile Disks включите опцию Enable user profile disks , укажите к созданной ранее сетевой папке ( \srv01RDSProfiles ) и задайте максимальный размер диска с профилем (пусть это будет 7 Гб). Сохраните изменения.

Включить User Profile Disks для коллекции RDS

Допустимо использовать пространство имен DFS для хранения UPD профилей DFS сервера. На DFS хостах нужно использовать Windows Server 2012 R2 или более новые версии. При использовании предыдущих версий Windows Server вы получите ошибку:

Unable to enable user disks on rVHDShare. Could not create template VHD.  Error Message: The network location "\remontka.comnamespaceUPD1" is not available.

Вы можете проверить, что UPD включен для коллекции RDS и получить путь к каталогу, в котором хранятся профиля с помощью команды:

Get-RDSessionCollectionConfiguration -CollectionName mskCorpApp1 –UserProfileDisk

Get-RDSessionCollectionConfiguration: PowerShell настройки UserProfileDisk

Совет . Для каждой RDS коллекции создается только один vhdx файл с UPD профилем пользователя. Если пользователь подключается к хостам из двух разных RDS коллекций, для каждой из них будет создан отдельный vhdx файл.

По умолчанию UPD диск хранит все содержимое профиля пользователя. Вы можете исключить определенные папки из списка синхронизируемых каталогов. Если каталог исключен из профиля, изменения в нем не будут сохраняться в VHDX диске в сетевом каталоге. Доступные две опции:

  • Store all user settings and data on the user profile disk
  • Store only the following folders in the user profile disk

исключить некоторые папки пользователя из перемещаемого профиля UPD

При использовании RDS с UPD на Windows Server 2019/2016 со временем вы можете столкнуться со снижением производительности серверов, появления черного экрана при входе в RDP . Подробно проблема описана здесь . Рекомендуем сразу включить на всех RDS хостах параметр реестра DeleteUserAppContainersOnLogoff :

New-ItemProperty -Path “HKLM:SYSTEMCurrentControlSetServicesSharedAccessParametersFirewallPolicy” -Type DWord -Path -Name DeleteUserAppContainersOnLogoff -Value 1

VHDX файлы с UPD профилями пользователей RDS

После того, как вы изменили настройки коллекции и включили UPD, в целевом каталоге будет создан файл UVHD-template.vhdx .

Этот файл представляет собой шаблон виртуального диска с профилем пользователя. Когда новый пользователей подключается к серверу RDS по RDP, этот шаблон копируется и переименовывается в vhdx файл, содержащий в имени SID пользователя. Для каждого пользователя создается отдельный VHDX файл.

Совет . Информацию о событиях входа пользователей можно отслеживать в журнале Event Viewer -> Application (источник User Profile Service) и Applications and Services Logs -> -Microsoft -> Windows -> User Profile Service -> Operational.

UVHD файлы типа vhdx содержат профили пользователей UPD

Чтобы понять, какому пользователю принадлежит VHDX файл, нужно сопоставить имя UPD файла с именем пользователя. Можно вручную преобразовать SID в имя учетной записи с помощью командлета Get-ADUser :

Get-ADUser -Identity S-1-5-21-305647651-3952524288-2944781117-23711116

Или воспользуйтесь скриптом ShowUPDFolderDetails.ps1, который выводит имена UPD файлов и их владельцев:

$UPDShare = "\srv01RDSProfiles"
$UserProfiles = @()
$fc = new-object -com scripting.filesystemobject
$folder = $fc.getfolder($UPDShare)
"Username,SiD" >> export.csv
foreach ($i in $folder.files)
{
$sid = $i.Name
$sid = $sid.Substring(5,$sid.Length-10)
if ($sid -ne "template")
{
$securityidentifier = new-object security.principal.securityidentifier $sid
$user = ( $securityidentifier.translate( [security.principal.ntaccount] ) )
$UserProfile = New-Object PSObject -Property @{
UserName = $user
UPDFile=$i.Name
}
$UserProfiles += $UserProfile
}
}
$UserProfiles| select UserName, UPDFile

PowerShell скрипт - получить имена владельцев UVHD дисков в каталоге с UPD

Т.к. UPD профиль представляет собой обычный файл виртуального диска в формате VHDX, вы можете смонтировать его и просмотреть содержимое. Щелкните правой кнопкой по файлу и выберите Mount .

смонтировать UPD виртуальный диск пользователя

Как вы видите, содержимое VHDX диска представляет набор каталогов и файлов обычного профиля пользователя.

Содержимое диска с профилем

UPD профиль может монтируется в монопольном режиме. Это значит, что, если профиль пользователя сейчас подключен в RDS сессии пользователя или смонтирован вручную, вы не сможете открыть его с ошибкой: The file couldn’t be mounted because it’s in use.

На сервере RD Session Host профиль пользователя в файле VHDX монтируется в каталог C:users<username> и выглядит таким образом:

пользователь вошел в windows с UPD профилем

Обратите внимание, что UPD диск привязан к версии Windows Server на RDS хосте. Вы не сможете перенести UPD профиль пользователя с RDS сервера с одной версии Windows Server на другую.

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

Если в Windows уже есть каталог с профилем пользователя, каталог со старым профилем переименовывается в формат <username>-BACKUP-<number> .

VHDX диск монтируется при старте сессии пользователя на VDI или RDS сервере. Каждый UPD профиль монтируется в каталог C:Users. Список смонтированных VHDX дисков с профилями отображается в консоли Disk Management.

В какую папку смонтирован профиль пользователя UPD

Как расширить/сжать диск User Profile Disk с помощью PowerShell?

Вы можете расширить виртуальный vhdx диск с UPD профилем конкретного пользователя с помощью PowerShell командлета Resize-VirtualDisk из модуля Hyper-V (на компьютере должны быть установлены компоненты управления Hyper-V : Enable-WindowsOptionalFeature -Online –FeatureName Microsoft-Hyper-V-Management-Clients )

Net use U: \srv01RDSProfiles
Resize-VHD -Path u:UVHD-<SID>.vhdx -SizeBytes 30GB
Net use U: /delete

Теперь нужно расширить раздел из графического интерфейса консоли Управления дисками (Disk Manager). Действие –> Подключить виртуальный жесткий диск -> Расширить том.

расширить диск User Profile Disk

Либо воспользуйтесь таким PowesShell скриптом:
<#
.Synopsis
This script extend size of VHDX file and resize the disk partition to Max
#>
Param(
[Parameter(Mandatory=$true,ValueFromPipeline=$true)]
[alias("Path")]
[string]$vhdxFile,
[Parameter(Mandatory=$true,ValueFromPipeline=$true)]
[alias("Size")]
[int64]$vhdxNewSize
)
begin{
try {
Mount-VHD -Path $vhdxFile -ErrorAction Stop
}
catch {
Write-Error "File $vhdxFile is busy"
Break
}
$vhdx = Get-VHD -Path $vhdxFile
if ($vhdx.Size -ge $vhdxNewSize){
Write-Warning "File $vhdxFile already have this size!"
$vhdx | Dismount-VHD
Break
}
}
process{
Dismount-VHD -Path $vhdxFile
Resize-VHD -Path $vhdxFile -SizeBytes $vhdxNewSize
$vhdxxpart = Mount-VHD -Path $vhdxFile -NoDriveLetter -Passthru | Get-Disk | Get-Partition
$partsize = $vhdxxpart | Get-PartitionSupportedSize
$vhdxxpart | Resize-Partition -Size $partsize.SizeMax
}
end{
Dismount-VHD -Path $vhdxFile
}

Обратите внимание, что нельзя расширить UPD диск пользователя с активной RDS сессией.

Чтобы уменьшить размер файла UPD (при условии, что вы удалили данные пользователя внутри vhdx файла и размер файлов на диске меньше выделенного ему размера) можно воспользоваться командами:

resize-VHD \srv01RDSProfilesUVHD-<SID>.vhdx –ToMinimumSize

А затем:

Optimize-vhd -path \srv01RDSProfilesUVHD-<SID>.vhdx -mode full

Временный профиль при использовании User Profile Disk в RDS

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

We can’t sign in to your account._x000D_You’ve have been signed in with a temporary profile._x000D_You can’t access your files, and files created in this profile will be deleted when you sign out. To fix this, sigh out and try signing later._x000D_

Вы вошли в Windows Server с временным профилем

При этом для пользователя создается временный профиль:

Event ID 1511_x000D_Source: User Profile Service_x000D_Windows cannot find the local profile and is logging you on with a temporary profile. Changes you make to this profile will be lost when you log off._x000D_

Чаще всего это связано с тем, что в предыдущей сессии VHDX файл пользователя не был освобожден. Вы можете найти RDSH хост, на котором сейчас подключен VHDX диск пользователя. Вы можете использовать такой PowerShell скрипт (запускается на сервере с ролью RD Connection Broker )

$UserToFind = "a.novak"
$User = $env:USERDOMAIN + '' + $UserToFind
$RDCollection = Get-RDSessionCollection | where {$_.ResourceType -eq 'Remote Desktop'}
$RDHosts = Get-RDSessionHost -CollectionName $RDCollection.CollectionName | select SessionHost
$Array = Invoke-Command -ComputerName $RDHosts.SessionHost -ScriptBlock { Get-Disk | select Location,DiskNumber | where {$_.Location -notmatch "Integrated"} }
foreach ($VHD in $Array){
$DiskID = (Get-Item $VHD.Location).Name.Substring(5).Split(".")[0]
$objSID = New-Object System.Security.Principal.SecurityIdentifier ($DiskID)
$objUser = $objSID.Translate( [System.Security.Principal.NTAccount])
if ($objUser.Value -eq $User){
$result = "$($objUser.Value) disk number $($VHD.DiskNumber) on $($VHD.PSComputername)"
}else{
$result = "$($User) - no active RSH sessions were found."
}
}
$result

PowerShell: найти RDSH хост, где подключен UPD профиль пользователя

Можно удаленно отмонтировать UPD диск командой:

Invoke-Command -ComputerName $VHD.PSComputername -ScriptBlock { Dismount-VHD -DiskNumber $VHD.DiskNumber }

Чтобы уменьшить количество проблем с временными профилями на RDS, рекомендуем настроить таймауты для RDS сессий пользователей (установите отключение через 2-4 часа для неактивных сессий). Также вы можете включить параметр GPO, который запрещает создание временных профилей: Computer Configuration -> Administrative Templates -> System -> User profiles, включите параметр Do not log users on with temporary profiles .

GPO: не создавать временные профили для пользователей

В случае недоступности папки с профилями этот параметр может периодически вызывать ошибку Службе профилей пользователей не удалось войти в систему .

После освобождении VHDX диска администратору нужно вручную удалить временный профиль пользователя:

  1. Удалите ветки с SID пользователя в разделе реестра HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionProfileList . В этом примере есть две ветки, одна из которых с суффиксом .bak ); очистка временных профилей в реестре Windows NTCurrentVersionProfileList
  2. Удалите TEMP папку пользователя из каталога C:Users .
    Подробнее об удалении профилей пользователей в Windows в статье по ссылке .
У технологии User Profile Disk, появившейся еще в Windows Server 2012 есть несколько недостатков. На данный момент Microsoft рекомендует использовать более новую технологию контейнеров FSLogix для хранения профилей пользователей RDS .

В этой статье мы рассмотрели, как настроить профили User Profile Disks в RDS на Windows Server. Настройка UPD намного проще чем процесс настройки перемещаемых профилей и перенаправляемых папок. Диски привязаны к коллекции RDS и не могут повредиться при попытке совместного использования профиля несколькими терминальными серверами (в отличии от обычных профилей). Диски профилей пользователей могут храниться на SMB шарах, CSV, SOFS, в SAN или на локальных дисках.

EnglishRussianUkrainian