ผู้ดูแลระบบ Windows ที่มีประสบการณ์ทุกคนคงเคยเผชิญปัญหากับบริการ WMI (Windows Management Instrumentation) และองค์ประกอบต่างๆ ของมัน ปัญหาในระบบย่อย WMI สำคัญต่อการทำงานปกติของ Windows ดังนั้นผู้ดูแลจึงต้องตรวจสอบและกู้คืนการทำงานของ WMI ให้เร็วที่สุด ในบทความนี้เราจะอธิบายเทคนิคการแก้ไขปัญหาและซ่อมแซม WMI บน Windows 10 และ Windows Server 2016/2019 อย่างง่ายๆ
อาการของปัญหา WMI
ปัญหา 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) ถูกติดตั้งและกำลังทำงานอยู่หรือไม่ สามารถตรวจสอบสถานะบริการได้ในคอนโซล services.msc หรือใช้ PowerShell:
Get-Service Winmgmt | Select DisplayName,Status,ServiceName
หากบริการ Winmgmt ทำงานอยู่ สามารถทดสอบสุขภาพของ WMI โดยสอบถามด้วยคำสั่ง WMI เรียบง่าย จากพรอมต์คำสั่งหรือ PowerShell ตัวอย่างเช่น คำสั่งต่อไปนี้จะแสดงรายการโปรแกรมที่ติดตั้งบน Windows:
wmic product get name,version
คำสั่ง PowerShell ที่ง่ายที่สุดเพื่อดูข้อมูลเวอร์ชันและบิลด์ของ Windows 10 ผ่าน WMI อาจเป็นดังนี้:
get-wmiobject Win32_OperatingSystem
หาก Windows ส่งคืนข้อผิดพลาดเมื่อรันคำสอบถาม WMI แสดงว่าบริการ WMI ทำงานไม่ถูกต้อง WMI repository อาจเสียหาย หรือมีปัญหาอื่นๆ
ตัวอย่างเช่น เมื่อเปิดคุณสมบัติ WMI Control ในสแนปอิน Computer Management (compmgmt.msc) อาจปรากฏข้อความ:
Failed to initialize all required WMI classes Win32_Processor. WMI: Invalid namespace Win32_WMISetting. WMI: Invalid namespace Win32_OperationSystem. WMI: Invalid namespace
เครื่องมือ WMIDiag.vbs (Microsoft WMI Diagnosis)
ก่อนหน้านี้เครื่องมืออย่างเป็นทางการของ Microsoft คือ WMIDiag.vbs ถูกใช้วินิจฉัย WMI WMIdiag เป็นสคริปต์ VBS ที่ตรวจสอบระบบย่อย WMI ต่างๆ และเขียนข้อมูลที่รวบรวมได้ลงไฟล์ล็อก (โดยค่าเริ่มต้นอยู่ในโฟลเดอร์ %TEMP% – C:\USERS\%USERNAME%\APPDATA\LOCAL\TEMP\) รายงานผลประกอบด้วยไฟล์ที่ขึ้นต้นด้วย WMIDIAG-V2.2 และมีประเภทไฟล์ดังนี้:
- ไฟล์ LOG: รายงานรายละเอียดกิจกรรมและการทำงานของเครื่องมือ WMIDiag
- ไฟล์ TXT: รายงานสรุปข้อผิดพลาดที่ควรสนใจ
- ไฟล์ CSV: ข้อมูลสำหรับการวิเคราะห์ประสิทธิภาพ WMI jang ยาวนาน
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 ในเครื่องท้องถิ่น แต่ในกรณีส่วนใหญ่เป็นงานที่ใช้เวลานาน และคุ้มค่าเฉพาะระบบสำคัญ (ปกติคือเซิร์ฟเวอร์Production) สำหรับสถานีทำงานของผู้ใช้ จะง่ายกว่ามากที่จะรีเซ็ตและสร้าง WMI repository ใหม่ใน Windows
ซ่อมแซม WMI Repository และคอมไพล์ไฟล์ MOF ใหม่
บน Windows 10/Windows Server 2016 สามารถตรวจสอบความสมบูรณ์ของ WMI repository ด้วยคำสั่ง:
winmgmt /verifyrepository
หากคำสั่งรายงานว่าฐานข้อมูล WMI อยู่ในสถานะไม่สอดคล้อง (INCONSISTENT หรือ WMI repository verification failed) ควรลองซ่อมแซมแบบนุ่มนวล (soft fix) ก่อน:
Winmgmt /salvagerepository
WMI repository has been salvaged.
คำสั่งนี้ตรวจสอบความสอดคล้องของ WMI repository และสร้างฐานข้อมูล WMI ใหม่หากพบความไม่สอดคล้อง
รีสตาร์ทบริการ WMI:
net stop Winmgmt
net start Winmgmt
หากวิธีมาตรฐานไม่ได้ผล ให้ลองสคริปต์ต่อไปนี้ สคริปต์นี้เป็นตัวเลือก "นุ่มนวล" สำหรับกู้คืนบริการ 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
บน Windows 64-bit ต้องทำขั้นตอนเหล่านี้สำหรับไดเรกทอรี SysWOW64 ด้วย โดยเปลี่ยนบรรทัดที่ 3 เป็น:
cd %windir%\SysWOW64\wbem
คำสั่งเหล่านี้สามารถรันได้โดยการวางลงในพรอมต์คำสั่ง หรือบันทึกเป็นไฟล์ BAT (wmi_soft_repair.bat) และรันด้วยสิทธิ์ผู้ดูแล หลังสคริปต์เสร็จ ให้รีสตาร์ท Windows และตรวจสอบว่า WMI ทำงานปกติหรือไม่
สร้าง WMI Repository ใหม่ (Rebuilding)
หากวิธีข้างต้นไม่ช่วย ให้ใช้วิธี "แข็งแรง" (hard) ที่สร้าง WMI repository ใหม่ทั้งหมด
WMI repository ตั้งอยู่ที่ %windir%\System32\Wbem\Repository เป็นฐานข้อมูลที่เก็บข้อมูลเมตาและนิยามคลาส WMI ในบางกรณีอาจมีข้อมูลคลาสแบบคงที่ (static) เมื่อ repository เสียหาย จะเกิดข้อผิดพลาดในการทำงานของบริการ WMI (Winmgmt)
คำสั่งต่อไปนี้จะรีเซ็ตฐานข้อมูล WMI กลับสู่สภาพเดิม (เหมือนหลังติดตั้ง Windows ใหม่) ใช้คำสั่งนี้เพื่อ hard reset WMI repository หาก salvagerepository ไม่ช่วย:
Winmgmt /resetrepository
หากคำสั่งทั้งสอง (Winmgmt /salvagerepository และ Winmgmt /resetrepository) ไม่สามารถกู้คืนสถานะสอดคล้องของฐานข้อมูล WMI ได้ ให้ลองทำ hard reset ด้วยสคริปต์ต่อไปนี้:
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-bit ต้องลงทะเบียน DLL/EXE และคอมไพล์ไฟล์ MOF ในไดเรกทอรี %windir%\sysWOW64\wbem ด้วย
สคริปต์นี้จะลบและสร้างโฟลเดอร์ WMI repository ใหม่ทั้งหมด (repository เก่าจะถูกเก็บไว้ที่โฟลเดอร์ Repos_backup) หลังสคริปต์เสร็จ ให้รีสตาร์ท Windows แล้วตรวจสอบบริการ WMI ด้วยคำสอบถามง่ายๆ
ตรวจสอบสถานะ WMI repository หากข้อผิดพลาดได้รับการแก้ไข คำสั่ง winmgmt /verifyrepository ควรคืนค่า:
WMI repository is consistent
ในบทความนี้เราได้แสดงวิธีพื้นฐานในการวินิจฉัยและแก้ไขปัญหาบริการและ repository ของ WMI