<# .SYNOPSIS Initialise key.bin (clé symétrique) et pwd.sec (mot de passe chiffré) dans un dossier cible. .DESCRIPTION Script à exécuter sur une machine sécurisée pour préparer une clé USB contenant: - key.bin : clé symétrique AES-256 au format base64 - pwd.sec : mot de passe chiffré (ConvertFrom-SecureString -Key) .PARAMETER OutDir Dossier cible où écrire key.bin et pwd.sec. Défaut : dossier courant. .PARAMETER UserName (Optionnel) Nom d'utilisateur associé au mot de passe (sera affiché dans le message). .PARAMETER Force Écrase les fichiers existants si présent. .EXAMPLE .\Init-KeyAndPwd.ps1 -OutDir "E:\" -UserName "EDU\ajoutpc" .NOTES Exécuter sur une machine sécurisée. Conserver la clé (key.bin) en sécurité. #> param( [string]$OutDir = (Get-Location).Path, [string]$UserName = "EDU\ajoutpc", [switch]$Force ) function Write-Log { param([string]$msg) $ts = (Get-Date).ToString('yyyy-MM-dd HH:mm:ss') Write-Host "[$ts] $msg" } function Set-RestrictiveAcl { param([string]$Path) try { if (-not (Test-Path -Path $Path)) { return } $acl = Get-Acl -Path $Path # Désactiver l'héritage et supprimer règles explicites (best-effort) $acl.SetAccessRuleProtection($true, $false) # Tentative de suppression des règles existantes (peut échouer sur certains supports) $acl.Access | ForEach-Object { $acl.RemoveAccessRule($_) } $admin = New-Object System.Security.Principal.NTAccount("BUILTIN\Administrators") $system = New-Object System.Security.Principal.NTAccount("NT AUTHORITY\SYSTEM") $ruleAdmin = New-Object System.Security.AccessControl.FileSystemAccessRule($admin,"FullControl","None","Allow") $ruleSystem = New-Object System.Security.AccessControl.FileSystemAccessRule($system,"FullControl","None","Allow") $acl.AddAccessRule($ruleAdmin) $acl.AddAccessRule($ruleSystem) Set-Acl -Path $Path -AclObject $acl -ErrorAction Stop Write-Log "ACL restrictive appliquée à $Path" } catch { Write-Log "Impossible d'appliquer ACL restrictive sur $Path : $_" } } try { # Normalisation du dossier cible $OutDir = (Resolve-Path -Path $OutDir).Path } catch { Write-Error "Dossier cible invalide : $OutDir" exit 1 } $keyFile = Join-Path -Path $OutDir -ChildPath "key.bin" $pwdFile = Join-Path -Path $OutDir -ChildPath "pwd.sec" # Vérifications if ((Test-Path $keyFile -PathType Leaf -ErrorAction SilentlyContinue) -and -not $Force) { Write-Error "Le fichier key.bin existe déjà dans $OutDir. Utilisez -Force pour écraser." exit 1 } if ((Test-Path $pwdFile -PathType Leaf -ErrorAction SilentlyContinue) -and -not $Force) { Write-Error "Le fichier pwd.sec existe déjà dans $OutDir. Utilisez -Force pour écraser." exit 1 } # Génération de la clé (32 octets -> AES-256) Write-Log "Génération de la clé symétrique (AES-256)..." $rng = New-Object System.Security.Cryptography.RNGCryptoServiceProvider $keyBytes = New-Object byte[] 32 $rng.GetBytes($keyBytes) $keyB64 = [Convert]::ToBase64String($keyBytes) # Écriture du fichier key.bin try { Set-Content -Path $keyFile -Value $keyB64 -Encoding ASCII -Force Write-Log "Clé écrite dans : $keyFile" Set-RestrictiveAcl -Path $keyFile } catch { Write-Error "Erreur lors de l'écriture de key.bin : $_" exit 1 } # Lecture du mot de passe (SecureString) et chiffrement Write-Host "" Write-Host "Saisir le mot de passe à chiffrer pour l'utilisateur : $UserName" $securePass = Read-Host -AsSecureString "Mot de passe (ne s'affiche pas)" if (-not $securePass) { Write-Error "Mot de passe non fourni. Abandon." exit 1 } try { # ConvertFrom-SecureString -Key attend un tableau d'octets $encString = $securePass | ConvertFrom-SecureString -Key $keyBytes Set-Content -Path $pwdFile -Value $encString -Encoding ASCII -Force Write-Log "Mot de passe chiffré écrit dans : $pwdFile" Set-RestrictiveAcl -Path $pwdFile } catch { Write-Error "Erreur lors du chiffrement / écriture du mot de passe : $_" # Tenter de supprimer les fichiers générés pour laisser l'état propre if (Test-Path $keyFile) { Remove-Item -Path $keyFile -Force -ErrorAction SilentlyContinue } if (Test-Path $pwdFile) { Remove-Item -Path $pwdFile -Force -ErrorAction SilentlyContinue } exit 1 } Write-Host "" Write-Log "Initialisation terminée." Write-Host "" Write-Host "IMPORTANT:" Write-Host " - Déplacez key.bin et pwd.sec sur la clé USB (ou gardez-les ensemble sur la clé)." Write-Host " - PROTÉGEZ la clé USB physiquement et restreignez l'accès au fichier." Write-Host " - Pour tester : copiez les fichiers sur une machine cible et exécutez votre script de join en pointant vers ces fichiers."