minor improvements

This commit is contained in:
2023-10-03 16:23:51 -04:00
parent de68ede13a
commit c50ce1097f
+32 -20
View File
@@ -1,9 +1,8 @@
# Guard to exit script if WMI does not appear to be installed at all # Guard to exit script if WMI does not appear to be installed at all
If ( !(Test-Path "${Env:SystemRoot}\System32\wbem") ) If ( !(Test-Path "${Env:SystemRoot}\System32\wbem") ) { Write-Error "WMI components are not present on this device. Please install them manually." ; Exit 1 }
{ Write-Error "WMI components are not present on this device. Please install them manually." ; Exit }
# Function to test if WMI is functioning correctly # Function to test if WMI is functioning correctly
Function Verify-WMIFunctionality { Function Test-WMIFunctionality {
# Track the number of failed functionality tests # Track the number of failed functionality tests
$WMIErrorLevel = 0 $WMIErrorLevel = 0
@@ -14,7 +13,7 @@ Function Verify-WMIFunctionality {
$Property = 'LastBootUpTime' $Property = 'LastBootUpTime'
# Test that our property has a value, and that the WBEM folder exists. # Test that our property has a value, and that the WBEM folder exists.
If ( $(Get-CimInstance -ClassName $Class -ErrorAction SilentlyContinue | Select-Object $Property -ErrorAction SilentlyContinue).$Property -eq $null ) If ( $null -eq $(Get-CimInstance -ClassName $Class -ErrorAction SilentlyContinue | Select-Object $Property -ErrorAction SilentlyContinue).$Property )
{ Write-Error "Failed to query ${Class} for the value of ${Property}" ; $WMIErrorLevel++ } { Write-Error "Failed to query ${Class} for the value of ${Property}" ; $WMIErrorLevel++ }
# Test that the WMI repository is consistent # Test that the WMI repository is consistent
@@ -26,17 +25,15 @@ Function Verify-WMIFunctionality {
} }
# Guard to exit script if no repair is necessary # Guard to exit script if no repair is necessary
If ( Verify-WMIFunctionality ) { Exit } If ( Test-WMIFunctionality ) { Write-Output "WMI components are functioning correctly" ; Exit 0 }
Write-Output "Attempting to salvage WMI repository"
# Attempt to salvage WMI repository and exit script if no further repair is necessary # Attempt to salvage WMI repository and exit script if no further repair is necessary
Write-Output "Attempting to salvage WMI repository"
$WMIRepoSalvage = (winmgmt.exe /salvagerepository) $WMIRepoSalvage = (winmgmt.exe /salvagerepository)
If ( !($WMIRepoSalvage -contains "failed") -and (Verify-WMIFunctionality) ) { Exit } If ( ($WMIRepoSalvage -notcontains "failed") -and (Test-WMIFunctionality) ) { Write-Output "WMI repository successfully salvaged" ; Exit 0 }
Write-Error "Failed to salvage WMI repository"
Try { Try {
Write-Output "Attempting manual reinitialization of WMI" Write-Output "Failed to salvage WMI repository, attempting manual reinitialization of WMI"
# Disable and stop the winmgmt service # Disable and stop the winmgmt service
Write-Output "Stopping and disabling WMI service" Write-Output "Stopping and disabling WMI service"
@@ -46,34 +43,49 @@ Try {
# Set the WBEM directory for manual refresh of WMI components # Set the WBEM directory for manual refresh of WMI components
$TargetDir = "${Env:WinDir}\System32\wbem" $TargetDir = "${Env:WinDir}\System32\wbem"
# Rename the Repository directory to Rep_bak # Rename the Repository directory to Repo_backup
If ( Test-Path "${TargetDir}\Rep_bak" ) { Remove-Item "${TargetDir}\Rep_bak" -Recurse -Force -ErrorAction SilentlyContinue } If ( Test-Path "${TargetDir}\Repo_backup" ) { Remove-Item "${TargetDir}\Repo_backup" -Recurse -Force -ErrorAction SilentlyContinue }
If ( Test-Path "${TargetDir}\Repository" ) { Rename-Item -Path "${TargetDir}\Repository" -NewName "${TargetDir}\Rep_bak" -Force } If ( Test-Path "${TargetDir}\Repository" ) { Rename-Item -Path "${TargetDir}\Repository" -NewName "${TargetDir}\Repo_backup" -Force }
# Register all *.dll files # Register all *.dll files
Write-Output "Registering all DLL files in ""${TargetDir}""" Write-Output "Registering all DLL files in ""${TargetDir}"""
$WMIDlls = Get-ChildItem -Path "${TargetDir}\*" -File -Include *.dll $WMIDlls = Get-ChildItem -Path "${TargetDir}\*" -File -Include *.dll
ForEach ( $dll in $WMIDlls ) { $path = $dll.FullName ; Start-Process "regsvr32.exe" -ArgumentList "/s ""${path}""" -Wait } ForEach ( $dll in $WMIDlls ) {
$path = $dll.FullName
Write-Output " ""${path}"""
Start-Process "regsvr32.exe" -ArgumentList "/s ""${path}""" -Wait
}
#Register all *.exe files # Register all *.exe files except for:
Write-Output "Registering all EXE files in ""${TargetDir}""" # wbemcntl.exe, wbemtest.exe, mofcomp.exe
$WMIExes = Get-ChildItem -Path "${TargetDir}\*" -File -Include *.exe | Where { ($_.BaseName.ToLower() -ne "wbemcntl") -and ($_.BaseName.ToLower() -ne "wbemtest") -and ($_.BaseName.ToLower() -ne "mofcomp") } Write-Output "Registering all supported EXE files in ""${TargetDir}"""
ForEach ( $exe in $WMIExes ) { $path = $exe.FullName ; Start-Process $path -ArgumentList "/regserver" -Wait } $WMIExes = Get-ChildItem -Path "${TargetDir}\*" -File -Include *.exe | Where-Object { ($_.BaseName.ToLower() -ne "wbemcntl") -and ($_.BaseName.ToLower() -ne "wbemtest") -and ($_.BaseName.ToLower() -ne "mofcomp") }
ForEach ( $exe in $WMIExes ) {
$path = $exe.FullName
Write-Output " ""${path}"""
Start-Process $path -ArgumentList "/regserver" -Wait
}
# Register all *.mof and *.mfl files # Register all *.mof and *.mfl files
Write-Output "Compiling all MOF and MFL files in ""${TargetDir}""" Write-Output "Compiling all MOF and MFL files in ""${TargetDir}"""
$WMIMofs = Get-ChildItem -Path "${TargetDir}\*" -File -Include *.mof,*.mfl $WMIMofs = Get-ChildItem -Path "${TargetDir}\*" -File -Include *.mof,*.mfl
ForEach ( $mof in $WMIMofs ) { $path = $mof.FullName ; Start-Process "${TargetDir}\mofcomp.exe" -ArgumentList """${path}""" -Wait } ForEach ( $mof in $WMIMofs ) {
$path = $mof.FullName
Write-Output " ""${path}"""
Start-Process "${TargetDir}\mofcomp.exe" -ArgumentList """${path}""" -Wait
}
} }
Catch { Write-Error $_.Exception.Message } Catch { Write-Error $_.Exception.Message }
Finally { Finally {
# Start the winmgmt service # Start the winmgmt service
Write-Output "Enabling and starting WMI service"
Set-Service -Name winmgmt -StartupType Automatic Set-Service -Name winmgmt -StartupType Automatic
Start-Service -Name winmgmt Start-Service -Name winmgmt
} }
# Final test of WMI # Final test of WMI
If ( !(Verify-WMIFunctionality) ) { Write-Output "WMI repair failed. Please restart this device and run this script again." } If ( !(Test-WMIFunctionality) ) { Write-Output "WMI repair failed. Please restart this device and run this script again" ; Exit 1 }
Write-Output "WMI has bee successfully repaired!"