A powershell script that will monitor WMI service health and restart WMI service and processes if any error is detected. The health is monitored by running a couple of simple WMI queries. Once the query fails, the script will forcefully stop WMI services, kill any wmi processes that are still running and then restart WMI service and all services that depend on it.

The script is intended to run as scheduled task checking WMI health periodically.

 

 

PowerShell
Edit|Remove
function reset_wmi 
{ 
    # save list of running dependants 
    $dependencies = get-service winmgmt -DependentServices | Where-Object{ $_.Status -eq "Running" } 
 
    # force services to stop 
    Stop-Service "Winmgmt" -force -ErrorAction Ignore 
    Stop-Service "wmiApSrv" -force -ErrorAction Ignore 
 
    # kill Wmi processes if any still running 
    Get-Process "WmiPrvSE" | Stop-Process -Force -ErrorAction Ignore 
    Get-Process "WmiApSrv" | Stop-Process -Force -ErrorAction Ignore 
 
    # restart services 
    Start-Service "Winmgmt"  
    Start-Service "wmiApSrv" 
    $dependencies | Start-Service -ErrorAction Ignore 
} 
 
# register event log source if necessary 
 
$es = "WMI Watchdog Script" 
 
if (!(Get-Eventlog -LogName "Application" -Source $es -ErrorAction Ignore )) 
    { New-Eventlog -LogName "Application" -Source $es } 
 
 
 
Write-EventLog -LogName Application -source $es -EntryType Information -EventId 1 -Message "Checking WMI health..." 
 
 
try 
{ 
    # try to run a WMI query 
    gwmi -Class Win32_Service -ErrorAction Stop | Out-Null 
    gwmi -Class Win32_OperatingSystem -ErrorAction Stop | Out-Null 
} 
catch 
{ 
    # do restart on error 
    Write-EventLog -LogName Application -source $es -EntryType Error -EventId 100 -Message "WMI query failed: $($_.exception.message). Attempting WMI reset..."     
    try 
    { 
        reset_wmi 
        Write-EventLog -LogName Application -source $es -EntryType Information -EventId 2 -Message "WMI reset complete. Testing WMI query." 
        gwmi -Class Win32_Service -ErrorAction Stop | Out-Null 
    } 
    catch 
    { 
        Write-EventLog -LogName Application -source $es -EntryType Error -EventId 101 -Message "WMI reset failed: $($_.exception.message)"     
    } 
}