Папка windows\temp забивается файлами cab_xxxx

Данная проблема вызвана сбоем службы автоматического обновления Windows, в частности при работе с серверами обновлений WSUS.

Пошаговое решение проблемы выглядит так:

  1. Остановка службы обновлений (wuauserv)
  2. Остановка службы trustedinstaller
  3. Удаление содержимого папки c:\windows\temp
  4. Удаление cab-файлов из папки c:\windows\logs\CBS
  5. Удаление папки  C:\windows\softwaredistribution
  6. Запуск сервиса trustedinstaller
  7. Запуск службы обновления

Для удаленного автоматического решения проблемы можно воспользоваться скриптом:

fix_winupdate_tmp_cab.ps1
 
$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" }

Источник: https://community.spiceworks.com/topic/495234-windows-temp-file-is-full-of-cab_xxxx-files-on-windows-server-2008-r2

Как давно выключена эта виртуалка?

Набросал небольшой скриптец для VMware ESXi, чтобы проверять как давно менялось состояние виртуальных машин. При запуске он заполняет кастомное поле «Power» состоянием и датой, когда это состояние было обнаружено. Кинув в шедулер можно с некоторой точностью понимать, что вот эту виртуалку выключили только вчера, а вот та — выключена уже пару лет (конечно после того как этот скрипт пару лет проверял ее состояние =). Скрипт использует VMware PowerCLI

check-vm-powerstate.ps1
 
Add-PSSnapin VMware.VimAutomation.Core
Connect-VIServer -Server localhost
Get-VM  | ForEach-Object { 
                        $vm = $_
                        $date = (Get-Date -UFormat "%Y-%m-%d  %R").ToString()
                        $AnnotationStatus =  (Get-Annotation $_ | Where-Object { $_.Name -eq "Power"}).Value
                        
                        if ( ($_.PowerState -eq 'PoweredOn') -and ($AnnotationStatus -like 'Down*') ) {
                            $vm | Set-Annotation -CustomAttribute "Power" -Value "Up since $date" 
                        }
                        if ( ($_.PowerState -eq 'PoweredOn') -and ($AnnotationStatus -eq '') ) {
                            $vm | Set-Annotation -CustomAttribute "Power" -Value "Up since  < $date" 
                        }
                        if ( ($_.PowerState -eq 'PoweredOff') -and ($AnnotationStatus -like 'Up*') ) {
                            $vm | Set-Annotation -CustomAttribute "Power" -Value "Down since $date" 
                        }
                        if ( ($_.PowerState -eq 'PoweredOff') -and ($AnnotationStatus -eq '') ) {
                            $vm | Set-Annotation -CustomAttribute "Power" -Value "Down since < $date" 
                        }
                    }