Solucionar problemas de perfiles temporales en escritorios remotos RDS/TSE

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

Contexto: error de perfil temporal al iniciar sesión

Por múltiples y, a menudo, desconocidas razones, los usuarios se encuentran conectados a su sesión en un perfil temporal.

profil temporaire

El usuario no puede encontrar su configuración y, en particular, el perfil de Outlook.

No se realiza una copia de seguridad de todo lo que se almacena en la carpeta C:\Users\TEMP cuando cierran la sesión.

Si aplica un GPO de redirección de carpetas (escritorio/documentos…), los archivos y carpetas modificados en él se guardarán.

Solución para solucionar el problema del perfil temporal

La solución es eliminar las claves de registro por .BAK en la siguiente ubicación: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList

Registre clef profil temporaire

En una granja RDS 2012R2, regularmente tenía problemas con 3 usuarios, así que busqué una forma de hacer esta limpieza automáticamente mediante un script usando una tarea programada.

Script de 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 de 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 {}
    }
}

Copie la secuencia de comandos anterior en un archivo con una extensión vbs / ps1 y cree una tarea programada que se ejecute todas las noches en cada host de sesión de escritorio remoto.

El script genera un archivo de registro con claves de registro eliminadas.

Fichier de log

PI: Los errores de perfil temporales pueden deberse a que el cliente RDP de Windows XP no admite el equilibrio automático con el servicio Broker.

Romain Drouche
Romain Drouche
Arquitecto de sistemas | MCSE: Infraestructura básica
Experto en infraestructura de TI con más de 15 años de experiencia en el sector. Actualmente, como Gerente de Proyectos de Sistemas y Redes y experto en Seguridad de Sistemas de Información (ISS), utilizo mi experiencia para garantizar la fiabilidad y seguridad de los entornos tecnológicos.

Deja un comentario