Résoudre les problèmes de profil temporaire sur les bureaux à distance RDS/TSE

Windows Server 2016Windows Server 2019Windows Server 2022Windows Server 2025

Contexte : erreur de profil de temporaire à l’ouverture de session

Pour des raisons multiples et souvent inconnus, les utilisateurs se retrouvent connectés à leur session sur un profil temporaire.

profil temporaire

L’utilisateur ne retrouve pas ses paramètres et notamment le profil Outlook.

Tout ce qui est stocké dans le dossier C:\Users\TEMP n’est pas sauvegardé à leur fermeture de session.

Si vous appliquez une GPO de redirection de dossier (bureau/documents…), les fichiers et dossiers modifiés dedans seront par contre sauvegardés.

Solution pour résoudre le problème de profil temporaire

La solution est de supprimer les clefs de registre en .BAK à l’emplacement suivant : HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList

Registre clef profil temporaire

Sur une ferme RDS 2012R2, j’avais régulièrement le problème avec 3 utilisateurs et j’ai donc cherché un moyen de faire ce nettoyage automatiquement par script à l’aide d’une tâche planifiée.

Script VBS :

' Repo : https://git.rdr-it.com/root/scripts/-/blob/master/VBS/RDS-temporary-profile-cleaning.vbs

Const ForAppending = 8
Const HKEY_LOCAL_MACHINE = &H80000002

Dim CheminScriptActuel, ScriptFileName, Position, CheminLog

CheminScriptActuel = Left(wscript.scriptfullname,Len(wscript.scriptfullname)-Len(wscript.scriptname)-1)

ScriptFileName = wscript.scriptname
Position = InstrRev(ScriptFileName,".")
if (Position > 0) Then ScriptFileName = Left(ScriptFileName, Position - 1)

CheminLog = CheminScriptActuel & "" & ScriptFileName & "_Log.txt"
strComputer = "."

'On Error Resume Next
Set objRegistry=GetObject("winmgmts:\" & strComputer & "rootdefault:StdRegProv")
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objTextFile = objFSO.OpenTextFile (CheminLog, ForAppending, True)
objTextFile.WriteLine("-------------------------------")
objTextFile.WriteLine("Debut de la suppression des profils temporaires : " & now)
objTextFile.WriteLine("-------------------------------")

strKeyPath = "SOFTWAREMicrosoftWindows NTCurrentVersionProfileList"
objRegistry.EnumKey HKEY_LOCAL_MACHINE, strKeyPath, arrSubkeys
For Each objSubkey In arrSubkeys
  If Instr(UCase(objSubkey),".BAK") Then
    'wscript.echo objsubkey
    'wscript.echo strkeypath & "" & objSubkey
    objTextFile.WriteLine(now & " clé a supprimer détectée : " & strKeyPath & "" & objSubkey)
    Call DeleteRegEntry(HKEY_LOCAL_MACHINE, strKeyPath & "" & objSubkey)

  End if
Next

objTextFile.WriteLine("Fin de la suppression des profils temporaires : " & now)
objTextFile.WriteLine("")
objTextFile.Close 'Fermeture du fichier
Set objTextFile = Nothing 
wscript.quit

Function DeleteRegEntry(sHive, sEnumPath)
  ' Attempt to delete key.  If it fails, start the subkey
  ' enumration process.
  lRC = objRegistry.DeleteKey(sHive, sEnumPath)
  'wscript.echo sHive
  'wscript.echo sEnumPath
  ' The deletion failed, start deleting subkeys.
  If (lRC <> 0) Then

    ' Subkey Enumerator
    On Error Resume Next
    lRC = objRegistry.EnumKey(HKEY_LOCAL_MACHINE, sEnumPath, sNames)
    For Each sKeyName In sNames
      If Err.Number <> 0 Then Exit For
      'wscript.echo sHive, sEnumPath & "" & sKeyName
      lRC = DeleteRegEntry(sHive, sEnumPath & "" & sKeyName)
      objTextFile.WriteLine(now & " Suppression de la sous clé : " & sEnumPath & "" & sKeyName)
    Next

    On Error Goto 0
    ' At this point we should have looped through all subkeys, trying
    ' to delete the registry key again.
    lRC = objRegistry.DeleteKey(sHive, sEnumPath)

  End If

End Function

Script PowerShell

# Chemin du script et du fichier log
$ScriptPath = Split-Path -Parent $MyInvocation.MyCommand.Definition
$ScriptName = [System.IO.Path]::GetFileNameWithoutExtension($MyInvocation.MyCommand.Name)
$LogFile = Join-Path $ScriptPath "$ScriptName`_Log.txt"

# Fonction pour écrire dans le fichier log
function Write-Log {
    param ([string]$message)
    Add-Content -Path $LogFile -Value $message
}

# Écrire en-tête du log
Write-Log "-------------------------------"
Write-Log "Début de la suppression des profils temporaires : $(Get-Date)"
Write-Log "-------------------------------"

# Chemin de la clé de registre contenant les profils utilisateurs
$RegPath = 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList'

# Récupérer les sous-clés
$SubKeys = Get-ChildItem -Path $RegPath -ErrorAction SilentlyContinue

foreach ($Key in $SubKeys) {
    if ($Key.PSChildName -like '*.bak') {
        Write-Log "$(Get-Date) Clé à supprimer détectée : $($Key.Name)"
        Remove-RegistryKeyRecursive -KeyPath $Key.Name
    }
}

Write-Log "Fin de la suppression des profils temporaires : $(Get-Date)"
Write-Log ""

# Fonction pour supprimer une clé de registre et ses sous-clés récursivement
function Remove-RegistryKeyRecursive {
    param ([string]$KeyPath)

    try {
        Remove-Item -Path "Registry::$KeyPath" -Recurse -Force -ErrorAction Stop
    }
    catch {
        # Suppression récursive manuelle si échec
        $SubKeys = Get-ChildItem -Path "Registry::$KeyPath" -ErrorAction SilentlyContinue
        foreach ($SubKey in $SubKeys) {
            Remove-RegistryKeyRecursive -KeyPath $SubKey.PSPath.Replace("Microsoft.PowerShell.Core\Registry::", "")
            Write-Log "$(Get-Date) Suppression de la sous-clé : $($SubKey.Name)"
        }

        # Essayer de supprimer à nouveau la clé principale
        try {
            Remove-Item -Path "Registry::$KeyPath" -Force -ErrorAction Stop
        } catch {}
    }
}

Copier le script ci-dessus dans un fichier avec une extension vbs / ps1 et faire une tache planifiée qui s’exécute toutes les nuits sur chaque hôte de session Bureau à distance.

Le script génère un fichier de log avec les clefs de registres supprimées.

Fichier de log

PI : les erreurs de profil temporaire peuvent être dû au client RDP de Windows XP qui ne supporte le balancement automatique avec le service Broker.

Romain Drouche
Architecte Système | MCSE: Core Infrastructure
Expert en infrastructures IT avec plus de 15 ans d’expérience sur le terrain. Actuellement Chef de projet Systèmes et Réseaux et Référent SSI (Sécurité des Systèmes d’Information), je mets mon expertise au service de la fiabilité et de la sécurité des environnements technologiques.

Laisser un commentaire