Автоматизация установки обновлений Windows Server без перезагрузок и с уведомлениями в Telegram

Проблема

Установка обновлений Windows Server рутинная, но критически важная задача. В небольших и средних организациях её часто выполняют вручную: администратор заходит на сервер, запускает Windows Update, ждёт завершения, перезагружает, проверяет работоспособность. Это отнимает время, повышает риск человеческой ошибки и может привести к длительным простоям, если обновление «сломало» сервис. Кроме того, пропущенные обновления создают бреши в безопасности. Нужно автоматизировать процесс: настроить регулярное скачивание и установку обновлений, минимизировать перезагрузки (или планировать их в окно наименьшей нагрузки) и получать уведомления о результатах в Telegram для оперативного контроля.

Решение

Microsoft предоставляет несколько инструментов для автоматизации обновлений: Windows Server Update Services (WSUS) для централизованного управления, Group Policy для настройки политик автоматического обновления, PowerShell для гибких сценариев. Однако в небольших инфраструктурах (до 10-20 серверов) развёртывание WSUS может быть избыточным. Более простой и контролируемый подход — использовать PowerShell в связке с планировщиком задач и Telegram Bot API.

В этой статье мы создадим PowerShell-скрипт, который:

  • Проверяет наличие доступных обновлений через модуль PSWindowsUpdate (или встроенный Microsoft.Update.Session).
  • Устанавливает критические обновления безопасности без автоматической перезагрузки.
  • Отправляет отчёт о статусе в Telegram (какие обновления установлены, требуется ли перезагрузка, возникли ли ошибки).
  • Запускается по расписанию (например, каждую неделю) и, при необходимости, инициирует перезагрузку в заданное время (например, в 3:00 ночи).

Основные источники: документация модуля PSWindowsUpdateTelegram Bot APIMicrosoft Docs по автоматическому обновлению.

Пошаговая инструкция

1. Установка модуля PSWindowsUpdate

Модуль PSWindowsUpdate доступен в PowerShell Gallery. Установите его на каждом сервере, который будет управляться:

Install-Module -Name PSWindowsUpdate -Force -AllowClobber

Если сервер не имеет доступа в интернет, модуль можно скачать на рабочей станции и скопировать в каталог C:\Program Files\WindowsPowerShell\Modules\.

Для проверки установки:

Get-Command -Module PSWindowsUpdate

2. Создание Telegram-бота

Для отправки уведомлений создадим бота и получим токен.

  1. В Telegram найдите BotFather.
  2. Отправьте команду /newbot, следуйте инструкциям: укажите имя и username.
  3. После создания BotFather выдаст токен (например, 123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11).
  4. Получите свой chat ID. Для этого отправьте боту любое сообщение, затем перейдите по ссылке:texthttps://api.telegram.org/bot<токен>/getUpdatesВ JSON-ответе найдите chat -> id. Это и есть ваш chat ID.

3. Написание PowerShell-скрипта

Создайте файл WindowsUpdate.ps1. Скрипт будет выполнять следующие действия:

  • Получать список доступных обновлений.
  • Устанавливать обновления категории Security Updates и Critical Updates.
  • Логировать успехи и ошибки.
  • Отправлять отчёт в Telegram.
<#
.SYNOPSIS
    Установка обновлений Windows Server с уведомлением в Telegram
.DESCRIPTION
    Скрипт использует модуль PSWindowsUpdate для установки критических обновлений безопасности.
    После выполнения отправляет отчёт в Telegram-чат.
#>

# --- Конфигурация ---
$BotToken = "123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11"  # замените на свой токен
$ChatId = "123456789"                                    # замените на свой chat ID
$LogFile = "C:\Scripts\WindowsUpdate.log"                # локальный лог-файл

# --- Функция отправки сообщения в Telegram ---
function Send-TelegramMessage {
    param([string]$Message)
    $url = "https://api.telegram.org/bot$BotToken/sendMessage"
    $body = @{
        chat_id = $ChatId
        text    = $Message
        parse_mode = "HTML"
    }
    Invoke-RestMethod -Uri $url -Method Post -Body $body -ErrorAction SilentlyContinue
}

# --- Начало работы ---
$StartTime = Get-Date
$MessageBody = @"
<b>🔧 Обновление сервера $env:COMPUTERNAME</b>
Время запуска: $($StartTime.ToString('dd.MM.yyyy HH:mm:ss'))
"@

# Импорт модуля
try {
    Import-Module PSWindowsUpdate -ErrorAction Stop
    $MessageBody += "✅ Модуль PSWindowsUpdate загружен`n"
} catch {
    $errorMsg = "❌ Не удалось загрузить модуль PSWindowsUpdate: $($_.Exception.Message)"
    Send-TelegramMessage -Message "$MessageBody`n$errorMsg"
    exit 1
}

# Поиск обновлений
try {
    $Updates = Get-WindowsUpdate -Category "Security Updates", "Critical Updates" -NotCategory "Drivers" -AcceptAll -ErrorAction Stop
    if ($Updates.Count -eq 0) {
        $MessageBody += "ℹ️ Критические обновления безопасности не найдены.`n"
        Send-TelegramMessage -Message $MessageBody
        exit 0
    }
    $MessageBody += "📦 Найдено обновлений: $($Updates.Count)`n"
} catch {
    $errorMsg = "❌ Ошибка при поиске обновлений: $($_.Exception.Message)"
    Send-TelegramMessage -Message "$MessageBody`n$errorMsg"
    exit 1
}

# Установка обновлений (без автоматической перезагрузки)
try {
    $InstallResult = Install-WindowsUpdate -Updates $Updates -AcceptAll -IgnoreReboot -ErrorAction Stop
    $SuccessCount = ($InstallResult | Where-Object { $_.Status -eq "Installed" }).Count
    $FailedCount = ($InstallResult | Where-Object { $_.Status -eq "Failed" }).Count
    $MessageBody += "✅ Установлено: $SuccessCount`n"
    if ($FailedCount -gt 0) {
        $MessageBody += "⚠️ Не установлено: $FailedCount`n"
    }
    # Детали устанавливаемых обновлений
    $InstallResult | ForEach-Object {
        $MessageBody += "  - $($_.Title) (KB$($_.KB))`n"
    }
} catch {
    $errorMsg = "❌ Ошибка при установке: $($_.Exception.Message)"
    Send-TelegramMessage -Message "$MessageBody`n$errorMsg"
    exit 1
}

# Проверка необходимости перезагрузки
if (Get-WURebootStatus) {
    $MessageBody += "⚠️ Требуется перезагрузка для завершения установки.`n"
    # Здесь можно добавить код для планирования перезагрузки, например:
    # Restart-Computer -Force
} else {
    $MessageBody += "✅ Перезагрузка не требуется.`n"
}

$EndTime = Get-Date
$Duration = ($EndTime - $StartTime).TotalMinutes
$MessageBody += "⏱️ Завершено за $([math]::Round($Duration,2)) минут."

# Отправка финального сообщения
Send-TelegramMessage -Message $MessageBody

# Запись в локальный лог
$MessageBody | Out-File -FilePath $LogFile -Append -Encoding UTF8

4. Настройка прав выполнения скриптов

На сервере может быть ограничена политика выполнения скриптов. Установите разрешённый режим:

Set-ExecutionPolicy RemoteSigned -Force

5. Настройка расписания через планировщик задач

Создайте задачу, которая будет запускать скрипт от имени SYSTEM или учётной записи с правами администратора.

Создание задачи вручную:

  1. Откройте Task Scheduler (taskschd.msc).
  2. Нажмите Create Task.
  3. Вкладка General:
    • Name: WindowsUpdateWithTelegram
    • Run with highest privileges (поставьте галочку).
    • Configure for: Windows Server 2016/2019/2022.
  4. Вкладка Triggers → New:
    • Begin the task: On a schedule
    • Weekly (например, каждый четверг в 22:00).
  5. Вкладка Actions → New:
    • Action: Start a program
    • Program/script: powershell.exe
    • Arguments: -ExecutionPolicy Bypass -File "C:\Scripts\WindowsUpdate.ps1"
  6. Вкладка Conditions: снимите галочку с «Start the task only if the computer is on AC power» (если это не ноутбук).
  7. Вкладка Settings: установите «If the task fails, restart every 15 minutes up to 3 times».

Создание задачи через PowerShell:

$Action = New-ScheduledTaskAction -Execute "powershell.exe" -Argument "-ExecutionPolicy Bypass -File C:\Scripts\WindowsUpdate.ps1"
$Trigger = New-ScheduledTaskTrigger -Weekly -DaysOfWeek Thursday -At 22:00
$Principal = New-ScheduledTaskPrincipal -UserID "NT AUTHORITY\SYSTEM" -LogonType ServiceAccount -RunLevel Highest
$Settings = New-ScheduledTaskSettingsSet -AllowStartIfOnBatteries -DontStopIfGoingOnBatteries -StartWhenAvailable -RestartInterval (New-TimeSpan -Minutes 15) -RestartCount 3
Register-ScheduledTask -TaskName "WindowsUpdateWithTelegram" -Action $Action -Trigger $Trigger -Principal $Principal -Settings $Settings

6. Настройка перезагрузки (опционально)

Если после установки обновлений требуется перезагрузка, можно запланировать её на удобное время (например, через 30 минут) и отправить дополнительное уведомление.

Добавьте в скрипт после проверки Get-WURebootStatus:

if (Get-WURebootStatus) {
    # Планируем перезагрузку через 30 минут
    $RebootTime = (Get-Date).AddMinutes(30)
    schtasks /create /tn "RebootAfterUpdate" /tr "shutdown /r /t 60 /c 'Сервер будет перезагружен через 60 секунд для завершения установки обновлений'" /sc once /st $RebootTime.ToString("HH:mm") /f
    Send-TelegramMessage -Message "🔄 Перезагрузка запланирована на $($RebootTime.ToString('HH:mm'))"
}

7. Проверка и отладка

  • Запустите скрипт вручную из PowerShell: C:\Scripts\WindowsUpdate.ps1.
  • Проверьте, пришло ли уведомление в Telegram.
  • Посмотрите локальный лог C:\Scripts\WindowsUpdate.log.

Если возникают ошибки, выполните Get-WindowsUpdate -Verbose для детализации.

Устранение распространённых проблем

ПроблемаВероятная причинаРешение
Ошибка Access denied при установке модуляНедостаточно прав, политика ExecutionPolicy запрещаетЗапустить PowerShell от имени администратора, выполнить Set-ExecutionPolicy RemoteSigned.
Бот не отвечаетНеверный токен, chat ID, сервер не имеет доступа в интернетПроверить токен и chat ID через curl https://api.telegram.org/bot<токен>/getMe. Открыть firewall на порт 443.
Обновления не устанавливаютсяОтсутствует подключение к Microsoft Update, настроен WSUS без разрешённых категорийВыполнить Get-WindowsUpdate -Verbose для диагностики. При необходимости изменить реестр HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU
Скрипт зависает при большом количестве обновленийТаймаут по умолчанию может не хватитьДобавить параметр -MaxWaitMinutes 120 в Install-WindowsUpdate.
Перезагрузка не происходитGet-WURebootStatus возвращает $false, хотя обновления установленыНекоторые обновления не требуют перезагрузки. Проверить вручную: Get-WURebootStatus -Verbose.

Итог

Мы автоматизировали установку обновлений Windows Server с помощью PowerShell и Telegram. Автоматизация обновлений windows server позволяет сократить ручной труд, своевременно закрывать уязвимости и получать оперативную обратную связь о состоянии серверов. Предложенный скрипт легко модифицируется: можно добавить фильтрацию по конкретным KB, настроить отправку в несколько чатов, интегрировать с системой мониторинга. Для более сложных сценариев (большое количество серверов) рекомендуется развернуть WSUS и использовать централизованные отчёты, но описанный подход идеально подходит для небольших и средних инфраструктур.

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest
0 комментариев
Популярные
Новые Старые

0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x
Menu