Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
En este artículo se proporciona un script para compilar todos los archivos de formato de objeto administrado (MOF) registrados.
El repositorio instrumental de administración de Windows (WMI), con el registro de clases y proveedores, se crea mediante la compilación de varios archivos MOF.
La mayoría de los archivos MOF se encuentran en la carpeta C:\Windows\System32\wbem , pero muchos otros también pueden encontrarse en la carpeta de la aplicación que registra clases o proveedores adicionales.
La lista de MOF compilados se mantiene en el valor HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Wbem\CIMOM\Autorecover MOFs
del Registro .
Si WMI detecta que el repositorio está dañado e inutilizable, creará un nuevo repositorio vacío y compilará automáticamente todas las MOF enumeradas en el valor del Registro para restaurar todos los objetos esperados.
Si encuentra un comportamiento extraño que podría estar relacionado con algunas clases o proveedores que no se registran correctamente, puede volver a compilar todos los archivos MOF con el siguiente script. El script exporta una copia del valor del Registro antes de iniciar la compilación y registrar un registro de todas las operaciones ejecutadas y sus resultados.
Importante
Este script de ejemplo no se admite en ningún programa o servicio de soporte técnico estándar de Microsoft.
El script de ejemplo se proporciona AS IS sin garantía de ningún tipo. Microsoft renuncia aún más a todas las garantías implícitas, incluidas, sin limitación, ninguna garantía implícita de comerciabilidad o de idoneidad para un propósito determinado.
Todo el riesgo derivado del uso o el rendimiento de los scripts y la documentación de ejemplo permanecen con usted. En ningún caso, Microsoft, sus autores o cualquier otra persona implicada en la creación, producción o entrega de los scripts será responsable de cualquier daño (incluidos, sin limitación, daños por pérdida de beneficios empresariales, interrupción empresarial, pérdida de información comercial u otra pérdida pecuniaria) derivado del uso o incapacidad de usar los scripts o documentación de ejemplo, incluso si Microsoft se ha informado de la posibilidad de tales daños.
Function Write-Log {
param( [string] $msg )
$msg = (get-date).ToString("yyyyMMdd HH:mm:ss.fff") + " " + $msg
Write-Host $msg
$msg | Out-File -FilePath $outfile -Append
}
$myWindowsID = [System.Security.Principal.WindowsIdentity]::GetCurrent()
$myWindowsPrincipal = new-object System.Security.Principal.WindowsPrincipal($myWindowsID)
$adminRole = [System.Security.Principal.WindowsBuiltInRole]::Administrator
if (-not $myWindowsPrincipal.IsInRole($adminRole)) {
Write-Output "This script needs to be run as Administrator"
exit
}
$Root = Split-Path (Get-Variable MyInvocation).Value.MyCommand.Path
$resName = "CompMOF-" + $env:computername +"-" + $(get-date -f yyyyMMdd_HHmmss)
$resDir = $Root + "\" + $resName
$outfile = $resDir + "\script-output.txt"
$errfile = $resDir + "\script-errors.txt"
$RdrOut = " >>""" + $outfile + """"
$RdrErr = " 2>>""" + $errfile + """"
New-Item -itemtype directory -path $resDir | Out-Null
New-PSDrive -PSProvider registry -Root HKEY_LOCAL_MACHINE -Name HKLM -ErrorAction SilentlyContinue | Out-Null
$mof = (get-itemproperty -ErrorAction SilentlyContinue -literalpath ("HKLM:\SOFTWARE\Microsoft\Wbem\CIMOM")).'Autorecover MOFs'
if ($mof.length -eq 0) {
Write-Log ("The registry key ""HKLM:\SOFTWARE\Microsoft\Wbem\CIMOM\Autorecover MOFs"" is missing or empty")
exit
}
$mof | Out-File ($resDir + "\Autorecover MOFs.txt")
foreach ($line in $mof) {
if ($line.ToLower().contains("uninstall")) {
Write-Log ("Skipping " + $line)
} else {
$line = $line.Replace("%windir%", $env:windir)
$line = $line.Replace("%ProgramFiles%", $env:ProgramFiles)
if ($line -gt "") {
if (Test-path $line) {
Write-Log ("Compiling " + $line)
$cmd = "mofcomp """ + $line + """"+ $RdrErr
Write-Log $cmd
Invoke-Expression ($cmd) | Out-File -FilePath $outfile -Append
} else {
Write-Log ("Missing file " + $line)
}
}
}
}