Arrêter la transcription PowerShell sous Windows 11 : GPO, Registre, OneDrive et scripts

Bascule vers Windows 11 et apparition de fichiers « transcript » PowerShell dans Documents ? Voici comment identifier la cause (GPO, scripts) et stopper proprement la journalisation, ou la rediriger hors de OneDrive tout en respectant vos exigences d’audit.

Sommaire

Vue d’ensemble du problème

Après une mise à niveau vers Windows 11, de nombreux utilisateurs constatent la création automatique de dossiers datés du type PowerShell_transcript.<NomMachine>.<Horodatage> dans le répertoire Documents. Chaque dossier contient un fichier texte listant l’intégralité de la session PowerShell, y compris les commandes tapées, la sortie produite et parfois des informations d’environnement. Si Documents est synchronisé via OneDrive (KFM / “Sauvegarde des dossiers Ordinateur”), ces journaux s’ajoutent à la synchronisation, ce qui :

  • alourdit inutilement le volume stocké et transféré ;
  • fait remonter des informations potentiellement sensibles dans le cloud ;
  • encombre la navigation dans OneDrive (multiplication de dossiers datés).

Analyse de la cause

Ce comportement provient de la fonctionnalité PowerShell Transcription, conçue pour l’audit et la traçabilité. Elle peut être activée de deux façons.

Activation par Stratégie de groupe (GPO)

Chemin GPO : Stratégies → Configuration ordinateur / Modèles d’administration → Composants Windows → Windows PowerShell → Activer la transcription PowerShell.

Quand ce paramètre est activé, Windows écrit (ou lit) les clés de registre :

HKLM\Software\Policies\Microsoft\Windows\PowerShell\Transcription
HKCU\Software\Policies\Microsoft\Windows\PowerShell\Transcription

Valeurs utilisées : EnableTranscripting (DWORD, 1 = activé, 0 = désactivé) et éventuellement OutputDirectory (REG_SZ) pour forcer l’emplacement des journaux.

À connaître pour PowerShell 7.x (pwsh) : sur Windows, PowerShell 7 peut également respecter des paramètres de stratégie sous Microsoft\PowerShellCore\Transcription. En pratique, vérifiez à la fois les emplacements Windows\PowerShell (5.1) et PowerShellCore (7.x) si vous utilisez les deux éditions.

Activation par script (profil, tâche planifiée, module)

Un Start-Transcript dans un profil PowerShell ou un script d’ouverture de session démarre la journalisation à chaque lancement. Les profils à vérifier :

$PROFILE                  # Profil courant (Utilisateur + Hôte)
$PROFILE.CurrentUserAllHosts
$PROFILE.AllUsersCurrentHost
$PROFILE.AllUsersAllHosts

Vérifiez également les scripts de logon, les tâches planifiées, et les modules tiers qui peuvent encapsuler Start-Transcript.

Signes distinctifs

  • Nom de fichier : PowerShell_transcript.<PC>.<Date-Heure>.txt.
  • Présence d’un en-tête Start Transcript et pied de page Stop Transcript.
  • Création systématique d’un nouveau fichier à chaque session.

Solutions et méthodes de désactivation

Selon votre contexte (poste isolé, environnement d’entreprise, besoin ou non d’audit), choisissez l’une des approches ci-dessous.

NiveauActionDétailsImpact
InstantanéStop-TranscriptStoppe la transcription uniquement pour la session en cours. Utile pour tester ou interrompre rapidement.Ne survit pas à l’ouverture d’une nouvelle session.
Permanent (poste isolé)Éditer le RegistreMettre EnableTranscripting à 0 (HKCU/HKLM) et/ou supprimer OutputDirectory.Effet immédiat local ; peut être écrasé par une GPO ultérieure.
Permanent (par GPO)Modifier ou désactiver la GPOMettre le paramètre sur Non configuré ou Désactivé. Ou rediriger OutputDirectory vers un dossier sécurisé hors Documents.Effet homogène ; nécessite droits d’admin AD / GPO.
Scripts/profilsRetirer Start-TranscriptNettoyer les profils ($PROFILE), scripts de logon et tâches planifiées.Évite une réactivation « cachée » hors GPO.

Méthode express : vérification et arrêt immédiat

# 1) Voir si une transcription tourne dans la session (n’affiche rien si non)
Stop-Transcript -ErrorAction SilentlyContinue

# 2) Localiser des traces dans Documents

Get-ChildItem -Path "$HOME\Documents" -Directory -Filter "PowerShell_transcript*" -ErrorAction SilentlyContinue

# 3) Vérifier les clés de stratégie (5.1 + 7.x)

$keys = @(
'HKLM:\Software\Policies\Microsoft\Windows\PowerShell\Transcription',
'HKCU:\Software\Policies\Microsoft\Windows\PowerShell\Transcription',
'HKLM:\Software\Policies\Microsoft\PowerShellCore\Transcription',
'HKCU:\Software\Policies\Microsoft\PowerShellCore\Transcription'
)
$keys | ForEach-Object {
if (Test-Path $*) {
[PSCustomObject]@{
Key = $*
EnableTranscripting = (Get-ItemProperty -Path $_ -Name EnableTranscripting -ErrorAction SilentlyContinue).EnableTranscripting
OutputDirectory    = (Get-ItemProperty -Path $_ -Name OutputDirectory    -ErrorAction SilentlyContinue).OutputDirectory
}
}
} | Format-Table -Auto 

Poste isolé : désactivation via Registre (PowerShell)

Exécuter dans une console PowerShell en tant qu’administrateur pour neutraliser la transcription (5.1 et 7.x) :

# Désactiver la transcription et enlever un OutputDirectory imposé
$paths = @(
  'HKLM:\Software\Policies\Microsoft\Windows\PowerShell\Transcription',
  'HKCU:\Software\Policies\Microsoft\Windows\PowerShell\Transcription',
  'HKLM:\Software\Policies\Microsoft\PowerShellCore\Transcription',
  'HKCU:\Software\Policies\Microsoft\PowerShellCore\Transcription'
)
foreach ($p in $paths) {
  if (-not (Test-Path $p)) { New-Item -Path $p -Force | Out-Null }
  New-ItemProperty -Path $p -Name EnableTranscripting -PropertyType DWord -Value 0 -Force | Out-Null
  Remove-ItemProperty -Path $p -Name OutputDirectory -ErrorAction SilentlyContinue
}

# Stopper la session en cours sans erreur si rien n’est actif

Stop-Transcript -ErrorAction SilentlyContinue 

Alternative en reg.exe (utile en scripts .bat) :

reg add HKLM\Software\Policies\Microsoft\Windows\PowerShell\Transcription /v EnableTranscripting /t REG_DWORD /d 0 /f
reg add HKCU\Software\Policies\Microsoft\Windows\PowerShell\Transcription /v EnableTranscripting /t REG_DWORD /d 0 /f
reg delete HKLM\Software\Policies\Microsoft\Windows\PowerShell\Transcription /v OutputDirectory /f
reg delete HKCU\Software\Policies\Microsoft\Windows\PowerShell\Transcription /v OutputDirectory /f

rem (Optionnel pour PowerShell 7)
reg add HKLM\Software\Policies\Microsoft\PowerShellCore\Transcription /v EnableTranscripting /t REG_DWORD /d 0 /f
reg add HKCU\Software\Policies\Microsoft\PowerShellCore\Transcription /v EnableTranscripting /t REG_DWORD /d 0 /f
reg delete HKLM\Software\Policies\Microsoft\PowerShellCore\Transcription /v OutputDirectory /f
reg delete HKCU\Software\Policies\Microsoft\PowerShellCore\Transcription /v OutputDirectory /f 

Environnement d’entreprise : via GPO

  1. Ouvrez l’éditeur de stratégie (local : gpedit.msc, domaine : Console de gestion des stratégies de groupe).
  2. Chemin : Configuration ordinateur → Modèles d’administration → Composants Windows → Windows PowerShell → Activer la transcription PowerShell.
  3. Choisissez Désactivé ou Non configuré. Si l’audit est requis, laissez Activé mais définissez OutputDirectory hors de Documents (ex. C:\AuditLogs\%ComputerName%\%UserName%).
  4. Appliquez les stratégies : gpupdate /force.

Remarques : une GPO machine (HKLM) impose la transcription pour tous les utilisateurs ; une GPO utilisateur (HKCU) l’impose uniquement pour le compte ciblé. Les paramètres HKLM et HKCU peuvent coexister ; adoptez la même posture (désactivé ou redirigé) des deux côtés pour éviter les surprises.

Scripts et profils : retirer Start-Transcript

Recherchez tout démarrage automatique dans vos profils et scripts :

# Lister les chemins de profils
$PROFILE | Format-List *

# Rechercher 'Start-Transcript' dans les profils et scripts utilisateur

Get-ChildItem -Path $HOME -Include *.ps1,*.psm1 -Recurse -ErrorAction SilentlyContinue |
Select-String -Pattern 'Start-Transcript' -SimpleMatch |
Select-Object Path, LineNumber, Line 

Supprimez ou commentez la ligne incriminée. Si vous devez garder une journalisation conditionnelle (ex. uniquement en Prod), encapsulez-la derrière un test d’environnement et placez la sortie hors Documents.

Rediriger au lieu de désactiver (si l’audit est requis)

Lorsque la conformité impose l’audit, redirigez les journaux vers un répertoire local protégé non synchronisé par OneDrive, par exemple C:\AuditLogs.

# Créer un dépôt local protégé
$root = 'C:\AuditLogs'
New-Item -ItemType Directory -Path $root -Force | Out-Null

# Renforcer les ACL (ajustez le nom du groupe selon la langue : Administrators/Administrateurs)

icacls $root /inheritance:r
icacls $root /grant:r "SYSTEM:(OI)(CI)F" "Administrators:(OI)(CI)F"

# Définir la redirection via Registre (5.1 + 7.x)

$targets = @(
'HKLM:\Software\Policies\Microsoft\Windows\PowerShell\Transcription',
'HKCU:\Software\Policies\Microsoft\Windows\PowerShell\Transcription',
'HKLM:\Software\Policies\Microsoft\PowerShellCore\Transcription',
'HKCU:\Software\Policies\Microsoft\PowerShellCore\Transcription'
)
foreach ($t in $targets) {
if (-not (Test-Path $t)) { New-Item $t -Force | Out-Null }
New-ItemProperty -Path $t -Name EnableTranscripting -PropertyType DWord -Value 1 -Force | Out-Null
New-ItemProperty -Path $t -Name OutputDirectory    -PropertyType String -Value "$root%ComputerName%%UserName%" -Force | Out-Null
} 

Ces clés acceptent les variables d’environnement (%ComputerName%, %UserName%) qui seront développées côté client, ce qui facilite le tri par machine et par utilisateur.

Nettoyage des journaux existants et de OneDrive

Après désactivation ou redirection, purgez les anciens journaux pour libérer l’espace et limiter la diffusion de données :

# 1) Lister les dossiers de transcript dans Documents
Get-ChildItem -Path "$HOME\Documents" -Directory -Filter "PowerShell_transcript*"

# 2) Archiver avant suppression (optionnel)

$stamp = Get-Date -Format 'yyyyMMdd-HHmmss'
$archive = "$HOME\Documents\Transcripts-$stamp.zip"
Compress-Archive -Path "$HOME\Documents\PowerShell_transcript*" -DestinationPath $archive -ErrorAction SilentlyContinue

# 3) Supprimer les anciens dossiers

Get-ChildItem -Path "$HOME\Documents" -Directory -Filter "PowerShell_transcript*" -ErrorAction SilentlyContinue |
Remove-Item -Recurse -Force 

Astuce : si Documents est protégé par OneDrive (KFM), la suppression locale propagera la suppression côté cloud. Vérifiez la Corbeille OneDrive si vous souhaitez pouvoir restaurer les fichiers ultérieurement.

Contrôle et diagnostic rapides

  • Vérifier la stratégie effective : générez un rapport gpresult /h C:\Temp\gp.html et ouvrez-le pour confirmer l’état du paramètre « Activer la transcription PowerShell ».
  • Registre : interrogez directement la clé : Get-Item HKLM:\Software\Policies\Microsoft\Windows\PowerShell\Transcription (et équivalents HKCU / PowerShellCore).
  • Session courante : si un transcript est actif, Stop-Transcript affiche le chemin du fichier stoppé. S’il n’y a pas de transcript, la commande ne produit pas d’erreur avec -ErrorAction SilentlyContinue.

Bonnes pratiques de sécurité

  • Principe du moindre privilège : limitez l’accès NTFS au répertoire d’audit (ex. Administrators, SYSTEM).
  • Rétention : mettez en place une tâche planifiée qui purge les journaux au-delà d’un certain âge, par exemple 30 jours : $retentionDays = 30 $root = 'C:\AuditLogs' Get-ChildItem -Path $root -File -Recurse -ErrorAction SilentlyContinue | Where-Object { $_.LastWriteTime -lt (Get-Date).AddDays(-$retentionDays) } | Remove-Item -Force
  • Respect des politiques d’entreprise : si une GPO impose la transcription, ne la désactivez pas localement sans approbation ; privilégiez une redirection hors Documents.

FAQ & cas particuliers

Pourquoi cela s’est-il déclenché après le passage à Windows 11 ?

  • Une GPO précédemment « Non configurée » a pu être activée par un nouveau référentiel de sécurité.
  • Le déplacement des dossiers connus (KFM) vers OneDrive a rendu visible une journalisation déjà active mais auparavant confinée en local.
  • Un module ou un profil a introduit Start-Transcript au moment du changement d’environnement.

Windows PowerShell 5.1 vs PowerShell 7 (pwsh)

Les deux peuvent journaliser. Vérifiez et traitez les deux familles de clés (Windows\PowerShell et PowerShellCore) et nettoyez les profils des deux hôtes si vous les utilisez tous deux (Windows PowerShell et pwsh).

Édition Familiale (Home) de Windows

Vous n’avez pas l’outil gpedit.msc, mais vous pouvez appliquer les changements via le Registre (voir scripts ci-dessus). En environnement d’entreprise, la GPO de domaine prévaudra à la prochaine application de stratégie.

Message « Stop-Transcript : Aucune transcription active »

Utilisez Stop-Transcript -ErrorAction SilentlyContinue pour éviter le message si rien n’est en cours.

Peut-on exclure uniquement le sous-dossier des transcripts de OneDrive ?

Si Documents est protégé via KFM, l’exclusion granulaire d’un sous-dossier n’est pas toujours disponible côté client. La méthode la plus propre consiste à rediriger OutputDirectory vers un emplacement hors des dossiers connus, ou à désactiver la transcription.

Procédure guidée (pas à pas)

  1. Stopper l’hémorragie : Stop-Transcript -ErrorAction SilentlyContinue.
  2. Diagnostiquer : exécutez le bloc « Vérification » pour lister les clés et l’emplacement de sortie.
  3. Décider :
    • Pas d’audit requis → désactivez via Registre ou GPO.
    • Audit requis → laissez activé mais redirigez hors Documents avec ACL durcies.
  4. Nettoyer : archivez et supprimez les anciens transcripts dans Documents (voir scripts).
  5. Vérifier : rouvrez une console PowerShell ; aucun nouveau PowerShell_transcript* ne doit apparaître dans Documents.

Annexe : script « tout-en-un » (désactiver et nettoyer)

Copiez/collez le script ci-dessous dans une console PowerShell administrateur. Il désactive la transcription (5.1 + 7), supprime la redirection imposée et nettoie Documents.

# --- Désactiver la transcription PowerShell (Windows PowerShell & PowerShell 7) ---
$policyKeys = @(
  'HKLM:\Software\Policies\Microsoft\Windows\PowerShell\Transcription',
  'HKCU:\Software\Policies\Microsoft\Windows\PowerShell\Transcription',
  'HKLM:\Software\Policies\Microsoft\PowerShellCore\Transcription',
  'HKCU:\Software\Policies\Microsoft\PowerShellCore\Transcription'
)

foreach ($k in $policyKeys) {
if (-not (Test-Path $k)) { New-Item -Path $k -Force | Out-Null }
New-ItemProperty -Path $k -Name EnableTranscripting -PropertyType DWord -Value 0 -Force | Out-Null
Remove-ItemProperty -Path $k -Name OutputDirectory -ErrorAction SilentlyContinue
}

# --- Stopper la session en cours si nécessaire ---

Stop-Transcript -ErrorAction SilentlyContinue

# --- Nettoyage des transcripts existants dans Documents ---

$docs = [Environment]::GetFolderPath('MyDocuments')
Get-ChildItem -Path $docs -Directory -Filter 'PowerShell_transcript*' -ErrorAction SilentlyContinue | ForEach-Object {
try { Remove-Item -LiteralPath $_.FullName -Recurse -Force } catch {}
}

Write-Host "Transcription PowerShell désactivée et anciens journaux nettoyés." 

Annexe : conserver l’audit mais déplacer et sécuriser

Si vous devez garder la transcription, utilisez ce script pour rediriger vers C:\AuditLogs avec des ACL restrictives et une rétention de 30 jours.

$root = 'C:\AuditLogs'
New-Item -ItemType Directory -Path $root -Force | Out-Null
icacls $root /inheritance:r | Out-Null
icacls $root /grant:r "SYSTEM:(OI)(CI)F" "Administrators:(OI)(CI)F" | Out-Null

$targets = @(
'HKLM:\Software\Policies\Microsoft\Windows\PowerShell\Transcription',
'HKCU:\Software\Policies\Microsoft\Windows\PowerShell\Transcription',
'HKLM:\Software\Policies\Microsoft\PowerShellCore\Transcription',
'HKCU:\Software\Policies\Microsoft\PowerShellCore\Transcription'
)
foreach ($t in $targets) {
if (-not (Test-Path $t)) { New-Item $t -Force | Out-Null }
New-ItemProperty -Path $t -Name EnableTranscripting -PropertyType DWord -Value 1 -Force | Out-Null
New-ItemProperty -Path $t -Name OutputDirectory    -PropertyType String -Value "$root%ComputerName%%UserName%" -Force | Out-Null
}

# Tâche de rétention (exécution à la demande)

$retentionDays = 30
Get-ChildItem -Path $root -File -Recurse -ErrorAction SilentlyContinue |
Where-Object { $_.LastWriteTime -lt (Get-Date).AddDays(-$retentionDays) } |
Remove-Item -Force

Write-Host "Transcription redirigée vers $root et rétention appliquée." 

Résumé

La multiplication des fichiers « transcript » dans Documents est normale lorsque la fonctionnalité Transcription PowerShell est active. Pour les faire disparaître de OneDrive, deux approches : désactiver la transcription (Registre/GPO) quand l’audit n’est pas requis, ou rediriger la sortie vers un dossier local sécurisé (ex. C:\AuditLogs) quand l’audit reste nécessaire. Dans tous les cas, vérifiez les deux axes (GPO et scripts/profils), purgez les historiques existants et contrôlez l’état effectif via le Registre et gpresult.

Sommaire