Проблема
Установка обновлений 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. Установите его на каждом сервере, который будет управляться:
Install-Module -Name PSWindowsUpdate -Force -AllowClobber
Если сервер не имеет доступа в интернет, модуль можно скачать на рабочей станции и скопировать в каталог C:\Program Files\WindowsPowerShell\Modules\.
Для проверки установки:
Get-Command -Module PSWindowsUpdate
2. Создание Telegram-бота
Для отправки уведомлений создадим бота и получим токен.
- В Telegram найдите BotFather.
- Отправьте команду
/newbot, следуйте инструкциям: укажите имя и username. - После создания BotFather выдаст токен (например,
123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11). - Получите свой 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 или учётной записи с правами администратора.
Создание задачи вручную:
- Откройте Task Scheduler (taskschd.msc).
- Нажмите Create Task.
- Вкладка General:
- Name:
WindowsUpdateWithTelegram - Run with highest privileges (поставьте галочку).
- Configure for: Windows Server 2016/2019/2022.
- Name:
- Вкладка 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:
$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 и использовать централизованные отчёты, но описанный подход идеально подходит для небольших и средних инфраструктур.







