Migration des Profils CITRIX UPM vers FSLOGIX en « oneshot »

Petit partage de mon script powershell qui permet de migrer les profils Citrix UPM vers un conteneur FSLOGIX

Vous souhaitez migrer un « oneshot » vos profils Citrix gérés par UPM vers des profils Citrix géré par FSLOGIX ? Alors ce script est pour vous !

Le script :


#Check le repository des profils Citrix D:\Profils et pour chaque sous répertoire (exemple : D:\Profils\toto) lance la migration
Get-ChildItem -path  D:\Profils |  Where-Object { $_.PSIsContainer } |

ForEach-Object {
#A modifier en fonction des sous répertoires contenant le profil Citrix :
$path = $_.FullName + "\Win2016v6\UPM_Profile"
$sam = $_.Name
$vhdfolder = $_.FullName

#A modifier pour renommer le VHD. Je place le VHD dans le même répertoire parent du profil Utilisateur (exemple : D:\Profils\toto\Profile_toto-Citrix2016.vhdx) :
$vhd = Join-Path $vhdfolder ("Profile_"+$sam+"-Citrix2016"+".vhdx")

#Rapport en cas d'erreur
$file = "D:\Profils\1_rapport.html"

Write-host $_.Name -ForegroundColor Green
Write-Host $path -ForegroundColor Green

#Test si un VHD est déjà présent. Si non, création du VHD + montage. Si oui, montage en T: du VHD. Le check permet de faire une full en journée et le delta la nuit (plus rapide)
if (!(test-path $vhd)) {
@"
create vdisk file=$vhd maximum 8192 type=expandable

sel vdisk file $vhd

attach vdisk

create part prim

select part 1

format fs=ntfs quick

sel vdisk file=$vhd

sel part 1

assign letter=T

"@ | diskpart

Start-Sleep -s 2
#creation répertoire "Profile" dans VHD
New-Item -Path T:\Profile -ItemType directory | Out-Null
start-process icacls "T:\Profile /setowner SYSTEM"
Start-Process icacls -ArgumentList "T:\Profile /inheritance:r"
Start-Process icacls -ArgumentList "T:\Profile /grant SYSTEM`:`(OI`)`(CI`)F"
Start-Process icacls -ArgumentList "T:\Profile /grant Administrateurs`:`(OI`)`(CI`)F"
Start-Process icacls -ArgumentList "T:\Profile /grant $env:userdomain\$sam`:`(OI`)`(CI`)F"

}
else {

@"
sel vdisk file=$vhd

attach vdisk

sel part 1

assign letter=T

"@ | diskpart

}

#Migration du contenu de l'UPM vers le VHD
"Copie de $path vers T:"
$process = (Start-Process -FilePath robocopy -ArgumentList "$path T:\Profile /E /Purge /r:0" -PassThru -Wait)
Write-Output "Processus Robocopy termine avec le code suivant : "$process.ExitCode
if ($process.ExitCode -eq "1" -Or $process.ExitCode -eq "3") {
			Write-host "==Données de $sam Transférées==" -ForegroundColor Green
		}else {
			Add-Content -Path $file -Value @"
Erreur lors de la copie des données de $sam

"@
		}

#Démontage du disk vhd
@"
sel vdisk file=$vhd

detach vdisk
"@ | diskpart


Write-host "===============================" -ForegroundColor Yellow
Write-host "Fin de la création pour $sam" -ForegroundColor Yellow
Write-host "===============================" -ForegroundColor Yellow
Start-Sleep -s 3
}

Explication rapide :

Exemple avec l’utilisateur « toto » :

Le repository du profil Citrix se trouve dans : D:\Profils\toto
Dans son dossier « toto » il y a un sous dossier nommé « Win2016v6 »

Donc : D:\Profils\toto\Win2016v6 correspond à son profil Citrix géré par UPM. Son profil « WINDOWS » est présent à l’intérieur, dans le dossier « UPM_Profile ». Donc le chemin complet de son profil windows est : D:\Profils\toto\Win2016v6\UPM_Profile
Le but étant de copier le contenu du « UPM_Profile » et de le coller dans un conteneur FSLOGIX, le vhdx.
Le conteneur FSLOGIX, via le script, sera créé dans le répertoire : D:\Profils\toto

Quelques points rapides :

  • La migration ne supprime rien du profil UPM (simple copie) donc un retour en arrière est possible.
  • Pensez à modifier les variables : $path $vhdfolder et $vhd si vous souhaitez déplacer le vhd autre part que dans le répertoire parent de l’utilisateur.
  • Laissez bien les « sleep » ainsi que les espaces dans le block script de diskpart.
  • Un fichier de log (basic) est créé et alimenté à chaque fois que robocopy renvoi un code « exit » différent de 1 ou 3. A perfectionner.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *