Загрузка данных


# Скрипт: SystemInfoReport.ps1
# Выводит в текстовый файл:
# a) время последних 10 включений,
# b) 5 последних установленных обновлений с номерами KB,
# c) количество ошибок и предупреждений за последние 24 часа.

$outputFile = "$env:USERPROFILE\Desktop\SystemReport.txt"

# Очистка или создание файла
"" | Out-File -FilePath $outputFile -Encoding UTF8

# === 1. Последние 10 включений ===
Add-Content -Path $outputFile -Value "=== 1. Последние 10 включений компьютера ==="
$bootEvents = Get-WinEvent -FilterHashtable @{LogName='System'; ID=12,13,6009,6005,6006,6013} -MaxEvents 100 | 
              Where-Object { $_.Id -in 12,13,6005,6006,6009,6013 -and $_.Message -match 'загрузка|boot|startup|Event log started|запуск' } |
              Sort-Object TimeCreated -Descending |
              Select-Object -First 10

if ($bootEvents.Count -eq 0) {
    Add-Content -Path $outputFile -Value "Не удалось найти события включений."
} else {
    $i = 1
    foreach ($evt in $bootEvents) {
        Add-Content -Path $outputFile -Value "$i. $($evt.TimeCreated) (Event ID: $($evt.Id))"
        $i++
    }
}
Add-Content -Path $outputFile -Value ""

# === 2. Последние 5 установок обновлений ===
Add-Content -Path $outputFile -Value "=== 2. Последние 5 установленных обновлений ==="
try {
    $updateSession = New-Object -ComObject Microsoft.Update.Session
    $updateSearcher = $updateSession.CreateUpdateSearcher()
    $historyCount = $updateSearcher.GetTotalHistoryCount()
    if ($historyCount -gt 0) {
        $history = $updateSearcher.QueryHistory(0, [Math]::Min(50, $historyCount))
        $installed = $history | Where-Object { $_.ResultCode -eq 2 -or $_.ResultCode -eq 3 } |  # 2=Успешно, 3=Установлено с ошибкой
                       Sort-Object Date -Descending |
                       Select-Object -First 5
        if ($installed.Count -eq 0) {
            Add-Content -Path $outputFile -Value "Нет записей об успешных установках обновлений."
        } else {
            foreach ($update in $installed) {
                $kbMatch = [regex]::Match($update.Title, 'KB\d+')
                $kbNumber = if ($kbMatch.Success) { $kbMatch.Value } else { "Нет KB" }
                Add-Content -Path $outputFile -Value "$($update.Date) - $kbNumber - $($update.Title.Substring(0, [Math]::Min(80, $update.Title.Length)))"
            }
        }
    } else {
        Add-Content -Path $outputFile -Value "История обновлений пуста."
    }
} catch {
    Add-Content -Path $outputFile -Value "Ошибка при чтении истории обновлений: $_"
}
Add-Content -Path $outputFile -Value ""

# === 3. Количество ошибок и предупреждений за последние 24 часа ===
Add-Content -Path $outputFile -Value "=== 3. События за последние 24 часа ==="
$since = (Get-Date).AddHours(-24)

# Журналы: System и Application
$logs = @('System', 'Application')
$totalErrors = 0
$totalWarnings = 0

foreach ($log in $logs) {
    try {
        $errors = Get-WinEvent -FilterHashtable @{LogName=$log; Level=2; StartTime=$since} -ErrorAction SilentlyContinue
        $warnings = Get-WinEvent -FilterHashtable @{LogName=$log; Level=3; StartTime=$since} -ErrorAction SilentlyContinue
        $errCount = if ($errors) { $errors.Count } else { 0 }
        $warnCount = if ($warnings) { $warnings.Count } else { 0 }
        $totalErrors += $errCount
        $totalWarnings += $warnCount
        Add-Content -Path $outputFile -Value "Журнал $log : Ошибок = $errCount, Предупреждений = $warnCount"
    } catch {
        Add-Content -Path $outputFile -Value "Журнал $log : Доступ запрещён или нет событий."
    }
}
Add-Content -Path $outputFile -Value "ИТОГО за 24 часа: Ошибок = $totalErrors, Предупреждений = $totalWarnings"
Add-Content -Path $outputFile -Value ""

# Финальная строка
Add-Content -Path $outputFile -Value "Отчёт сгенерирован: $(Get-Date)"
Write-Host "Отчёт сохранён в: $outputFile" -ForegroundColor Green