Migrar perfiles UPD (User Profile Disks) a FSLogix
Hoy vamos a enseñaros cómo podemos migrar perfiles UPD de una granja RDS a FSLogix. El otro día os expliqué cómo crear una granja RDS desde cero, en la que montamos perfiles UPD (User Profile Disks).
Si conocéis algo de las tecnologías de perfilado que se usan en Citrix, VMware, Microsoft,…UPD genera como FSLogix discos VHDX de cada perfil de usuario. En alguna entrada ya os hablé de las ventajas de FSLogix, ahora voy a intentar compararlos y explicar qué mejora con respecto a UPD.
¿Diferencia entre UPD y FSLogix?
Microsoft introdujo UPD en Windows Server 2012, se genera un disco VHD con todo el perfil del usuario. Se guarda en una ubicación de red, y el usuario puede moverse con su sesión sin problemas.
En la práctica parece lo mismo que FSLogix, la diferencia fundamental es que tiene ciertas limitaciones, que FSLogix no tiene. ¿Cuales son esas diferencias?
En la tecnología original de Microsoft (FSlogix también es de Microsoft) se utilizan enlaces simbólicos, que os sonarán de Linux. Esto es un problema para aplicativos como Teams entre otros, que necesitan estar instalados localmente.
Tampoco trabaja con multisesión y puede generar perfiles inconsistentes o con errores. No ayuda tampoco con Windows Search o Outlook Search.
FSLogix mejora todo esto, y además se añade el soporte a Office 365, que es la tendencia actual de toda media o gran empresa.
Migración perfiles UPD a FSLogix
Como ya tendréis claro. A parte de un script que nos permita hacer esto, deberemos planificar bien los pasos. Quiero reutilizar los servidores RDS Hosts que ahora mismo tengo en mi LAB dando servicio para no tener que reinstalar la plataforma:
- No debe haber usuarios conectados, ya que necesitamos que el VHDX de UPD no esté en uso.
- Instalación agentes FSlogix en máquinas virtuales implicadas. RD Hosts dentro de la granja RDS
Descarga FSLOGIX:
https://docs.microsoft.com/en-us/fslogix/install-ht
Se instala en el siguiente orden:
1.- FSLogixAppsSetup
2.- FSLogixAppsRuleEditorSetup
3.- FSLogixAppsJavaRuleEditorSetup
La desinstalación sería al contrario. Los instalables no tienen grandes opciones, pulsamos Install y suficiente para cada uno. Sin reinicios de sistema operativo:
- Cargar los ADMX en directorio activo
Los fichero admx y adml se encuentran en el fichero ZIP que se descarga con los agentes:
Hay que copiarlos a la siguiente ruta:
\\negu.local\SYSVOL\negu.local\Policies\PolicyDefinitions
Si no existe la carpeta PolicyDefinitions hay que crearla. Así como la subcarpeta en-US. Dejaremos el ADMX en la raíz y el ADML en la subcarpeta:
- Crear una GPO para Fslogix:
Veremos las settings de Fslogix si se ha cargado bien la plantilla:
Pasaremos los siguientes parámetros, que se aplican sobre Equipos, y no sobre Usuarios, así que deberemos planificar la migración con cuidado:
- Logs GPO, deshabilitar al terminar la migración y ver la estabilidad para acelerar logons y close sessions
- Crear un recurso paralelo para los archivos
Crearemos un par de carpetas, una para el fichero de exclusiones y otra para los logs:
Permisos SHARE:
Permisos NTFS:
- Las colecciones RDS tienen configurados los perfiles de UPD:
Si tienen la opción “Store all user setting and data on the user profile disk”:
Veremos localmente los perfiles como un enlace simbólico:
En cambio si están configurados como “Store only the following on the user profile disk”
El icono cambia:
- Ahora pasaríamos el script de migración como administrador:
FUENTE SCRIPT: https://www.beckmann.ch/blog/2019/05/17/migrate-user-profile-disk-to-fslogix-profile-disk/?lang=en
Le he hecho pequeños retoques, como saber el SID de todos los VHDX originales para luego poder borrarlos si quiero:
*** IMPORTANTE: Para mapear el VHDX original el usuario que lanza el script debe tener permisos de Full Control sobre los VHDX ***
# Empezamos a dejar log:
Start-Transcript ("c:\temp\MiLog{0:yyyyMMdd-HHmm}.txt" -f (Get-Date))
#Definimos las rutas de origen y destino
$UPDPath = '\\negufiles01\perfiles'
$NewProfilePath = '\\negufiles01\fslogix'
#Omito esta variable
#$DiskProfileFolder = 'Profile'
#Define la ruta para la lista de usuarios
$UserListe = 'C:\temp\UserMigrate.txt'
$Users = Get-Content $UserListe
foreach ($U in $Users){
# Valor del usuario de SAM
$SAM = $U
# Leemos el SID del usuario segun su SAM
$SID = (New-Object System.Security.Principal.NTAccount($SAM)).translate([System.Security.Principal.SecurityIdentifier]).Value
# Definimos la ruta al VHDX original en UPD
$UPD = Join-Path -Path $UPDPath -ChildPath ('UVHD-' + $SID + '.vhdx')
Write-Output "Start with User: $SAM"
If (Test-Path $UPD){
# Si UPD existe definimos la ruta
#$FSLPath = Join-Path -Path $NewProfilePath -ChildPath ($SAM + '_' + $SID)
$FSLPath = Join-Path -Path $NewProfilePath -ChildPath ($SAM)
# Creamos la ruta de destino
If (!(Test-Path $FSLPath)){
Write-Output "Create Folder: $FSLPath"
#New-Item -Path $NewProfilePath -Name ($SAM + '_' + $SID) -ItemType Directory | Out-Null
New-Item -Path $NewProfilePath -Name $SAM -ItemType Directory | Out-Null
# Log con nombre de usuario + SID
Add-Content $NewProfilePath\Logs\VHDX_Migrados.log "UVHD-$SID.vhdx"
}
# Damos permisos a la carpeta de destino
& icacls $FSLPath /setowner "$env:userdomain\$sam" /T /C | Out-Null
& icacls $FSLPath /grant $env:userdomain\$sam:
(OI)
(CI)F /T | Out-Null
# Definimos la ruta de destino
# $FSLDisk = Join-Path -Path $FSLPath -ChildPath ('Profile_' + $SAM + '.vhdx')
$FSLDisk = Join-Path -Path $FSLPath -ChildPath ($SAM + '.vhdx')
# Copiamos el perfile al nuevo destino
Write-Output "Copy UPD: $UPD"
Copy-Item -Path $UPD -Destination $FSLDisk | Out-Null
# Montamos la imagen del disco VHDX
Mount-DiskImage -ImagePath $FSLDisk
# Definimos la letra para el mapeo
$DriveLetter = (Get-DiskImage -ImagePath $FSLDisk | Get-Disk | Get-Partition).DriveLetter
$MountPoint = ($DriveLetter + ':\')
# Definimos la ruta del disco del perfil, la cambio del original para que se quede en el raiz
#$DiskProfilePath = Join-Path -Path $MountPoint -ChildPath $DiskProfileFolder
$DiskProfilePath = Join-Path -Path $MountPoint -ChildPath '\'
$RECYCLE.BIN","System Volume Information")
# Creamos la ruta para el disco del perfil
If (!(Test-Path $DiskProfilePath)){
Write-Output "Create Folder: $DiskProfilePath"
New-Item $DiskProfilePath -ItemType Directory| Out-Null
}
# Definimos los ficheros y carpetas que NO vamos a copiar
$Excludes = @("Profile","Uvhd-Binding","
# Copiamos el contenido del perfil a la nueva carpeta
$Content = Get-ChildItem $MountPoint -Force
ForEach ($C in $Content){
If ($Excludes -notcontains $C.Name){
Write-Output ('Move: ' + $C.FullName)
Try {
Move-Item $C.FullName -Destination $DiskProfilePath -Force -ErrorAction Stop
} Catch {
Write-Warning "Error: $_"
}
}
}
# Definimos fichero de registro
$regtext = "Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\$SID]
"ProfileImagePath
"="C:\\Users\\$SAM
"
"Flags
"=dword:00000000
"State
"=dword:00000000
"ProfileLoadTimeLow
"=dword:00000000
"ProfileLoadTimeHigh
"=dword:00000000
"RefCount
"=dword:00000000
"RunLogonScriptSync
"=dword:00000001
"
# Creamos la carpeta y la clave de registro
Write-Output "Create Reg: $DiskProfilePath\AppData\Local\FSLogix\ProfileData.reg"
if (!(Test-Path "$DiskProfilePath\AppData\Local\FSLogix")) {
New-Item -Path "$DiskProfilePath\AppData\Local\FSLogix" -ItemType directory | Out-Null
}
if (!(Test-Path "$DiskProfilePath\AppData\Local\FSLogix\ProfileData.reg")) {
$regtext | Out-File "$DiskProfilePath\AppData\Local\FSLogix\ProfileData.reg" -Encoding ascii
}
# Borramos OST, sometimes there is an issue, so you can prevent.
remove-item $DiskProfilePath\AppData\Local\Microsoft\Outlook\*.ost
# Damos un tiempo y desmontamos la imagen del disco
Start-Sleep -Seconds 30
Dismount-DiskImage -ImagePath $FSLDisk
# Borrado disco original
#Dismount-DiskImage -ImagePath $UPD
#del $UPD
}
Write-Output "--------------------------------------------------------------------"
}
# Paramos log
Stop-Transcript
- Deshabilitamos UPD en las colecciones:
- Fichero exclusiones redirections.xml:
1 |
<?xml version="1.0" encoding="UTF-8"?>
<FrxProfileFolderRedirection ExcludeCommonFolders="0">
<Excludes>
<Exclude>AppData\Temp</Exclude>
<Exclude>AppData\Local\Adobe\Acrobat\DC\Cache\ToolsSearchCacheRdr</Exclude>
<Exclude>AppData\Local\Adobe\Acrobat\DC\Cache</Exclude>
<Exclude>AppData\Local\Citrix\SelfService\img</Exclude>
<Exclude>AppData\Local\Comms</Exclude>
<Exclude>AppData\Local\WebEx\wbxcache</Exclude>
<Exclude>AppData\Local\Microsoft\Office\15.0\Lync\Tracing</Exclude>
<Exclude>AppData\Local\Microsoft\OneDrive</Exclude>
<Exclude>AppData\Local\Microsoft\Terminal Server Client</Exclude>
<Exclude>AppData\Local\Microsoft\Messenger</Exclude>
<Exclude>AppData\Local\Microsoft\Office\15.0\OfficeFileCache</Exclude>
<Exclude>AppData\Local\Microsoft\OneNote</Exclude>
<Exclude>AppData\Local\Microsoft\Windows\Cookies</Exclude>
<Exclude>AppData\Local\Mozilla\Firefox\Profiles\mozilla.default\cache2</Exclude>
<Exclude>AppData\Roaming\FSLogix</Exclude>
<Exclude>AppData\Roaming\Sun\Java\Deployment\cache</Exclude>
<Exclude>AppData\Roaming\Sun\Java\Deployment\log</Exclude>
<Exclude>AppData\Roaming\Sun\Java\Deployment\tmp</Exclude>
<Exclude>AppData\Roaming\Citrix\PNAgent\AppCache</Exclude>
<Exclude>AppData\Roaming\Citrix\PNAgent\Icon Cache</Exclude>
<Exclude>AppData\Roaming\Citrix\PNAgent\ResourceCache</Exclude>
<Exclude>AppData\Roaming\Citrix\SelfService\Icons</Exclude>
<Exclude>AppData\Roaming\ICAClient\Cache</Exclude>
<Exclude>AppData\Roaming\Macromedia\Flash Player\#SharedObjects</Exclude>
<Exclude>AppData\Roaming\Macromedia\Flash Player\macromedia.com\support\flashplayer\sys</Exclude>
<Exclude>AppData\Roaming\Microsoft\Document Building Blocks</Exclude>
<Exclude>AppData\Roaming\Mozilla\Firefox\Crash Reports</Exclude>
<Exclude>AppData\Roaming\Mozilla\Firefox\Profiles\mozilla.default\Crashes</Exclude>
<Exclude>AppData\Roaming\Mozilla\Firefox\Profiles\mozilla.default\healthreport</Exclude>
<Exclude>AppData\Roaming\Mozilla\Firefox\Profiles\mozilla.default\indexedDB</Exclude>
<Exclude>AppData\Roaming\Mozilla\Firefox\Profiles\mozilla.default\minidumps</Exclude>
<Exclude>AppData\Roaming\Mozilla\Firefox\Profiles\mozilla.default\saved-telemetry-pings</Exclude>
<Exclude>AppData\Roaming\Mozilla\Firefox\Profiles\mozilla.default\sessionstore-backups</Exclude>
<Exclude>AppData\Roaming\Mozilla\Firefox\Profiles\mozilla.default\storage</Exclude>
<Exclude>AppData\Roaming\Mozilla\Firefox\Profiles\mozilla.default\weave</Exclude>
<Exclude>AppData\Roaming\Mozilla\Firefox\Profiles\mozilla.default\webapps</Exclude>
<Exclude>AppData\Roaming\Microsoft\Windows\Cookies</Exclude>
<Exclude>AppData\Local</Exclude>
<Exclude>AppData\LocalLow</Exclude>
</Excludes>
<Includes>
</Includes>
</FrxProfileFolderRedirection> |
- Forzamos la GPO a los servidores implicados
- Y realizamos las pruebas funcionales. Abrimos sesión:
Creamos ficheros en el perfil:
Cerramos sesión. Comprobamos que genera el VHDX, que se guarda:
Podemos mapear el disco para verificar su contenido:
¿Te ha gustado la entrada SÍGUENOS EN TWITTER?
Te ha gustado la entrada SGUENOS EN TWITTER O INVITANOS A UN CAFE?