Khắc phục sự cố cập nhật Firefox trên Windows

Firefox Enterprise Firefox Enterprise Được tạo: 1 tuần trước
Đây là bản dịch từ bài viết tiếng Anh do máy tạo ra. Bản dịch này chưa được kiểm duyệt bởi con người và có thể chứa lỗi. Nếu bạn muốn chỉnh sửa nội dung này, bạn có thể bắt đầu tại đây.

Bài viết này dành cho quản trị viên CNTT muốn thiết lập Firefox trên các máy tính trong tổ chức của họ.

Nếu một thiết bị Windows không nhận hoặc áp dụng các bản cập nhật Firefox như mong đợi, hãy sử dụng các bước kiểm tra sau để giúp xác định nguyên nhân. Trước khi bạn bắt đầu, hãy đảm bảo rằng các chính sách cập nhật Firefox của tổ chức bạn được định cấu hình như dự kiến.

Để biết thông tin chung về quản lý các bản cập nhật, hãy xem Quản lý các bản cập nhật Firefox.

Nếu một máy trạm không nhận được các bản cập nhật Firefox, các bước kiểm tra PowerShell sau đây có thể giúp xác định nguyên nhân gốc rễ.

Kiểm tra các khóa registry của Chính sách Nhóm (GPO) cục bộ

Chạy lệnh sau:

Get-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Mozilla\Firefox" | 
Select-Object DisableAppUpdate, AppAutoUpdate

Các giá trị mong đợi:

Giá trị registry Giá trị mong đợi
DisableAppUpdate 0
AppAutoUpdate 1

Nếu các giá trị này không được đặt như mong đợi, các bản cập nhật Firefox có thể đã bị vô hiệu hóa bởi Chính sách Nhóm cục bộ hoặc miền.

Kiểm tra phiên bản Firefox đã cài đặt

Chạy lệnh PowerShell sau:

Get-ChildItem -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\" |
Where-Object { $_.PSChildName -like "Mozilla Firefox*" } |
ForEach-Object {
    Get-ItemProperty $_.PsPath |
    Select-Object DisplayName, DisplayVersion, Publisher, InstallDate
}

So sánh phiên bản đã cài đặt với phiên bản Firefox ESR mới nhất có trên trang web của Mozilla.

Kiểm tra tác vụ đã lên lịch

Firefox dựa vào một tác vụ nền đã lên lịch để tải xuống và áp dụng các bản cập nhật.

Chạy lệnh PowerShell sau:

Get-ScheduledTask | 
Where-Object { $_.TaskName -like "*Firefox Background Update*" } | 
ForEach-Object { Get-ScheduledTaskInfo $_ }

-> Đảm bảo rằng:

  • Tác vụ tồn tại
  • Tác vụ được bật
  • Tác vụ chạy thành công không có lỗi

Kiểm tra Dịch vụ Bảo trì Mozilla

Trên Windows, các bản cập nhật Firefox có thể yêu cầu Dịch vụ Bảo trì Mozilla (Mozilla Maintenance Service) được cài đặt và đang chạy. Dịch vụ này cho phép Firefox áp dụng các bản cập nhật mà không cần quyền quản trị.

Kiểm tra xem dịch vụ có tồn tại không và trạng thái của nó

Chạy lệnh PowerShell sau:

Get-Service -Name MozillaMaintenance -ErrorAction SilentlyContinue |
Select-Object Name, DisplayName, Status, StartType

-> Hành vi mong đợi:

  • Dịch vụ tồn tại
  • Trạng thái là Running (hoặc Stopped, nhưng có thể khởi động)
  • StartType được đặt thành Automatic hoặc Manual
  • Nếu dịch vụ bị thiếu, Firefox có thể không tự động áp dụng các bản cập nhật.

Khởi động dịch vụ theo cách thủ công (nếu cần)

Nếu dịch vụ tồn tại nhưng không chạy, hãy thử khởi động nó. Chạy lệnh PowerShell sau:

Start-Service -Name MozillaMaintenance

Kiểm tra lại xem dịch vụ có khởi động mà không có lỗi không.

Cài đặt lại Dịch vụ Bảo trì Mozilla

Nếu dịch vụ bị thiếu hoặc bị hỏng, nó có thể được cài đặt lại bằng trình cài đặt Firefox:

  1. Tải xuống trình cài đặt Firefox phù hợp với việc triển khai của bạn (ESR hoặc bản phát hành tiêu chuẩn).
  2. Chạy trình cài đặt với tư cách Quản trị viên.
  3. Đảm bảo rằng Install Mozilla Maintenance Service được chọn.

Sau khi cài đặt, hãy kiểm tra lại trạng thái dịch vụ.

Lời nhắc UAC yêu cầu thông tin đăng nhập của quản trị viên trong quá trình cập nhật

Trên một số máy trạm, một bản cập nhật sẽ kích hoạt lời nhắc UAC có tiêu đề Firefox Updater Software yêu cầu thông tin đăng nhập của quản trị viên, mặc dù Dịch vụ Bảo trì Mozilla đã được cài đặt và hoạt động tốt. Người dùng tiêu chuẩn không thể hoàn tất bản cập nhật và lời nhắc xuất hiện lại mỗi khi khởi chạy Firefox.

Nguyên nhân

Trước khi sử dụng Dịch vụ Bảo trì, trình cập nhật Firefox sẽ kiểm tra cấu hình UAC của máy trạm (kiểm tra IsUnpromptedElevation trong mã nguồn của trình cập nhật). Nếu UAC được định cấu hình để nâng quyền trong im lặng, Firefox sẽ cho rằng việc nâng quyền sẽ diễn ra mà không có bất kỳ lời nhắc nào — như đối với quản trị viên — và bỏ qua Dịch vụ Bảo trì. Nhưng nếu người dùng đã đăng nhập không thực sự là quản trị viên, việc nâng quyền sẽ không diễn ra trong im lặng và thay vào đó, Windows sẽ hiển thị lời nhắc thông tin đăng nhập UAC.

Điều này chỉ xảy ra khi cả ba điều kiện sau được đáp ứng:

  1. HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\ConsentPromptBehaviorAdmin được đặt thành 0 (tùy chọn bảo mật User Account Control: Behavior of the elevation prompt for administrators in Admin Approval Mode = Elevate without prompting; mặc định của Windows là 5)
  2. HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\PromptOnSecureDesktop được đặt thành 0 (tùy chọn bảo mật User Account Control: Switch to the secure desktop when prompting for elevation = Disabled; mặc định của Windows là 1)
  3. Người dùng đã đăng nhập có mã thông báo được lọc UAC: thành viên của một nhóm đặc quyền (Administrators, Backup Operators, Power Users, v.v.), bao gồm các nhóm được đánh dấu deny-only, hoặc người nắm giữ các đặc quyền nhạy cảm (chẳng hạn như SeBackupPrivilege hoặc SeDebugPrivilege) được cấp thông qua Chính sách Nhóm. Lưu ý rằng việc lọc dựa trên đặc quyền không hiển thị trong whoami /groups.

Chẩn đoán

Kiểm tra nhật ký trình cập nhật để tìm chữ ký sau:

Get-Content "C:\ProgramData\Mozilla-1de4eec8-1241-4177-a864-e594e8d1fb38\updates\*\updates\0\update.log"

...
After checking IsUnpromptedElevation, useService=false
Elevating via a UAC prompt
Writing status to file: failed: 9
...

Dòng useService=false sau khi kiểm tra IsUnpromptedElevation xác nhận nguyên nhân này (lỗi 9 có nghĩa là người dùng đã hủy lời nhắc UAC). Lưu ý: sau lần thất bại đầu tiên, các nhật ký tiếp theo hiển thị useService=false từ dòng đầu tiên, không có các dòng After checking... (trạng thái còn lại, xem Giải pháp).

Sau đó, kiểm tra các giá trị UAC và trạng thái cập nhật đang chờ xử lý:

reg query "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" /v ConsentPromptBehaviorAdmin
reg query "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" /v PromptOnSecureDesktop
Get-Content "C:\ProgramData\Mozilla-1de4eec8-1241-4177-a864-e594e8d1fb38\updates\*\updates\0\update.status"

Các giá trị update.status có thể có:

Giá trị Ý nghĩa
pending-service Bản cập nhật đã được tải xuống, Dịch vụ Bảo trì sẽ được sử dụng (bình thường)
pending Firefox đã từ bỏ Dịch vụ Bảo trì cho bản cập nhật này (trạng thái còn lại sau khi thất bại)
applied-service Bản cập nhật được áp dụng thành công thông qua Dịch vụ Bảo trì

Giải pháp

  1. Đóng Firefox.
  2. Chạy các lệnh sau trong PowerShell với quyền nâng cao:
    • Khôi phục hành vi nhắc nâng quyền UAC mặc định cho quản trị viên
      reg add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" /v ConsentPromptBehaviorAdmin /t REG_DWORD /d 5 /f
    • Bật lại màn hình nền an toàn cho các lời nhắc nâng quyền
      reg add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" /v PromptOnSecureDesktop /t REG_DWORD /d 1 /f
    • Xóa trạng thái cập nhật còn lại (nếu không, lời nhắc sẽ xuất hiện lần cuối)
      Remove-Item "C:\ProgramData\Mozilla-1de4eec8-1241-4177-a864-e594e8d1fb38\updates\*\*" -Recurse -Force
  3. Khởi động Firefox, đi tới Trợ giúp > Giới thiệu về Firefox và đợi Khởi động lại để cập nhật Firefox.
  4. Khởi động lại Firefox: bản cập nhật phải được áp dụng mà không có bất kỳ lời nhắc UAC nào.

-> Lưu ý:

  • Khôi phục một trong hai giá trị UAC là đủ để phá vỡ điều kiện lỗi; khôi phục cả hai sẽ đưa máy trạm trở lại cài đặt mặc định của Windows.
  • Nếu các giá trị UAC này được thực thi bởi Chính sách Nhóm miền, chúng sẽ được đặt lại ở lần làm mới chính sách tiếp theo (kiểm tra bằng gpupdate /force) — khi đó, bản sửa lỗi phải được áp dụng ở cấp GPO.
  • Ngoài ra, việc xóa người dùng khỏi nhóm đặc quyền (sau đó đăng xuất và đăng nhập lại) cũng giải quyết được sự cố.

Xác minh

Sau khi cập nhật, update.log mới chứa After checking IsUnpromptedElevation, useService=true và update.status hiển thị applied-service.

Kiểm tra các lần truyền BITS (Background Intelligent Transfer Service)

Firefox sử dụng BITS để tải xuống các bản cập nhật trong nền.

Chạy lệnh PowerShell sau:

Get-BitsTransfer | 
Where-Object { $_.DisplayName -match 'mozilla' -or $_.RemoteName -match 'mozilla' } | 
ForEach-Object {
    $job = $_
    foreach ($file in $job.FileList) {
        [PSCustomObject]@{
            DisplayName        = $job.DisplayName
            JobState           = $job.JobState
            BytesTransferredMB = [math]::Round($file.BytesTransferred / 1MB, 2)
            BytesRemainingMB   = [math]::Round(($file.BytesTotal - $file.BytesTransferred) / 1MB, 2)
            ProgressPercent    = if ($file.BytesTotal -gt 0) { 
                                     [math]::Round(($file.BytesTransferred / $file.BytesTotal * 100), 2) 
                                 } else { 0 }
            RemoteURL          = $file.RemoteName
            LocalPath          = $file.LocalName
        }
    }
}

-> Cần kiểm tra gì

  • JobState hiển thị trạng thái truyền hiện tại (đang truyền, bị tạm dừng, đã hoàn thành hoặc lỗi).
  • ProgressPercent cho biết tiến trình tải xuống.
  • RemoteURL hiển thị URL được Firefox sử dụng để truy xuất bản cập nhật.

-> Nếu quá trình tải xuống bị chặn

Nếu tiến trình không tiến triển hoặc công việc không thành công, hãy xác minh rằng URL hiển thị trong RemoteURL không bị chặn bởi mạng, tường lửa hoặc proxy của bạn.

Để xác nhận, hãy sao chép và dán URL vào trình duyệt và kiểm tra xem quá trình tải xuống có bắt đầu thành công hay không.

Liệt kê các tệp liên quan đến Firefox trong C:\ProgramData

Các tệp cập nhật Firefox được tải xuống và lưu trữ ở vị trí sau.

Chạy lệnh PowerShell sau:

Get-ChildItem -Path "C:\ProgramData\Mozilla-*" -Recurse | 
Select-Object @{ Name="Path"; Expression={$_.FullName} }, 
              @{ Name="Type"; Expression={ if ($_.PSIsContainer) { "Directory" } else { "File" } } }, 
              @{ Name="Size"; Expression={$_.Length} },
              @{ Name="LastModified"; Expression={$_.LastWriteTime} 
}

Điều này giúp xác minh xem các tệp cập nhật đã được tải xuống chưa và xác định các tệp không hoàn chỉnh hoặc bị đình trệ.

Các bài viết liên quan

Những người này đã giúp viết bài này:

Illustration of hands

Tình nguyện viên

Phát triển và chia sẻ chuyên môn của bạn với người khác. Trả lời câu hỏi và nâng cao kiến thức cơ bản của chúng tôi.

Tìm hiểu thêm