Udostępnij za pośrednictwem


Skrypty: kompilowanie wszystkich zarejestrowanych plików MOF

Ten artykuł zawiera skrypt umożliwiający skompilowanie wszystkich zarejestrowanych plików formatu obiektów zarządzanych (MOF).

Repozytorium Instrumentacja zarządzania Windows (WMI) z rejestracją klas i dostawców jest tworzone przez kompilowanie kilku plików MOF.

Większość plików MOF znajduje się w folderze C:\Windows\System32\wbem , ale wiele innych może również znajdować się w folderze aplikacji rejestrującej dodatkowe klasy lub dostawców.

Lista skompilowanych plików MOFs jest przechowywana w wartości HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Wbem\CIMOM\Autorecover MOFsrejestru .

Jeśli usługa WMI wykryje, że repozytorium jest uszkodzone i bezużyteczne, spowoduje utworzenie nowego pustego repozytorium i automatyczne skompilowanie wszystkich plików MOF wymienionych w wartości rejestru w celu przywrócenia wszystkich oczekiwanych obiektów.

Jeśli wystąpi dziwne zachowanie, które może być związane z niektórymi klasami lub dostawcami, które nie są prawidłowo zarejestrowane, możesz ponownie skompilować wszystkie pliki MOF za pomocą następującego skryptu. Skrypt eksportuje kopię wartości rejestru przed rozpoczęciem kompilacji i zarejestrowaniem dziennika wszystkich wykonanych operacji i ich wyników.

Ważne

Ten przykładowy skrypt nie jest obsługiwany w ramach żadnego standardowego programu lub usługi pomocy technicznej firmy Microsoft.

Przykładowy skrypt jest dostarczany w formacie AS IS bez gwarancji jakiegokolwiek rodzaju. Firma Microsoft w dalszym ciągu nie udziela wszelkich domniemanych gwarancji, w tym, bez ograniczeń, żadnych domniemanych gwarancji możliwości handlowych lub przydatności do określonego celu.

Całe ryzyko wynikające z użycia lub wydajności przykładowych skryptów i dokumentacji pozostaje dla Ciebie. W żadnym wypadku firma Microsoft, jej autorzy ani ktokolwiek inny zaangażowany w tworzenie, produkcję lub dostarczanie skryptów ponosi odpowiedzialność za wszelkie szkody (w tym, bez ograniczeń, szkody za utratę zysków biznesowych, przerw w działalności biznesowej, utratę informacji biznesowych lub inną stratę pieniężną) wynikające z używania lub niezdolności do korzystania z przykładowych skryptów lub dokumentacji, nawet jeśli firma Microsoft została poinformowana o możliwości wystąpienia takich szkód.

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)
      }
    }
  }
}