Данная проблема вызвана сбоем службы автоматического обновления Windows, в частности при работе с серверами обновлений WSUS.
Пошаговое решение проблемы выглядит так:
- Остановка службы обновлений (wuauserv)
- Остановка службы trustedinstaller
- Удаление содержимого папки c:\windows\temp
- Удаление cab-файлов из папки c:\windows\logs\CBS
- Удаление папки C:\windows\softwaredistribution
- Запуск сервиса trustedinstaller
- Запуск службы обновления
Для удаленного автоматического решения проблемы можно воспользоваться скриптом:
- $Machine = read-host "Type in the Computer Name"
- $windowsUpdateService = 'wuauserv'
- $trustedInstallerService = 'trustedinstaller'
- function Set-ServiceState
- {
- [CmdletBinding()]
- param(
- [string]$ComputerName,
- [string]$ServiceName
- )
- Write-Verbose "Evaluating $ServiceName on $ComputerName."
- [string]$WaitForIt = ""
- [string]$Verb = ""
- [string]$Result = "FAILED"
- $svc = Get-Service -computername $ComputerName -name $ServiceName
- Switch ($svc.status) {
- 'Stopped' {
- Write-Verbose "[$ServiceName] is currently Stopped. Starting."
- $Verb = "start"
- $WaitForIt = 'Running'
- $svc.Start()
- }
- 'Running' {
- Write-Verbose "[$ServiceName] is Running. Stopping."
- $Verb = "stop"
- $WaitForIt = 'Stopped'
- $svc.Stop()
- }
- default {
- Write-Verbose "$ServiceName is $($svc.status). Taking no action."
- }
- }
- if ($WaitForIt -ne "") {
- Try { # For some reason, we cannot use -ErrorAction after the next statement:
- $svc.WaitForStatus($WaitForIt,'00:02:00')
- } Catch {
- Write-Warning "After waiting for 2 minutes, $ServiceName failed to $Verb."
- }
- $svc = (get-service -computername $ComputerName -name $ServiceName)
- if ($svc.status -eq $WaitForIt) {
- $Result = 'SUCCESS'
- }
- Write-Verbose "$Result - $ServiceName on $ComputerName is $($svc.status)"
- Write-Verbose ("{0} - {1} on {2} is {4}" -f $Result, $ServiceName, $ComputerName, $svc.status)
- }
- }
- # stop update service
- Write-Host "stop update service"
- Set-ServiceState -ComputerName $Machine -ServiceName $windowsUpdateService -Verbose
- #removes temp files and renames software distribution folder
- Write-Host "removes temp files and renames software distribution folder"
- Remove-Item \\$Machine\c$\windows\temp\* -recurse
- Rename-Item \\$Machine\c$\windows\SoftwareDistribution SoftwareDistribution.old
- #restarts update service
- Write-Host "restarts update service"
- Set-ServiceState -ComputerName $Machine -ServiceName $windowsUpdateService
- #removes software distribution.old
- Write-Host "removes software distribution.old"
- Remove-Item \\$Machine\c$\windows\SoftwareDistribution.old -recurse
- #stops trustedinstaller service
- Write-Host "stops trustedinstaller service"
- Set-ServiceState -ComputerName $Machine -ServiceName $trustedInstallerService
- #removes cab files from trustedinstaller
- Write-Host "removes cab files from trustedinstaller"
- remove-item \\$Machine\c$\windows\Logs\CBS\* -recurse
- #restarts trustedinstaller service
- Write-Host "restarts trustedinstaller service"
- Set-ServiceState -ComputerName $Machine -ServiceName $trustedInstallerService
- #rebuilds cab files from WSUS
- Write-Host "rebuilds cab files from WSUS"
- invoke-command -ComputerName $Machine -ScriptBlock { & cmd.exe "c:\windows\system32\wuauclt.exe /detectnow" }