Mọi quản trị viên Windows giàu kinh nghiệm đều từng gặp phải các vấn đề với dịch vụ WMI (Windows Management Instrumentation) và các thành phần của nó. Các lỗi trong hệ thống con WMI ảnh hưởng nghiêm trọng đến hoạt động bình thường của Windows, do đó quản trị viên cần kiểm tra và khôi phục chức năng WMI càng sớm càng tốt. Trong bài viết này, chúng tôi sẽ mô tả một kỹ thuật khá đơn giản để khắc phục và sửa chữa các vấn đề WMI trên Windows 10 và Windows Server 2016/2019.
Các dấu hiệu phổ biến của sự cố WMI
Vấn đề với WMI có thể biểu hiện qua nhiều loại lỗi khác nhau:
- Lỗi xử lý truy vấn WMI trong nhật ký hệ thống và ứng dụng (
0x80041002 - WBEM_E_NOT_FOUND,WMI: Not Found,0x80041010 WBEM_E_INVALID_CLASS); - Lỗi xử lý GPO liên quan đến WMI (hoạt động không đúng của bộ lọc WMI cho Chính sách nhóm, v.v.);
- Truy vấn WMI chạy rất chậm;
- Lỗi khi cài đặt hoặc vận hành agent SCCM/SCOM;
- Lỗi trong các script (VBS hoặc PowerShell) sử dụng không gian tên WMI (script với
Get-WmiObject, v.v.)
Khắc phục sự cố WMI
Bước đầu tiên là kiểm tra dịch vụ Windows Management Instrumentation (Winmgmt) đã được cài đặt trên Windows và đang chạy hay chưa. Bạn có thể kiểm tra trạng thái dịch vụ trong bảng điều khiển services.msc hoặc sử dụng PowerShell:
Get-Service Winmgmt | Select DisplayName,Status,ServiceName
Nếu dịch vụ Winmgmt đang chạy, bạn có thể kiểm tra sức khỏe của WMI bằng cách truy vấn nó với một lệnh WMI đơn giản. Bạn có thể thực hiện yêu cầu WMI từ dấu nhắc lệnh hoặc từ PowerShell. Ví dụ, lệnh sau sẽ liệt kê các chương trình đã cài đặt trên Windows:
wmic product get name,version
Lệnh PowerShell đơn giản nhất để lấy thông tin về phiên bản và bản dựng của Windows 10 qua WMI có thể như sau:
get-wmiobject Win32_OperatingSystem
Như bạn thấy, dịch vụ WMI đã phản hồi đúng yêu cầu. Nếu Windows trả về lỗi khi thực hiện truy vấn WMI như vậy, rất có thể dịch vụ WMI không hoạt động đúng, kho lưu trữ WMI bị hỏng hoặc có các vấn đề khác.
Ví dụ, trong trường hợp của tôi, khi mở thuộc tính WMI Control trong snap-in Quản lý máy tính (compmgmt.msc), thông báo sau xuất hiện:
Failed to initialize all required WMI classes Win32_Processor. WMI: Invalid namespace Win32_WMISetting. WMI: Invalid namespace Win32_OperationSystem. WMI: Invalid namespace
Trước đây, công cụ chính thức của Microsoft WMIDiag.vbs (Chẩn đoán WMI của Microsoft) được sử dụng để chẩn đoán WMI. WMIDiag là một script VBS kiểm tra các hệ thống con WMI khác nhau và ghi thông tin thu thập được vào các file log (mặc định log nằm trong thư mục %TEMP% – C:\USERS\%USERNAME%\APPDATA\LOCAL\TEMP\). Báo cáo kết quả bao gồm các file có tên bắt đầu bằng WMIDIAG-V2.2 và bao gồm các loại file sau:
- File LOG chứa báo cáo chi tiết về hoạt động và vận hành của công cụ WMIDiag;
- File TXT chứa báo cáo tóm tắt các lỗi tìm thấy cần chú ý;
- File CSV chứa thông tin cần thiết để phân tích hiệu suất WMI lâu dài.
Mẹo. Trên Windows phiên bản x64, wmidiag nên được chạy như sau:
c:\windows\System32\cscript.exe wmidiag.vbs
ngược lại, sẽ xảy ra lỗi:
WMIDiag must be run from native 64-bit environment. It is not supported in Wow64.
Sau khi WMIDiag hoàn thành nhiệm vụ, quản trị viên nên kiểm tra các file log, phân tích và cố gắng sửa các lỗi tìm thấy.
Rất tiếc, phiên bản mới nhất của WMIDiag 2.2 chỉ hoạt động đúng với các phiên bản lên đến Windows 8.1/Windows Server 2012 R2. Lúc này, Microsoft đã gỡ bỏ liên kết tải WMIDiag khỏi Trung tâm tải xuống. Nhưng nếu muốn, script này vẫn có thể tìm thấy trên web.
WMIDiag cung cấp thông tin chi tiết về cách khắc phục các lỗi cục bộ trong WMI, nhưng trong hầu hết các trường hợp, đây là một nhiệm vụ tốn thời gian và chỉ đáng giá khi tìm giải pháp cho các vấn đề trong các hệ thống quan trọng (thường là máy chủ sản xuất). Đối với trạm làm việc của người dùng, việc đặt lại và tái xây dựng kho lưu trữ WMI trong Windows dễ dàng hơn nhiều.
Sửa chữa kho lưu trữ WMI và biên dịch lại file MOF
Trên Windows 10/Windows Server 2016, bạn có thể kiểm tra tính toàn vẹn của kho lưu trữ WMI bằng lệnh:
winmgmt /verifyrepository
Nếu lệnh trả về rằng cơ sở dữ liệu WMI đang ở trạng thái không nhất quán (INCONSISTENT hoặc WMI repository verification failed), bạn nên thử sửa chữa mềm các lỗi kho lưu trữ WMI:
Winmgmt /salvagerepository
WMI repository has been salvaged.
Lệnh này kiểm tra tính nhất quán của kho lưu trữ WMI và tái xây dựng cơ sở dữ liệu WMI nếu phát hiện sự không nhất quán.
Khởi động lại dịch vụ WMI:
net stop Winmgmt
net start Winmgmt
Nếu sửa chữa WMI tiêu chuẩn không hiệu quả, hãy thử script sau. Script này là tùy chọn "mềm" để khôi phục dịch vụ WMI trên máy tính (các thư viện DLL và WMI được đăng ký lại và file MOF được biên dịch lại). Quy trình này an toàn và việc thực hiện không nên gây thêm vấn đề với hệ điều hành:
sc config winmgmt start= disabled
net stop winmgmt
cd %windir%\system32\wbem
for /f %s in ('dir /b *.dll') do regsvr32 /s %s
wmiprvse /regserver
sc config winmgmt start= auto
net start winmgmt
for /f %s in ('dir /b *.mof') do mofcomp %s
for /f %s in ('dir /b *.mfl') do mofcomp %s
Trên Windows 64-bit, các bước này cũng phải được thực hiện cho thư mục SysWOW64. Thay thế dòng thứ ba bằng:
cd %windir%\SysWOW64\wbem
Các lệnh này có thể chạy bằng cách dán trực tiếp vào dấu nhắc lệnh, hoặc bạn có thể lưu script thành file BAT (wmi_soft_repair.bat) và chạy với quyền quản trị. Sau khi script kết thúc, khởi động lại Windows và kiểm tra xem WMI có hoạt động không.
Tái xây dựng kho lưu trữ WMI
Nếu phương pháp trên không giúp ích, hãy sử dụng cách "cứng" hơn để khôi phục WMI, tức là tái tạo kho lưu trữ WMI.
Kho lưu trữ WMI nằm ở %windir%\System32\Wbem\Repository và là cơ sở dữ liệu chứa thông tin về siêu dữ liệu và định nghĩa các lớp WMI. Trong một số trường hợp, kho lưu trữ WMI cũng có thể chứa thông tin lớp tĩnh. Khi kho lưu trữ bị hỏng, sẽ xảy ra lỗi trong hoạt động của dịch vụ WMI (Winmgmt).
Nếu bạn nghi ngờ kho lưu trữ WMI bị hỏng, hãy nhớ rằng nó chỉ nên được tái tạo khi không có biện pháp nào khác khôi phục WMI hiệu quả.
Lệnh sau sẽ đặt lại cơ sở dữ liệu WMI về trạng thái ban đầu (như sau khi cài đặt Windows sạch). Sử dụng lệnh này để đặt lại cứng kho lưu trữ WMI nếu tham số salvagerepository không khắc phục được vấn đề:
Winmgmt /resetrepository
Mẹo. Trong thực tế, có trường hợp tái xây dựng kho lưu trữ WMI gây ra vấn đề với phần mềm thứ ba. Lý do là tất cả các bản ghi trong cơ sở dữ liệu WMI bị xóa (trở về trạng thái hệ thống sạch). Phần mềm như vậy có thể phải cài đặt lại ở chế độ khôi phục.
Nếu cả hai lệnh (Winmgmt /salvagerepository và Winmgmt /resetrepository) không khôi phục được trạng thái nhất quán của cơ sở dữ liệu WMI, hãy thử thực hiện đặt lại cứng cơ sở dữ liệu WMI với script sau:
sc config winmgmt start= disabled
sc config winmgmt start= disabled
net stop winmgmt
cd %windir%\system32\wbem
winmgmt /resetrepository
winmgmt /resyncperf
if exist Repos_bakup rd Repos_bakup /s /q
rename Repository Repos_bakup
regsvr32 /s %systemroot%\system32\scecli.dll
regsvr32 /s %systemroot%\system32\userenv.dll
for /f %s in ('dir /b *.dll') do regsvr32 /s %s
for /f %s in ('dir /b *.mof') do mofcomp %s
for /f %s in ('dir /b *.mfl') do mofcomp %s
sc config winmgmt start= auto
net start winmgmt
wmiprvse /regserver
Trên Windows 64-bit, bạn cũng cần đăng ký lại DLL/EXE và biên dịch lại file MOF trong thư mục %windir%\sysWOW64\wbem.
Script này xóa hoàn toàn và tái tạo thư mục kho lưu trữ WMI (kho lưu trữ cũ được lưu vào thư mục Repos_backup). Sau khi script hoàn thành, bạn cần khởi động lại Windows. Sau đó kiểm tra dịch vụ WMI bằng một truy vấn đơn giản.
Kiểm tra trạng thái kho lưu trữ WMI. Nếu lỗi được khắc phục, lệnh winmgmt /verifyrepository nên trả về:
WMI repository is consistent
Trong bài viết này, chúng tôi đã trình bày các cách cơ bản để chẩn đoán và khắc phục sự cố dịch vụ và kho lưu trữ WMI.