Hi,
this script repairs and recreates the WMI Repository of a Windows. For example, this occurs sometimes if you clone a Windows machine with an installed SCCM/SMS Client. The typical error in this case is “Failed to open to WMI namespace ‘\\.\root\CCM\SoftwareUpdates\DeploymentAgent’ (8007045b)”
Lasts start. Start a Powershell console as Administrator. Stop all services. Sometimes other services depends on the WMI Service and does not accept a stop request. Therefore you cannot stop the WMI service. TrendMicro Office is such a service. You have to kill them by TaskManager.
# Stop WMI # Only if SCCM/SMS Client is installed. Stop ccmexec. Stop-Service -Force ccmexec -ErrorAction SilentlyContinue Stop-Service -Force winmgmt
(Re)Register WMI binary components
[String[]]$aWMIBinaries=@("unsecapp.exe","wmiadap.exe","wmiapsrv.exe","wmiprvse.exe","scrcons.exe") foreach ($sWMIPath in @(($ENV:SystemRoot+"\System32\wbem"),($ENV:SystemRoot+"\SysWOW64\wbem"))){ if(Test-Path -Path $sWMIPath){ push-Location $sWMIPath foreach($sBin in $aWMIBinaries){ if(Test-Path -Path $sBin){ $oCurrentBin=Get-Item -Path $sBin Write-Host " Register $sBin" & $oCurrentBin.FullName /RegServer } else{ # Warning only for System32 if($sWMIPath -eq $ENV:SystemRoot+"\System32\wbem"){ Write-Warning "File $sBin not found!" } } } Pop-Location } }
Reregister WMI Managed Objects
if([System.Environment]::OSVersion.Version.Major -eq 5) { foreach ($sWMIPath in @(($ENV:SystemRoot+"\System32\wbem"),($ENV:SystemRoot+"\SysWOW64\wbem"))){ if(Test-Path -Path $sWMIPath){ push-Location $sWMIPath Write-Host " Register WMI Managed Objects" $aWMIManagedObjects=Get-ChildItem * -Include @("*.mof","*.mfl") foreach($sWMIObject in $aWMIManagedObjects){ $oWMIObject=Get-Item -Path $sWMIObject & mofcomp $oWMIObject.FullName } Pop-Location } } if([System.Environment]::OSVersion.Version.Minor -eq 1) { & rundll32 wbemupgd,UpgradeRepository } else{ & rundll32 wbemupgd,RepairWMISetup } } else{ # Other Windows Vista, Server 2008 or greater Write-Host " Reset Repository" & ($ENV:SystemRoot+"\system32\wbem\winmgmt.exe") /resetrepository & ($ENV:SystemRoot+"\system32\wbem\winmgmt.exe") /salvagerepository }
Starting services
Start-Service -Force winmgmt Start-Service -Force ccmexec -ErrorAction SilentlyContinue
Michael
Update 04/04/2014: Modified the script. From now, no more WMI queries are done by the script. The OS version is determined by the System.Environent class.
Thanks for this script, but I’m having trouble even running it on my windows 2008 host.
AuthorizationManager check failed.
At line:1 char:13
+ .\fixwmi.ps1 <<<<
+ CategoryInfo : NotSpecified: (:) [], PSSecurityException
+ FullyQualifiedErrorId : RuntimeException
I had the execution policy set to remote-signed, but now get-execution policy throws an error.
Get-ExecutionPolicy :
At line:1 char:20
+ Get-ExecutionPolicy <<<<
+ CategoryInfo : NotSpecified: (:) [Get-ExecutionPolicy], COMException
+ FullyQualifiedErrorId : System.Runtime.InteropServices.COMException,Microsoft.PowerShell.Commands.GetExecutionPo
licyCommand
I've heard this is because of WMI being broken, but I can't use your script.
Hi John, try the new updated script V1.1. I’ve replaced all WMI queries to determine the OS version with .NET System.Environment function calls.
What is the minimum version of PowerShell required to run this?
This script should work with at least Powershell V1.0
Is there a solution for windows Server 2003 SBS? I get stalled at can’t stop the service.
Hi Mike,
this should also work for Server 2003. What’s exactly the problem?
Michael