Проблема
Установка обновлений 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 ночи).
Основные источники: документация модуля PSWindowsUpdate, Telegram Bot API, Microsoft Docs по автоматическому обновлению.
Пошаговая инструкция
1. Установка модуля PSWindowsUpdate
Модуль PSWindowsUpdate доступен в PowerShell Gallery. Установите его на каждом сервере, который будет управляться.
text
Install-Module -Name PSWindowsUpdate -Force -AllowClobber
Если сервер не имеет доступа в интернет, модуль можно скачать на рабочей станции и скопировать в каталог C:\Program Files\WindowsPowerShell\Modules\.
Для проверки установки выполните.
text
Get-Command -Module PSWindowsUpdate
2. Создание Telegram бота
Для отправки уведомлений создадим бота и получим токен.
В Telegram найдите BotFather. Отправьте команду /newbot, следуйте инструкциям. Укажите имя и username. После создания BotFather выдаст токен (например 123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11).
Получите свой chat ID. Отправьте боту любое сообщение, затем перейдите по ссылке.
text
https://api.telegram.org/bot<токен>/getUpdates
В JSON ответе найдите chat → id. Это и есть ваш chat ID.
3. Написание PowerShell скрипта
Создайте файл WindowsUpdate.ps1. Скрипт будет выполнять следующие действия. Получать список доступных обновлений. Устанавливать обновления категорий Security Updates и Critical Updates. Логировать успехи и ошибки. Отправлять отчёт в Telegram.
powershell
<#
.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. Настройка прав выполнения скриптов
На сервере может быть ограничена политика выполнения скриптов. Установите разрешённый режим.
text
Set-ExecutionPolicy RemoteSigned -Force
5. Настройка расписания через планировщик задач
Создайте задачу, которая будет запускать скрипт от имени SYSTEM или учётной записи с правами администратора.
Создание задачи вручную.
Откройте Task Scheduler (taskschd.msc). Нажмите Create Task. Вкладка General.
Name: WindowsUpdateWithTelegram
Run with highest privileges (поставьте галочку).
Configure for: Windows Server 2016/2019/2022.
Вкладка Triggers → New.
Begin the task: On a schedule
Weekly (например, каждый четверг в 22:00).
Вкладка Actions → New.
Action: Start a program
Program/script: powershell.exe
Arguments: -ExecutionPolicy Bypass -File "C:\Scripts\WindowsUpdate.ps1"
Вкладка Conditions. Снимите галочку с «Start the task only if the computer is on AC power» (если это не ноутбук).
Вкладка Settings. Установите «If the task fails, restart every 15 minutes up to 3 times».
Создание задачи через PowerShell.
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.
powershell
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.
text
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 и использовать централизованные отчёты, но описанный подход идеально подходит для небольших и средних инфраструктур.