ผู้ดูแลระบบ Windows ที่มีประสบการณ์ทุกคนประสบปัญหาบางอย่างกับบริการ WMI (Windows Management Instrumentation) และส่วนประกอบต่างๆ ปัญหาในระบบย่อย WMI มีความสำคัญต่อการทำงานปกติของ Windows ดังนั้นผู้ดูแลระบบจำเป็นต้องตรวจสอบและกู้คืนฟังก์ชันการทำงานของ WMI โดยเร็วที่สุด ในบทความนี้ เราจะอธิบายเทคนิคง่ายๆ ในการแก้ไขปัญหาและแก้ไขปัญหา WMI ใน Windows 10 และ Windows Server 2016/2019
ปัญหากับ WMI อาจบ่งบอกถึงข้อผิดพลาดที่หลากหลาย:
- ข้อผิดพลาดในการประมวลผลแบบสอบถาม WMI ในบันทึกของระบบและแอปพลิเคชัน (
0x80041002 - WBEM_E_NOT_FOUND
,WMI: Not Found
,0x80041010 WBEM_E_INVALID_CLASS
); - ข้อผิดพลาดในการประมวลผล GPO ที่เกี่ยวข้องกับ WMI (งานที่ไม่ถูกต้องของตัวกรอง WMI ของนโยบายกลุ่ม ฯลฯ)
- การสืบค้น WMI ช้ามาก
- ข้อผิดพลาดระหว่างการติดตั้งหรือการทำงานของเอเจนต์ SCCM/SCOM
- ข้อผิดพลาดในสคริปต์ (VBS หรือ PowerShell) ที่ใช้เนมสเปซ WMI (สคริปต์ที่มี Get-WmiObject เป็นต้น)
การแก้ไขปัญหา WMI
ขั้นตอนแรกคือการตรวจสอบ Windows Management Instrumentation (Winmgmt
) บริการได้รับการติดตั้งบน Windows และทำงานอยู่ ตรวจสอบสถานะบริการได้ใน services.msc
คอนโซลหรือใช้ PowerShell:
Get-Service Winmgmt | Select DisplayName,Status,ServiceName
หากบริการ Winmgmt ทำงานอยู่ คุณสามารถทดสอบความสมบูรณ์ของ WMI ได้ด้วยการสอบถามด้วยคำสั่ง WMI อย่างง่าย คุณสามารถดำเนินการคำขอ wmi จากพรอมต์คำสั่งหรือจาก PowerShell ตัวอย่างเช่น คำสั่งต่อไปนี้จะแสดงรายการโปรแกรมที่ติดตั้งบน Windows:
wmic product get name,version
คำสั่ง PowerShell ที่ง่ายที่สุดในการรับข้อมูลเกี่ยวกับเวอร์ชันและบิลด์ของ Windows 10 ผ่าน WMI อาจมีลักษณะดังนี้:
get-wmiobject Win32_OperatingSystem
อย่างที่คุณเห็น บริการ WMI ตอบสนองต่อคำขออย่างถูกต้อง หาก Windows ส่งกลับข้อผิดพลาดเมื่อเรียกใช้แบบสอบถาม WMI ดังกล่าว เป็นไปได้มากว่าบริการ WMI ทำงานไม่ถูกต้อง ที่เก็บ WMI เสียหาย หรือมีปัญหาอื่นๆ
ในกรณีของฉัน ตัวอย่างเช่น เมื่อเปิดคุณสมบัติการควบคุม WMI ในสแน็ปอินการจัดการคอมพิวเตอร์ (compmgmt.msc
) ปรากฏข้อความต่อไปนี้:
Failed to initialize all required WMI classes Win32_Processor. WMI: Invalid namespace Win32_WMISetting. WMI: Invalid namespace Win32_OperationSystem. WMI: Invalid namespace
ก่อนหน้านี้ เครื่องมือทางการของ Microsoft WMIDiag.vbs (Microsoft WMI Diagnosis) ใช้ในการวินิจฉัย WMI WMIdiag เป็นสคริปต์ vbs ที่ตรวจสอบระบบย่อย WMI ต่างๆ และเขียนข้อมูลที่รวบรวมไปยังไฟล์บันทึก (โดยค่าเริ่มต้น บันทึกจะอยู่ในโฟลเดอร์ %TEMP% – C:\USERS\%USERNAME%\APPDATA\LOCAL\TEMP\
). รายงานผลลัพธ์ประกอบด้วยไฟล์ที่มีชื่อขึ้นต้นด้วย WMIDIAG-V2.2 และมีประเภทไฟล์ต่อไปนี้:
- ไฟล์บันทึกประกอบด้วยรายงานโดยละเอียดเกี่ยวกับกิจกรรมและการทำงานของเครื่องมือ WMIDiag
- ไฟล์ TXT มีรายงานสรุปข้อผิดพลาดที่พบซึ่งควรค่าแก่การเอาใจใส่
- ไฟล์ CSV มีข้อมูลที่จำเป็นสำหรับการวิเคราะห์ประสิทธิภาพของ WMI ในระยะยาว
c:\windows\System32\cscript.exe wmidiag.vbs
ไม่เช่นนั้น จะเกิดข้อผิดพลาด:
WMIDiag must be run from native 64-bit environment. It is not supported in Wow64.
หลังจากที่ WMIDiag ทำงานเสร็จแล้ว ผู้ดูแลระบบควรตรวจสอบไฟล์บันทึก วิเคราะห์และพยายามแก้ไขข้อผิดพลาดที่พบ
ขออภัย WMIDiag 2.2 เวอร์ชันล่าสุดทำงานได้อย่างถูกต้องเฉพาะกับเวอร์ชันที่สูงถึง Windows 8.1/Windows Server 2012 R2 เท่านั้น ณ จุดนี้ Microsoft ได้ลบลิงก์เพื่อดาวน์โหลด WMIDiag จาก Download Center แต่ถ้าคุณต้องการ สคริปต์นี้สามารถพบได้บนเว็บ
WMIDiag ให้ข้อมูลโดยละเอียดเกี่ยวกับวิธีการแก้ไขข้อผิดพลาดในเครื่องใน WMI แต่โดยส่วนใหญ่แล้ว จะเป็นงานที่ต้องใช้เวลามากและคุ้มค่ากับเวลาที่ใช้ไปเมื่อมองหาวิธีแก้ไขปัญหาในระบบที่สำคัญเท่านั้น (โดยปกติคือบนเซิร์ฟเวอร์ที่ใช้งานจริง) . ในกรณีของเวิร์กสเตชันของผู้ใช้ การรีเซ็ตและสร้างที่เก็บ WMI ใหม่ใน Windows จะง่ายกว่ามาก
การซ่อมแซมที่เก็บ WMI และการคอมไพล์ไฟล์ MOF ใหม่
ใน Windows 10/Windows Server 2016 คุณสามารถตรวจสอบความสมบูรณ์ของที่เก็บ WMI ได้โดยใช้คำสั่ง:
winmgmt /verifyrepository
ถ้าคำสั่งส่งกลับว่าฐานข้อมูล WMI อยู่ในสถานะไม่สอดคล้องกัน (INCONSISTENT
หรือ WMI repository verification failed
) คุณควรลองทำการแก้ไขข้อผิดพลาดของที่เก็บ WMI:
Winmgmt /salvagerepository
WMI repository has been salvaged.
คำสั่งนี้จะตรวจสอบความสอดคล้องของที่เก็บ WMI และสร้างฐานข้อมูล WMI ใหม่ หากพบความไม่สอดคล้องกัน
เริ่มบริการ WMI ใหม่:
net stop Winmgmt
net start Winmgmt
หากการแก้ไข WMI มาตรฐานใช้ไม่ได้ ให้ลองใช้สคริปต์ต่อไปนี้ สคริปต์นี้เป็นตัวเลือก "อ่อน" สำหรับการกู้คืนบริการ WMI บนคอมพิวเตอร์ (ไลบรารี DLL และ WMI ได้รับการลงทะเบียนใหม่ และไฟล์ MOF จะถูกคอมไพล์ใหม่) ขั้นตอนนี้ปลอดภัย และการใช้งานไม่ควรทำให้เกิดปัญหากับระบบปฏิบัติการอีกต่อไป:
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
cd %windir%\SysWOW64\wbem
คุณสามารถเรียกใช้คำสั่งเหล่านี้ได้โดยวางคำสั่งเหล่านี้ลงในพร้อมท์คำสั่ง หรือคุณสามารถบันทึกสคริปต์เป็นไฟล์ BAT (wmi_soft_repair.bat ) และเรียกใช้ด้วยสิทธิ์ของผู้ดูแลระบบ หลังจากสคริปต์เสร็จสิ้น ให้รีสตาร์ท Windows และตรวจสอบว่า WMI ทำงานหรือไม่
สร้างที่เก็บ WMI ใหม่
หากวิธีการที่อธิบายไว้ข้างต้นไม่ได้ผล ให้ใช้วิธีการกู้คืน WMI ที่ "ยากกว่า" ซึ่งหมายถึงการสร้างที่เก็บ WMI ขึ้นมาใหม่
ที่เก็บ WMI อยู่ใน%windir%\System32\Wbem\Repository
และเป็นฐานข้อมูลที่มีข้อมูลเมตาดาต้าและคำจำกัดความของคลาส WMI ในบางกรณี ที่เก็บ WMI ยังสามารถมีข้อมูลคลาสสแตติก เมื่อที่เก็บเสียหาย ข้อผิดพลาดเกิดขึ้นในกิจกรรมของบริการ WMI (Winmgmt) หากคุณสงสัยว่าที่เก็บ WMI เสียหาย โปรดทราบว่าควรสร้างใหม่ก็ต่อเมื่อวิธีการอื่นในการกู้คืน WMI ไม่มีประสิทธิภาพ
คำสั่งต่อไปนี้จะรีเซ็ตฐานข้อมูล WMI เป็นสถานะดั้งเดิม (เช่นหลังจากติดตั้ง Windows ใหม่ทั้งหมด) ใช้คำสั่งนี้เพื่อฮาร์ดรีเซ็ตที่เก็บ WMI หากพารามิเตอร์ salvagerepository ไม่สามารถแก้ไขปัญหาได้:
Winmgmt /resetrepository
หากทั้งสองคำสั่ง (Winmgmt /salvagerepository
และ Winmgmt /resetrepository
) ไม่ได้กู้คืนสถานะที่สอดคล้องกันของฐานข้อมูล WMI พยายามทำการฮาร์ดรีเซ็ตฐานข้อมูล WMI ด้วยสคริปต์ต่อไปนี้:
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
ใน Windows รุ่น 64 บิต คุณต้องลงทะเบียน DLL/EXE ใหม่ และคอมไพล์ไฟล์ MOF ใหม่ในไดเรกทอรี %windir%\sysWOW64\wbem
สคริปต์นี้จะลบและสร้างโฟลเดอร์ที่เก็บ WMI ใหม่ทั้งหมด (ที่เก็บเก่าจะถูกบันทึกไว้ในไดเร็กทอรี Repos_backup) หลังจากสคริปต์เสร็จสิ้น คุณต้องรีสตาร์ท Windows จากนั้นตรวจสอบบริการ WMI ด้วยแบบสอบถามง่ายๆ
ตรวจสอบสถานะที่เก็บ WMI หากข้อผิดพลาดได้รับการแก้ไข winmgmt /verifyrepository
คำสั่งควรส่งคืน:
WMI repository is consistent
ในบทความนี้ เราได้แสดงวิธีพื้นฐานในการวินิจฉัยและแก้ไขปัญหาบริการและที่เก็บ WMI