Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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 MOFs
rejestru .
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)
}
}
}
}