Ισχύει για
Windows 10 Home and Pro, version 21H2 Windows 10 Enterprise and Education, version 21H2 Windows 10 IoT Enterprise, version 21H2 Windows 10 Home and Pro, version 22H2 Windows 10 Enterprise Multi-Session, version 22H2 Windows 10 Enterprise and Education, version 22H2 Windows 10 IoT Enterprise, version 22H2 Windows 11 Home and Pro, version 21H2 Windows 11 Enterprise Multi-Session, version 21H2 Windows 11 Enterprise and Education, version 21H2 Windows 11 IoT Enterprise, version 21H2 Azure Local, version 22H2 Windows Server 2022

Εισαγωγή

Η Microsoft έχει αναπτύξει ένα δείγμα δέσμης ενεργειών PowerShell που μπορεί να σας βοηθήσει να αυτοματοποιήσετε την ενημέρωση του Περιβάλλοντος αποκατάστασης των Windows (WinRE) σε ανεπτυγμένες συσκευές για την αντιμετώπιση των ευπαθειών ασφαλείας στο CVE-2024-20666.

Δείγμα δέσμης ενεργειών του PowerShell

Το δείγμα δέσμης ενεργειών PowerShell αναπτύχθηκε από την ομάδα προϊόντων της Microsoft για να βοηθήσει στην αυτοματοποίηση της ενημέρωσης εικόνων WinRE. Εκτελέστε τη δέσμη ενεργειών με διαπιστευτήρια διαχειριστή στο PowerShell στις συσκευές που επηρεάζονται.

Σημείωση Αυτή η δέσμη ενεργειών προορίζεται για όλες τις υποστηριζόμενες εκδόσεις των Windows.

#################################################################################

#

# 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(Mandatory=$true, HelpMessage="Path to target package")][string]$PackagePath,
    [Parameter(Mandatory=$false, HelpMessage="Directory to dism get-packages logs")][string]$LogDir
)

Set-StrictMode -Version Latest;

# Function to get WinRE path
function GetWinREPath {
    $WinRELocation = (reagentc /info | Select-String "Windows RE location")
    if ($WinRELocation) {
        return $WinRELocation.ToString().Split(':')[-1].Trim()
    } else {
        Write-Host "Failed to find WinRE path" -ForegroundColor Red
        exit 1
    }
}

# Function to get WinRE version
function GetWinREVersion {
    $filePath = "C:\mnt\Windows\System32\winpeshl.exe"
    $WinREVersion = (Get-Item $filePath).VersionInfo.FileVersionRaw.Revision
    return [int]$WinREVersion
}

# Function to get package version
function GetPackageVersion {
    $PackageInfo = dism /Online /Get-PackageInfo /PackagePath:"$PackagePath" | Select-String "Version :"
    if ($PackageInfo) {
        $VersionString = ($PackageInfo -split ':')[-1].Trim()
        if ($VersionString -match "\d+\.\d+\.\d+\.(\d+)") {
            return [int]$matches[1]  # Extract the last part (build number)
        } else {
            Write-Host "Failed to parse package version" -ForegroundColor Red
            exit 1
        }
    } else {
        Write-Host "Failed to retrieve package version" -ForegroundColor Red
        exit 1
    }
}

# Function to ensure log directory access
function EnsureLogDirAccess {
    param([string]$LogDir)
    if (Test-Path $LogDir) {
        try {
            $TestFile = "$LogDir\test_write_access.txt"
            Set-Content -Path $TestFile -Value "Test" -ErrorAction Stop
            Remove-Item -Path $TestFile -Force -ErrorAction Stop
            Write-Host "Log directory access verified." -ForegroundColor Green
        } catch {
            Write-Host "Insufficient permissions for log directory: $LogDir. Attempting to gain access..." -ForegroundColor Yellow
            try {
                $acl = Get-Acl $LogDir
                $rule = New-Object System.Security.AccessControl.FileSystemAccessRule("Everyone", "FullControl", "ContainerInherit,ObjectInherit", "None", "Allow")
                $acl.SetAccessRule($rule)
                Set-Acl -Path $LogDir -AclObject $acl
                Write-Host "Successfully gained access to log directory: $LogDir" -ForegroundColor Green
            } catch {
                Write-Host "Failed to gain access to log directory: $LogDir" -ForegroundColor Red
                exit 1
            }
        }
    } else {
        Write-Host "Log directory does not exist: $LogDir. Creating directory..." -ForegroundColor Yellow
        try {
            New-Item -ItemType Directory -Path $LogDir -Force | Out-Null
            Write-Host "Log directory created: $LogDir" -ForegroundColor Green
        } catch {
            Write-Host "Failed to create log directory: $LogDir" -ForegroundColor Red
            exit 1
        }
    }
}

# If file is other than .cab then exit
if ($PackagePath -notmatch "\.cab$") {
    Write-Host "Invalid package format. Only .cab files are supported." -ForegroundColor Red
    exit 1
}

# Main Execution
$WinREPath = GetWinREPath
$PackageVersion = GetPackageVersion

Write-Host "WinRE Path: $WinREPath" -ForegroundColor Cyan
Write-Host "Package Version: $PackageVersion" -ForegroundColor Cyan

if ($LogDir) {
    EnsureLogDirAccess -LogDir $LogDir
}

# Make dir C:\mnt if not exists
$TempDir = "C:\mnt"

# Get the read write permission for this directory
if (-not (Test-Path $TempDir)) {
    New-Item -ItemType Directory -Path $TempDir -Force | Out-Null
}

# Mount WinRE image
dism /Mount-Image /ImageFile:"$WinREPath\winre.wim" /Index:1 /MountDir:"$TempDir"

$WinREVersion = GetWinREVersion
Write-Host "WinRE Version: $WinREVersion" -ForegroundColor Cyan

if ($PackageVersion -gt $WinREVersion)
{
    Write-Host "Applying patch..." -ForegroundColor Yellow
    if ($LogDir) {
        dism /Image:"$TempDir" /Add-Package /PackagePath:"$PackagePath" /LogPath:"$LogDir\PatchWinRE.log"
    } else {
        dism /Image:"$TempDir" /Add-Package /PackagePath:"$PackagePath"
    }
    Write-Host "Committing changes..." -ForegroundColor Yellow
    dism /Unmount-Image /MountDir:"$TempDir" /Commit
    Write-Host "Patch applied and committed successfully!" -ForegroundColor Green
}
else{
    Write-Host "Already have a greater or equal version, no update needed." -ForegroundColor Green
    dism /Unmount-Image /MountDir:"$TempDir" /Discard
}

# Disable WinRE and re-enable it to let new WinRE be trusted by BitLocker
Write-Host "Disable WinRE"
reagentc /disable
Write-Host "Re-enable WinRE"
reagentc /enable
reagentc /info

# Cleanup
Remove-Item -Path $TempDir -Force -Recurse

## Usage
# .\Patch_WinRE_Generic.ps1 -PackagePath <path_to_cab_file>
# .\Patch_WinRE_Generic.ps1 -PackagePath <path_to_cab_file> -LogDir <path_to_custom_log_folder>

Περισσότερες πληροφορίες

Με τη συσκευή να ξεκινά στην έκδοση των Windows που εκτελείται και είναι εγκατεστημένη στη συσκευή, η δέσμη ενεργειών θα εκτελέσει τα ακόλουθα βήματα:

  1. Μοντάρισμα της υπάρχουσας εικόνας WinRE (WINRE. WIM).

  2. Ενημερώστε το είδωλο WinRE με το καθορισμένο πακέτο Ασφαλούς δυναμικής ενημέρωσης λειτουργικού συστήματος (Ενημέρωση συμβατότητας) που διατίθεται από τον κατάλογο Windows Update. Συνιστάται να χρησιμοποιείτε την πιο πρόσφατη δυναμική ενημέρωση ασφαλούς λειτουργικού συστήματος που είναι διαθέσιμη για την έκδοση των Windows που είναι εγκατεστημένη στη συσκευή.

  3. Κατάργηση μονταρίσματος της εικόνας WinRE.

  4. Εάν υπάρχει το προστατευτικό BitLocker TPM, επαναρυθμίζει τη ρύθμιση των παραμέτρων του WinRE για την υπηρεσία BitLocker.

    Σημαντικό Αυτό το βήμα δεν υπάρχει στις περισσότερες δέσμες ενεργειών τρίτων κατασκευαστών για την εφαρμογή ενημερώσεων στην εικόνα WinRE.

Χρήση

Μπορείτε να μεταβιβάσετε τις ακόλουθες παραμέτρους στη δέσμη ενεργειών:

Παράμετρος

Περιγραφή

LogDir

<Προαιρετικό> Καθορίζει το χώρο εκτός σελίδας που χρησιμοποιείται για την ενημέρωση του WinRE. Εάν δεν καθοριστεί, η δέσμη ενεργειών θα χρησιμοποιεί τον προεπιλεγμένο προσωρινό φάκελο για τη συσκευή.

packagePath

<Υποχρεωτικό> Καθορίζει τη διαδρομή και το όνομα του πακέτου ενημέρωσης Safe OS Dynamic ειδικά για την έκδοση του λειτουργικού συστήματος και του επεξεργαστή, το οποίο θα χρησιμοποιηθεί για την ενημέρωση του ειδώλου WinRE.Σημείωση Αυτή μπορεί να είναι μια τοπική διαδρομή ή μια απομακρυσμένη διαδρομή UNC, αλλά πρέπει να γίνει λήψη της Δυναμικής ενημέρωσης ασφαλούς λειτουργικού συστήματος και να είναι διαθέσιμη για χρήση από τη δέσμη ενεργειών.

Παράδειγμα: 

.\Patch_WinRE_Generic.ps1 -packagePath "\\server\share\windows10.0-kb5021043-x64_efa19d2d431c5e782a59daaf2d.cab

Παραπομπές

Τρόπος σύνταξης και εκτέλεσης δεσμών ενεργειών στον Windows PowerShell ISE 

Χρειάζεστε περισσότερη βοήθεια;

Θέλετε περισσότερες επιλογές;

Εξερευνήστε τα πλεονεκτήματα της συνδρομής, περιηγηθείτε σε εκπαιδευτικά σεμινάρια, μάθετε πώς μπορείτε να προστατεύσετε τη συσκευή σας και πολλά άλλα.