Cómo reparar el repositorio WMI cuando obtenemos errores al intentar acceder a alguna propiedad del Namespace raíz root\CIMV2, indicando que no existe la clase.
- Error al acceder al repositorio WMI.
- Verificar y reparar el repositorio WMI cuando hay problemas de acceso en Windows 10 y Windows 11.
Error al acceder al repositorio WMI
La información WMI se estructura, básicamente, en ramas (Espacios de nombres o Namespaces). Dentro de cada espacio de nombres hay una serie de propiedades con sus valores correspondientes. El Namespace por defecto suele ser root\CIMV2.
En algunos equipos Windows 10, Windows 11, cuando intentamos obtener algún valor de alguna propiedad de WMI, del namespace por defecto root\CIMV2. Por ejemplo, cuando queremos obtener las propiedades y sus valores de «Win32_OperatingSystem» (ubicado en el Namespace root\cimv2″, ejecutaremos ejecutando el siguiente PowerShell:
1 |
Get-WmiObject -Namespace "root\cimv2" -Class Win32_OperatingSystem |
Y nos devuelve algún error, del tipo «Clase no válida». O bien, intentando obtener la misma información anterior desde un método C#, como el siguiente:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 |
public void ObtenerSistemaOperativo() { try { ManagementObjectSearcher objBusquedaWMI = new ManagementObjectSearcher("SELECT Caption, Version, CSDVersion," + " SerialNumber, BuildNumber FROM Win32_OperatingSystem"); foreach (ManagementObject propiedad in objBusquedaWMI.Get().Cast<ManagementObject>()) { try { SONombre = string.IsNullOrEmpty(propiedad["Caption"].ToString()) ? "" : propiedad["Caption"].ToString(); } catch { SONombre = ""; } try { SOVersion = string.IsNullOrEmpty(propiedad["Version"].ToString()) ? "" : propiedad["Version"].ToString(); } catch { SOVersion = ""; } try { var prop = propiedad["CSDVersion"]; if (prop != null) SOServicePack = prop.ToString(); else SOServicePack = ""; } catch { SOServicePack = ""; } try { SONumeroSerie = string.IsNullOrEmpty(propiedad["SerialNumber"].ToString()) ? "" : propiedad["SerialNumber"].ToString(); } catch { SONumeroSerie = ""; } try { SOBuildNumber = string.IsNullOrEmpty(propiedad["SOBuildNumber"].ToString()) ? "" : propiedad["SOBuildNumber"].ToString(); } catch { SOBuildNumber = ""; } try { SOServicePackMajor = string.IsNullOrEmpty(propiedad["ServicePackMajorVersion"].ToString()) ? "" : propiedad["ServicePackMajorVersion"].ToString(); } catch { SOServicePackMajor = ""; } try { SOServicePackMinor = string.IsNullOrEmpty(propiedad["ServicePackMinorVersion"].ToString()) ? "" : propiedad["ServicePackMinorVersion"].ToString(); } catch { SOServicePackMinor = ""; } break; //Sólo habrá una instancia } } catch (Exception error) { SONombre = ""; SOVersion = ""; SOServicePack = ""; SONumeroSerie = ""; SOBuildNumber = ""; SOServicePackMajor = ""; SOServicePackMinor = ""; string mensaje = $"Error al obtener datos del sistema operativo del equipo por WMI: {error.Message}"; Log.EsLog(mensaje, false); MDebug.ILogDebug(System.Reflection.MethodBase.GetCurrentMethod().Name, "Inventario - SO", "S", mensaje); } } |
Y devuelve un error del tipo:
Error al obtener datos del sistema operativo del equipo por WMI: Clase no válida
Esto puede suceder por varios motivos, uno de ellos es que se haya corrompido el Namespace root\CIMV2 de WMI, por lo que no se tendrá acceso a sus propiedades y valores.
Incluso si accedemos al «Control WMI»,desde «Administración de equipos» (pulsando con el botón derecho sobre el icono del menú inicio):
Desplegando «Servicios y Aplicaciones» [2], pulsando con el botón derecho del ratón sobre «Control WMI» [2] y eligiendo «Propiedades» [3] en el menú emergente:
En los equipos con problemas en el WMI puede que nos muestre un mensaje indicando que no ha sido posible obtener la información básica de ejemplo. En la siguiente captura se muestra lo que aparecerá si WMI es correcto:
A continuación indicamos un posible método para solucionar el error anterior.
Verificar y reparar el repositorio WMI cuando hay problemas de acceso en Windows 10 y Windows 11
Para verificar que WMI es correcto podemos ejecutar el siguiente comando:
1 |
winmgmt /verifyrepository |
Este comando devolverá el mensaje:
El repositorio de WMI es coherente.
Aunque el mensaje anterior no garantiza que todos los Namespaces estén correctos. En nuestro laboratirio, para un equipo con problemas de acceso al Namespace root\CIMV2, el comando anterior indicaba que el repositorio era correcto (y no era cierto).
Ejecutamos este comando para intentar reparar el repositorio WMI:
1 |
winmgmt /salvagerepository |
Devolviendo el mensaje:
El repositorio de WMI es coherente.
Pero tampoco solucionó el problema.
El comando que reseteó el repositorio WMI y solucionó el problema, fue:
1 |
winmgmt /resetrepository |
Devolviendo el mensaje:
Se restableció el repositorio de WMI.
Si ejecutamos ahora el comando Powershell para obtener información de alguna propiedad del Namespace root\CIMV2 funcionará correctamente: