Pour éviter que le sujet ne se perdre, ce nouveau est extrait de la discussion
viewtopic.php?t=73790
Dans un deuxième message je placerai ce qui est apparu depuis, avec quelques explications, et compléments
AVANT TOUT et pour éviter de se lancer sur une résolution de problèmes vouée à l'échec :
Pour que BitLocker fonctionne, quelques conditions préalables doivent être remplies :
• Le mode de démarrage du BIOS doit être défini sur UEFI (et non sur Legacy/BIOS)
• Le schéma de partitionnement du disque doit être GPT (et non MBR). Cela est dû au fait que lors du basculement du BIOS vers UEFI, Windows ne démarre que si le disque est partitionné avec GPT.
Cela n'a rien à voir avec le TPM puisqu'avec certaines manipulations on peut installer Bitlocker sans TPM (ca sera moins efficace)
Il faut savoir qu'initialement le bug concerne les KB5034441 (sous Windows 10) et KB5034440 (sous Windows 11)
Les KB5034441/KB5034440 sont des mises à jour WinRE, mais la mise à jour KB5001716 ou apparait le même message d'erreur ne l'est pas
Le truc donc c'est que la KB5001716, amène l'erreur 0x80070643, mais ... C'est normal
L'erreur 0x80070643, en fait signifie "ERROR_INSTALL_FAILURE", c'est-à-dire que l'installation n'a pas fonctionné.
Il s'agit simplement d'un code standard chez Microsoft lorsqu'une configuration de type .exe ou .msi n'a pas pu être installée sans erreurs.
Il n’est pas possible de déterminer le pourquoi c’est le cas sur la base de ce code. Cela n'a rien donc rien à voir avec la partition de récupération.
Par contre...C'est le cas avec les KB5034441/KB5034440
Je donnerai là aussi une solution pour résoudre le problème de cette KB5001716, mais qui fonctionne bien et sans aucun rapport avec le soucis de la taille de la partition WINRE
Par contre la condition pour que cela fonctionne c'est que la partition de récupération soit placée.. EN FIN DE DISQUE
_________________________________________
A noter que sur le site, MALEKAL actualise au fur et à mesure des infos du moins pour ce cas de figure spécifique
Résoudre l’erreur 0x80070643 sur Windows Update
https://www.malekal.com/resoudre-erreur ... rop_petite
vu que Microsoft a enfin compris que sa méthode initiale via Diskpart était incomplète et pas pour tout le monde (la majorité des utilisateurs en fait) il y en a eu une autre mise en place (la même que celle de mars 2023 pour le soucis Bitlocker)
Du reste du point de vue utilisateur, cela semble incongru de devoir faire cette manipulation (à risques) alors que la faute est chez Microsoft
Si on souhaite passer par cette méthode (Diskpart) il y a mieux et plus complet : Comment agrandir la partition de récupération de Windows
sous condition que la partition de récupération soit placée .. A la fin du disque
MAIS, depuis Microsoft s'est ravisé et propose un script PoweShell
https://www.malekal.com/resoudre-erreur ... ws-update/
QU'EST CE QU'IL FAIT ?
Il automatise la mise à jour de la partition WinRE (sans avoir à la redimensionner au préalable) et colle la correction de la vulnérabilité CVE-2024-20666 BitLocker.
Dans l'absolu ce n'est pas mieux, car là aussi la majorité des utilisateurs n'utilisent pas PoweShell, ou ne savent pas l'utiliser
Pire, le script en l'état ne fonctionnera pas si on suit la page Microsoft pour les utilisateurs qui ne sont pas habitués à ces procédures
LE SCRIPT
- Déjà il faut récupérer le bon script (il y en a 2)
- Le script n'est pas téléchargeable, il faut faire un copier coller, tout mettre dans le bloc-note, (ou notepadd++) et le sauvegarder avec son extensions .PS1
Le plus commun est pour Windows 10 version 2004 et ultérieures, y compris Windows 11.
Code : Tout sélectionner
################################################################################################
#
# Copyright (c) Microsoft Corporation.
# Licensed under the MIT License.
#
# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
#
################################################################################################
Param (
[Parameter(HelpMessage="Work Directory for patch WinRE")][string]$workDir="",
[Parameter(Mandatory=$true,HelpMessage="Path of target package")][string]$packagePath
)
# ------------------------------------
# Help functions
# ------------------------------------
# Log message
function LogMessage([string]$message)
{
$message = "$([DateTime]::Now) - $message"
Write-Host $message
}
function IsTPMBasedProtector
{
$DriveLetter = $env:SystemDrive
LogMessage("Checking BitLocker status")
$BitLocker = Get-WmiObject -Namespace "Root\cimv2\Security\MicrosoftVolumeEncryption" -Class "Win32_EncryptableVolume" -Filter "DriveLetter = '$DriveLetter'"
if(-not $BitLocker)
{
LogMessage("No BitLocker object")
return $False
}
$protectionEnabled = $False
switch ($BitLocker.GetProtectionStatus().protectionStatus){
("0"){
LogMessage("Unprotected")
break
}
("1"){
LogMessage("Protected")
$protectionEnabled = $True
break
}
("2"){
LogMessage("Uknown")
break
}
default{
LogMessage("NoReturn")
break
}
}
if (!$protectionEnabled)
{
LogMessage("Bitlocker isn’t enabled on the OS")
return $False
}
$ProtectorIds = $BitLocker.GetKeyProtectors("0").volumekeyprotectorID
$return = $False
foreach ($ProtectorID in $ProtectorIds){
$KeyProtectorType = $BitLocker.GetKeyProtectorType($ProtectorID).KeyProtectorType
switch($KeyProtectorType){
"1"{
LogMessage("Trusted Platform Module (TPM)")
$return = $True
break
}
"4"{
LogMessage("TPM And PIN")
$return = $True
break
}
"5"{
LogMessage("TPM And Startup Key")
$return = $True
break
}
"6"{
LogMessage("TPM And PIN And Startup Key")
$return = $True
break
}
default {break}
}#endSwitch
}#EndForeach
if ($return)
{
LogMessage("Has TPM-based protector")
}
else
{
LogMessage("Doesn't have TPM-based protector")
}
return $return
}
function SetRegistrykeyForSuccess
{
reg add HKLM\SOFTWARE\Microsoft\PushButtonReset /v WinREPathScriptSucceed /d 1 /f
}
function TargetfileVersionExam([string]$mountDir)
{
# Exam target binary
$targetBinary=$mountDir + "\Windows\System32\bootmenuux.dll"
LogMessage("TargetFile: " + $targetBinary)
$realNTVersion = [Diagnostics.FileVersionInfo]::GetVersionInfo($targetBinary).ProductVersion
$versionString = "$($realNTVersion.Split('.')[0]).$($realNTVersion.Split('.')[1])"
$fileVersion = $($realNTVersion.Split('.')[2])
$fileRevision = $($realNTVersion.Split('.')[3])
LogMessage("Target file version: " + $realNTVersion)
if (!($versionString -eq "10.0"))
{
LogMessage("Not Windows 10 or later")
return $False
}
$hasUpdated = $False
#Windows 10, version 1507 10240.19567
#Windows 10, version 1607 14393.5499
#Windows 10, version 1809 17763.3646
#Windows 10, version 2004 1904X.2247
#Windows 11, version 21H2 22000.1215
#Windows 11, version 22H2 22621.815
switch ($fileVersion) {
"10240" {
LogMessage("Windows 10, version 1507")
if ($fileRevision -ge 19567)
{
LogMessage("Windows 10, version 1507 with revision " + $fileRevision + " >= 19567, updates have been applied")
$hasUpdated = $True
}
break
}
"14393" {
LogMessage("Windows 10, version 1607")
if ($fileRevision -ge 5499)
{
LogMessage("Windows 10, version 1607 with revision " + $fileRevision + " >= 5499, updates have been applied")
$hasUpdated = $True
}
break
}
"17763" {
LogMessage("Windows 10, version 1809")
if ($fileRevision -ge 3646)
{
LogMessage("Windows 10, version 1809 with revision " + $fileRevision + " >= 3646, updates have been applied")
$hasUpdated = $True
}
break
}
"19041" {
LogMessage("Windows 10, version 2004")
if ($fileRevision -ge 2247)
{
LogMessage("Windows 10, version 2004 with revision " + $fileRevision + " >= 2247, updates have been applied")
$hasUpdated = $True
}
break
}
"22000" {
LogMessage("Windows 11, version 21H2")
if ($fileRevision -ge 1215)
{
LogMessage("Windows 11, version 21H2 with revision " + $fileRevision + " >= 1215, updates have been applied")
$hasUpdated = $True
}
break
}
"22621" {
LogMessage("Windows 11, version 22H2")
if ($fileRevision -ge 815)
{
LogMessage("Windows 11, version 22H2 with revision " + $fileRevision + " >= 815, updates have been applied")
$hasUpdated = $True
}
break
}
default {
LogMessage("Warning: unsupported OS version")
}
}
return $hasUpdated
}
function PatchPackage([string]$mountDir, [string]$packagePath)
{
# Exam target binary
$hasUpdated =TargetfileVersionExam($mountDir)
if ($hasUpdated)
{
LogMessage("The update has already been added to WinRE")
SetRegistrykeyForSuccess
return $False
}
# Add package
LogMessage("Apply package:" + $packagePath)
Dism /Add-Package /Image:$mountDir /PackagePath:$packagePath
if ($LASTEXITCODE -eq 0)
{
LogMessage("Successfully applied the package")
}
else
{
LogMessage("Applying the package failed with exit code: " + $LASTEXITCODE)
return $False
}
# Cleanup recovery image
LogMessage("Cleanup image")
Dism /image:$mountDir /cleanup-image /StartComponentCleanup /ResetBase
if ($LASTEXITCODE -eq 0)
{
LogMessage("Cleanup image succeed")
}
else
{
LogMessage("Cleanup image failed: " + $LASTEXITCODE)
return $False
}
return $True
}
# ------------------------------------
# Execution starts
# ------------------------------------
# Check breadcrumb
if (Test-Path HKLM:\Software\Microsoft\PushButtonReset)
{
$values = Get-ItemProperty -Path HKLM:\Software\Microsoft\PushButtonReset
if (!(-not $values))
{
if (Get-Member -InputObject $values -Name WinREPathScriptSucceed)
{
$value = Get-ItemProperty -Path HKLM:\Software\Microsoft\PushButtonReset -Name WinREPathScriptSucceed
if ($value.WinREPathScriptSucceed -eq 1)
{
LogMessage("This script was previously run successfully")
exit 1
}
}
}
}
if ([string]::IsNullorEmpty($workDir))
{
LogMessage("No input for mount directory")
LogMessage("Use default path from temporary directory")
$workDir = [System.IO.Path]::GetTempPath()
}
LogMessage("Working Dir: " + $workDir)
$name = "CA551926-299B-27A55276EC22_Mount"
$mountDir = Join-Path $workDir $name
LogMessage("MountDir: " + $mountdir)
# Delete existing mount directory
if (Test-Path $mountDir)
{
LogMessage("Mount directory: " + $mountDir + " already exists")
LogMessage("Try to unmount it")
Dism /unmount-image /mountDir:$mountDir /discard
if (!($LASTEXITCODE -eq 0))
{
LogMessage("Warning: unmount failed: " + $LASTEXITCODE)
}
LogMessage("Delete existing mount direcotry " + $mountDir)
Remove-Item $mountDir -Recurse
}
# Create mount directory
LogMessage("Create mount directory " + $mountDir)
New-Item -Path $mountDir -ItemType Directory
# Set ACL for mount directory
LogMessage("Set ACL for mount directory")
icacls $mountDir /inheritance:r
icacls $mountDir /grant:r SYSTEM:"(OI)(CI)(F)"
icacls $mountDir /grant:r *S-1-5-32-544:"(OI)(CI)(F)"
# Mount WinRE
LogMessage("Mount WinRE:")
reagentc /mountre /path $mountdir
if ($LASTEXITCODE -eq 0)
{
# Patch WinRE
if (PatchPackage -mountDir $mountDir -packagePath $packagePath)
{
$hasUpdated = TargetfileVersionExam($mountDir)
if ($hasUpdated)
{
LogMessage("After patch, find expected version for target file")
}
else
{
LogMessage("Warning: After applying the patch, unexpected version found for the target file")
}
LogMessage("Patch succeed, unmount to commit change")
Dism /unmount-image /mountDir:$mountDir /commit
if (!($LASTEXITCODE -eq 0))
{
LogMessage("Unmount failed: " + $LASTEXITCODE)
exit 1
}
else
{
if ($hasUpdated)
{
if (IsTPMBasedProtector)
{
# Disable WinRE and re-enable it to let new WinRE be trusted by BitLocker
LogMessage("Disable WinRE")
reagentc /disable
LogMessage("Re-enable WinRE")
reagentc /enable
reagentc /info
}
# Leave a breadcrumb indicates the script has succeed
SetRegistrykeyForSuccess
}
}
}
else
{
LogMessage("Patch failed or is not applicable, discard unmount")
Dism /unmount-image /mountDir:$mountDir /discard
if (!($LASTEXITCODE -eq 0))
{
LogMessage("Unmount failed: " + $LASTEXITCODE)
exit 1
}
}
}
else
{
LogMessage("Mount failed: " + $LASTEXITCODE)
}
# Cleanup Mount directory in the end
LogMessage("Delete mount direcotry")
Remove-Item $mountDir -Recurse
TELECHARGER LA MISE A JOUR
- Il faut télécharger "la version dynamique" (un fichier .cab de 7.2 mo pour Win10 22H2 en 64Bits) qui est à la date du 9/01/2024 en rapport avec son Windows (10 ou 11 et versions)
https://www.catalog.update.microsoft.co ... =Safe%20OS
Il s'agit de la mise à jour pour l'image WinRE avec le package de mise à jour dynamique du système d’exploitation sécurisé (mise à jour de compatibilité) spécifié disponible dans le catalogue Windows Update
et....ce qui est OBLIGATOIRE (copier coller du lien Microsoft )
Spécifier le chemin d’accès, et le nom du package de mise à jour dynamique du système d’exploitation sécurisé spécifique à la version du système d’exploitation et à l’architecture du processeur à utiliser pour mettre à jour l’image WinRE.
EN CLAIR ET AU PLUS SIMPLE :
Si on veut se faciliter la vie on colle le fichier .PS1 (je lui ai donné le même nom que sur le site Microsoft) dans le même dossier que le fichier .CAB récupéré, soit par défaut "Download" (Téléchargement)
Généralement le chemin est
C:\Users\user\Downloads\
(mais votre nom d'utilisateur "user" peut etre différent il faut donc le changer)
Donc on ouvre une fenetre Powershell (avec droits administrateurs)
https://www.malekal.com/7-facons-ouvrir ... indows-10/
Vu que la fenêtre Powershell s'ouvre par défaut en mode administrateur sur le chemin "C:\Windows\system32 (ce qui n'est pas le cas avec PowerShell 7)
il faut (même si on peut procéder autrement) lui donner le bon chemin, soit (à tapoter dans la fenêtre Powershell)
Code : Tout sélectionner
Cd C:\Users\user\Downloads\
Code : Tout sélectionner
cd $env:userprofile\downloads
et ensuite il suffit de tapoter la commande suivante (on peut copier le nom de la KB en passant par l'explorateur et faire comme si on le renommait car la commande "copier" n'est pas prévue pour cela)
Ce qui donne : (utilisation volontaire de chemin absolu et non de chemin relatif car tout le monde n'a pas une version pure FR de Windows, ni le dossier téléchargement sur C:\)
Pour Windows 10
Code : Tout sélectionner
.\PatchWinREScript_2004plus.ps1 -packagePath "C:\Users\user\Downloads\windows10.0-kb5034232-x64_ff4651e9e031bad04f7fa645dc3dee1fe1435f38.cab
Code : Tout sélectionner
.\PatchWinREScript_2004plus.ps1 -packagePath "C:\Users\user\Downloads\windows10.0-kb5034236-x64_01a6f6fafaf46137e2e127ede78f14b36c774c6d.cab
Sinon copier ce qui précède si on est sous Win10 22H2 64Bits et changer le nom d'utilisateur par le sien
Il y a d'autres méthodes mais bon.. là c'est juste pour éviter les erreurs de script qui ne fonctionnera pas en l'état et pour éviter les erreurs de chemin
_________
Normalement cela doit fonctionner, meme si j'ai du utiliser PowerShell 7 (ca la version par défaut est bloquée chez moi pour des raisons de sécurité ce qui amène évidemment des messages d'erreurs et j' vbais la flemme de tout rétablir) et le fait que mon dossier de téléchargement soit sur un autre SSD
Du reste si cela intéresse
PowerShell 7 : https://github.com/PowerShell/PowerShel ... tag/v7.4.1 (et à l'installation on peut désactiver la télémétrie
Pour lecture : https://learn.microsoft.com/fr-fr/power ... rshell-7.4
Edit : Ajout d'une capture avec PowerShell "classique"
Cela ne change rien à la présentation