Пошук та усунення несправностей в WMI

Будь бувалий Windows-адмін не раз стикався з проблемами в роботі служби WMI і її компонентах. Наявність проблем в підсистемі WMI є вкрай важливим заходом із точки зору нормального функціонування системи, тому адміністратору доводиться вдаватися до тих чи інших трюків, що дозволяє відновити працездатність WMI. У цій статті ми опишемо досить просту методику діагностування та усунення неполадок в службі WMI.

Про наявність проблем з WMI може свідчити широкий спектр помилок:

  • Помилки обробки WMI запитів в системних журналах і логах додатків
  • Помилки GPO, зав'язані на WMI (некоректна робота wmi фільтрів політик, і ін.)
  • Помилки в роботі / неможливість установки агентів SCCM / SCOM
  • Помилки в роботі скриптів (vbs або powershell), що використовують простір імен WMI

В першу чергу потрібно перевірити чи є в системі служба Windows Management Instrumentation (Winmgmt) і включена вона.

Якщо служба присутній і знаходиться в стані Started, рекомендується протестувати працездатність WMI, звернувшись до неї за допомогою простого wmi-запиту. За допомогою Powershell, наприклад, це можна зробити так:

get-wmiobject Win32_OperatingSystem

Якщо при виконанні найпростішого WMI-запиту система повертає помилку (на скріншоті наведено приклад коректної відповіді служби WMI), ймовірно має місце некоректне функціонування сервісу WMI або ряду його підсистем, пошкодження сховища WMI або інші проблеми.
зміст:

  • утиліта WMIDiag
  • Перереєстрація бібліотек WMI і перекомпіляція mof файлів
  • Перестворення сховища (сховища) WMI

утиліта WMIDiag

Для "тонкої" діагностики служби WMI існує офіційна утиліта Microsoft - WMIDiag (Microsoft WMI Diagnosis). Утиліта представляє собою vbs скрипт, який перевіряє різні підсистеми WMI і записує зібрану інформацію в лог файли (за замовчуванням логи знаходяться в каталозі% TEMP% - C: \ USERS \% USERNAME% \ APPDATA \ LOCAL \ TEMP \). Одержаний звіт складається з файлів, імена яких починаються з WMIDIAG-V2.1 і включає в себе наступні типи фалів:

  • .log файли містять детальний звіт про активність і роботі утиліти WMIDiag
  • .txt файли містять підсумкові звіти про знайдені помилки, на які варто звернути увагу
  • У .csv файлах міститься інформація, необхідна для довгострокового аналізу роботи підсистеми WMI

Порада. У 64 бітових версіях Windows wmidiag потрібно запускати так:

c: \ windows \ System32 \ cscript.exe wmidiag.vbs

в іншому випадку з'явиться помилка: WMIDiag must be run from native 64-bit environment. It is not supported in Wow64.

Після закінчення роботи утиліти WMIDiag адміністратор повинен вивчити отримані файли логів, проаналізувати і спробувати виправити знайдені помилки.

У загальному випадку, WMIDiag може дати інформацію щодо виправлення приватних помилок в WMI, але в більшості випадків процес це досить трудомісткий і коштує витраченого часу тільки при вирішенні інцидентів в критичних системах (як правило, на продуктивних серверах). Для масового сегмента робочих станцій користувачів набагато простіше "бити по площах" і вирішувати проблему роботи WMI більш радикально.

Перереєстрація бібліотек WMI і перекомпіляція mof файлів

Наступний скрипт являє собою "м'який" варіант відновлення працездатності служби 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 winmgmt / 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

Зазначені команди можна виконати шляхом простої вставки в вікно командного рядка, або зберегти код в bat файлі і запустити його з правами адміністратора. Після закінчення роботи скрипта, систему потрібно перезавантажити і знову перевірити роботу WMI.

Перестворення сховища (сховища) WMI

У тому випадку, якщо попередній спосіб не допоміг, доведеться перейти до більш "жорсткого" способу відновлення працездатності служби WMI, що полягає в пересоздании сховища.

WMI репозиторій (сховище) знаходиться в каталозі % Windir% \ System32 \ Wbem \ Repository і являє собою базу даних, в якій міститься інформація про метаданих і визначеннях WMI класів. У деяких випадках сховища WMI може містити статичну інформацію класів. При пошкодженні сховища WMI, в роботі служби Windows Management Instrumentation (Winmgmt) можуть спостерігатися помилки аж до повної неможливості її запустити.

У тому випадку, якщо ви підозрюєте, що репозиторій WMI пошкоджений, майте на увазі, що його пересозданіе це остання річ, до якої потрібно вдатися тільки в тому випадку, якщо ніякі інші операції реанімувати WMI не допомагають.

Порада. На практиці бувають випадки, коли пересозданіе сховища WMI призводить до проблем зі стороннім софтом. Викликаний цей ефект тим, що всі записи в базі WMI обнуляються (до стану чистої системи). Таке ПО, ймовірно, доведеться встановлювати заново в режимі відновлення.

У Windows Vista і вище перевірити цілісність репозиторію WMI можна за допомогою команди:

winmgmt / verifyrepository

Якщо команда повертає, що база даних WMI знаходиться в неконсістентном стані (INCONSISTENT), варто спробувати виконати "м'яке" відновлення сховища:

Winmgmt / salvagerepository

І перезапустити службу wmi:

net stop Winmgmt
net start Winmgmt

Якщо описана вище команда не допомогла, виконуємо скидання сховища на початковий стан (hard reset) так:

Winmgmt / resetrepository

У тому випадку, якщо команди Winmgmt / salvagerepository і Winmgmt / resetrepository бажаного ефекту не дали, варто спробувати виконати "жорстке" пересозданіе бази WMI вручну таким сценарієм:

sc config winmgmt start = disabled net stop winmgmt cd% windir% \ system32 \ wbem winmgmt / kill winmgmt / unregserver winmgmt / regserver 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

Даний скрипт повністю перестворює сховище WMI (старий сховища зберігається в каталозі Repos_bakup). Після закінчення роботи скрипта комп'ютер потрібно перезавантажити, після чого протестувати роботу служби WMI простим запитом.

У цій статті ми зібрали типові методики дозволяють усунути неполадки в роботі служби WMI і її підсистемах.