Resolução de problemas de perfil temporário em áreas de trabalho remotas RDS/TSE

Windows Server 2022Windows Server 2025

Contexto: Erro temporário de perfil no logon

Por razões diversas e muitas vezes desconhecidas, os utilizadores acabam ligados à sua sessão num perfil temporário.

profil temporaire

O utilizador não consegue encontrar as suas definições, principalmente o seu perfil do Outlook.

Tudo o que estiver armazenado na pasta C:\Utilizadores\TEMP não será feito backup quando fizerem logoff.

Se aplicar um GPO de redireccionamento de pastas (ambiente de trabalho/documentos…), os ficheiros e pastas modificados dentro do mesmo serão copiados.

Solução para corrigir problema temporário do perfil

A solução é eliminar as chaves de registo . BAK no seguinte local: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList

Registre clef profil temporaire

Num farm RDS 2012R2, tinha regularmente o problema com 3 utilizadores, por isso procurei uma forma de fazer esta limpeza automaticamente por script usando uma tarefa agendada.

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

Copie o script acima para um ficheiro com extensão vbs/ps1 e crie uma tarefa agendada que seja executada todas as noites em cada Host de Sessão de Ambiente de Trabalho Remoto.

O script gera um ficheiro de registo com as chaves de registo eliminadas.

Fichier de log

PI: Os erros temporários de perfil podem ser causados ​​pelo cliente RDP do Windows XP não suportar o balanceamento automático com o serviço Broker.

Romain Drouche
Arquiteto de Sistemas | MCSE: Infraestrutura Essencial
Especialista em infraestrutura de TI com mais de 15 anos de experiência na área. Atualmente, como Gerente de Projetos de Sistemas e Redes e especialista em Segurança de Sistemas de Informação (SSI), utilizo minha expertise para garantir a confiabilidade e a segurança de ambientes tecnológicos.

Deixe um comentário