Áp dụng cho
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

Giới thiệu

Microsoft đã phát triển một tập lệnh PowerShell mẫu có thể giúp bạn tự động cập nhật Môi trường Phục hồi Windows (WinRE) trên các thiết bị đã triển khai để khắc phục các lỗ hổng bảo mật trong CVE-2024-20666.

Tập lệnh PowerShell mẫu

Tập lệnh PowerShell mẫu được nhóm sản phẩm của Microsoft phát triển để giúp tự động cập nhật hình ảnh WinRE. Chạy tập lệnh với thông tin xác thực Người quản trị trong PowerShell trên các thiết bị bị ảnh hưởng.

Ghi chú Tập lệnh này dành cho tất cả các phiên bản Windows được hỗ trợ.

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

#

# 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>

Thông tin khác

Khi thiết bị bắt đầu trở thành phiên bản Windows đang chạy được cài đặt trên thiết bị, tập lệnh sẽ thực hiện các bước sau:

  1. Gắn hình ảnh WinRE hiện có (WINRE. LÀ WIM).

  2. Cập nhật hình ảnh WinRE với gói Cập nhật Động HĐH An toàn (Bản cập nhật Tương thích) đã xác định có sẵn từ Danh Windows Update mục. Chúng tôi khuyên bạn nên sử dụng Bản cập nhật Động HĐH An toàn mới nhất có sẵn cho phiên bản Windows được cài đặt trên thiết bị.

  3. Bỏ thu hồi hình ảnh WinRE.

  4. Nếu có bộ bảo vệ BitLocker TPM, hãy đặt cấu hình lại WinRE cho dịch vụ BitLocker.

    Quan trọng Bước này không có trong hầu hết các tập lệnh của bên thứ ba để áp dụng các bản cập nhật cho hình ảnh WinRE.

Sử dụng

Các tham số sau đây có thể được chuyển đến tập lệnh:

Tham số

Mô tả

Nhật ký

<Chọn> Chỉ định không gian hỗn tắp được sử dụng để vá WinRE. Nếu không được chỉ định, tập lệnh sẽ sử dụng thư mục tạm thời mặc định cho thiết bị.

packagePath

<bắt buộc> Xác định đường dẫn và tên của gói cập nhật Safe OS Dynamic dành riêng cho phiên bản HĐH và dành riêng cho bộ xử lý sẽ được sử dụng để cập nhật hình ảnh WinRE.Ghi Đây có thể là đường dẫn cục bộ hoặc đường dẫn UNC từ xa nhưng phải tải xuống Và sử dụng Bản cập nhật Động HĐH An toàn.

Ví dụ: 

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

Tham khảo

Làm thế nào để viết và chạy kịch bản Windows PowerShell ISE 

Bạn cần thêm trợ giúp?

Bạn muốn xem các tùy chọn khác?

Khám phá các lợi ích của gói đăng ký, xem qua các khóa đào tạo, tìm hiểu cách bảo mật thiết bị của bạn và hơn thế nữa.