Уведомления от Windows Server Backup

Уведомления от Windows Server Backup

Windows Server Backup хороша в качестве компонента резервного копирования, встроенного в ОС. Но работу этого компонента неплохо было бы отслеживать.

Я написал небольшой скрипт, позволяющий по крону отслеживать системный журнал и находить записи по работе Windows Server Backup.

Скрипт

Скрипт анализирует системный журнал и фиксирует записи, принадлежащие #Windows Server Backup. Скрипт состоит из файла настроек, к которому можно ограничить доступ, приложения и двух задач.

Установка

  • Скопировать файлы app.backup.wsb.mail.ps1 и app.backup.wsb.mail.ini в директорию C:\Scripts\.
  • Импортировать задания task.backup.wsb.mail.error.xml и task.backup.wsb.mail.success.xml в Windows Task Scheduler и откорректировать параметры вызова скрипта.
  • Изменить параметры скрипта в файле app.backup.wsb.mail.ini.

Настройка

Файл настройки представляет собой простой файл .ini, содержащий в себе приватные параметры.

app.backup.wsb.mail.ini
1
2
3
4
5
6
From=mail@domain.com
To=mail@domain.org
Server=192.168.11.22
Port=25
User=smtp_user
Password=smtp_password

Параметры

  • From - адрес email, с которого будет отправлено сообщение.
  • To - адрес email, на который будет отправлено сообщение.
  • Server - IP-адрес SMTP-сервера.
  • Port - порт SMTP-сервера.
  • User - имя пользователя в SMTP-сервере.
  • Password - пароль пользователя в SMTP-сервере.

Приложение

app.backup.wsb.mail.ps1
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
<#PSScriptInfo
.VERSION      0.1.0
.GUID         18c25998-a474-425e-a59f-e32f79c8431d
.AUTHOR       Kai Kimera
.AUTHOREMAIL  mail@kai.kim
.COMPANYNAME  Library Online
.COPYRIGHT    2024 Library Online. All rights reserved.
.TAGS         windows server backup mail
.LICENSEURI   https://choosealicense.com/licenses/mit/
.PROJECTURI   https://lib.onl/ru/2024/09/40539e36-4656-5532-b920-8975c97d4dc5/
#>

<#
.SYNOPSIS
Script for sending messages about backup status.

.DESCRIPTION
The script sends messages to the specified address for further analysis.
The messages contain the host ID and notification type.

.EXAMPLE
.\app.backup.wsb.mail.ps1 -Type 'error' [-SSL]

.EXAMPLE
.\app.backup.wsb.mail.ps1 -Type 'success' [-SSL]

.LINK
https://lib.onl/ru/2024/09/40539e36-4656-5532-b920-8975c97d4dc5/
#>

# -------------------------------------------------------------------------------------------------------------------- #
# CONFIGURATION
# -------------------------------------------------------------------------------------------------------------------- #

param(
  [Parameter(HelpMessage='Message type.')]
  [ValidateSet('error', 'success')]
  [string]$Type,
  [Parameter(HelpMessage='Enable or disable encrypted connection.')]
  [switch]$SSL = $false,
  [Alias('Host')][string]$Hostname = ([System.Net.Dns]::GetHostByName([string]'localhost').HostName)
)

# Loading configuration data.
$S = ((Get-Item "${PSCommandPath}").Basename + '.ini')
$P = (Get-Content -Path "${PSScriptRoot}\${S}" | ConvertFrom-StringData)

# Generating HostID (HID).
$UUID = (Get-CimInstance 'Win32_ComputerSystemProduct' | Select-Object -ExpandProperty 'UUID')
$HID = ((${Hostname} + ':' + ${UUID}).ToUpper())

# -------------------------------------------------------------------------------------------------------------------- #
# INITIALIZATION
# -------------------------------------------------------------------------------------------------------------------- #

function Start-Script() {
  switch ("${Type}") {
    'error'   { Send-BackupError }
    'success' { Send-BackupSuccess }
    default   { exit }
  }
}

# -------------------------------------------------------------------------------------------------------------------- #
# BACKUP: ERROR
# Sending an email after a failed backup.
# -------------------------------------------------------------------------------------------------------------------- #

function Send-BackupError() {
  $Subject = "Windows Server Backup: ${Hostname}"
  $Body = @"
Windows Server Backup failed: ${Hostname}.
Please check server backup!

Host: ${Hostname}
Status: ERROR

-- 
#ID:${HID}
#TYPE:BACKUP:ERROR
"@

  Start-Smtp -S "${Subject}" -B "${Body}"
}

# -------------------------------------------------------------------------------------------------------------------- #
# BACKUP: SUCCESS
# Sending an email after a successful backup.
# -------------------------------------------------------------------------------------------------------------------- #

function Send-BackupSuccess() {
  $Subject = "Windows Server Backup: ${Hostname}"
  $Body = @"
Windows Server Backup completed successfully!

Host: ${Hostname}
Status: SUCCESS

-- 
#ID:${HID}
#TYPE:BACKUP:SUCCESS
"@

  Start-Smtp -S "${Subject}" -B "${Body}"
}

# -------------------------------------------------------------------------------------------------------------------- #
# SMTP
# SMTP configuration.
# -------------------------------------------------------------------------------------------------------------------- #

function Start-Smtp {
  param(
    [Alias('S')][string]$Subject,
    [Alias('B')][string]$Body
  )

  $SmtpClient = New-Object Net.Mail.SmtpClient("$($P.Server)", "$($P.Port)")
  $SmtpClient.EnableSsl = $SSL
  $SmtpClient.Credentials = New-Object System.Net.NetworkCredential("$($P.User)", "$($P.Password)")
  $SmtpClient.Send("$($P.From)", "$($P.To)", "${Subject}", "${Body}")
}

# -------------------------------------------------------------------------------------------------------------------- #
# -------------------------------------------------< RUNNING SCRIPT >------------------------------------------------- #
# -------------------------------------------------------------------------------------------------------------------- #

Start-Script

Параметры

  • Type - тип сообщения.
    • success - задание #Windows Server Backup успешно выполнено.
    • error - задание #Windows Server Backup не выполнено или выполнено с ошибками.

Задачи

Задачи делятся на два типа: ошибка и успешное выполнение. Каждая из задач будет искать записи #Windows Server Backup в журнале и запускаться в зависимости от идентификатора события (EventID).

Ошибка

Задача присылает уведомление в том случае, когда в журнале событий появляется запись об ошибке выполнения #Windows Server Backup.

task.backup.wsb.mail.error.xml
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<?xml version="1.0" encoding="UTF-16"?>
<Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
  <RegistrationInfo>
    <Description>Notifies backup admin of scheduled backup failure.</Description>
  </RegistrationInfo>
  <Triggers>
    <EventTrigger>
      <Enabled>true</Enabled>
      <Subscription>&lt;QueryList&gt;&lt;Query Id="0" Path="Microsoft-Windows-Backup"&gt;&lt;Select Path="Microsoft-Windows-Backup"&gt;*[System[Provider[@Name='Microsoft-Windows-Backup'] and (EventID=5 or EventID=8 or EventID=9 or  (EventID &amp;gt;= 17 and EventID &amp;lt;= 22)  or EventID=49 or EventID=50 or EventID=52 or EventID=100 or EventID=517 or EventID=518 or EventID=521 or EventID=527 or EventID=528 or EventID=544 or EventID=545 or EventID=546 or EventID=561 or EventID=564 or EventID=612)]]&lt;/Select&gt;&lt;/Query&gt;&lt;/QueryList&gt;</Subscription>
    </EventTrigger>
  </Triggers>
  <Settings>
    <MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>
    <DisallowStartIfOnBatteries>true</DisallowStartIfOnBatteries>
    <StopIfGoingOnBatteries>true</StopIfGoingOnBatteries>
    <AllowHardTerminate>true</AllowHardTerminate>
    <StartWhenAvailable>false</StartWhenAvailable>
    <RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable>
    <IdleSettings>
      <StopOnIdleEnd>true</StopOnIdleEnd>
      <RestartOnIdle>false</RestartOnIdle>
    </IdleSettings>
    <AllowStartOnDemand>true</AllowStartOnDemand>
    <Enabled>true</Enabled>
    <Hidden>false</Hidden>
    <RunOnlyIfIdle>false</RunOnlyIfIdle>
    <WakeToRun>false</WakeToRun>
  </Settings>
  <Actions Context="Author">
    <Exec>
      <Command>powershell</Command>
      <Arguments>"C:\Scripts\app.backup.wsb.mail.ps1" -Type 'error'</Arguments>
    </Exec>
  </Actions>
</Task>

Успешно

Задача присылает уведомление в том случае, когда в журнале событий появляется запись об успешном выполнении #Windows Server Backup.

task.backup.wsb.mail.success.xml
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<?xml version="1.0" encoding="UTF-16"?>
<Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
  <RegistrationInfo>
    <Description>Notifies backup admin of scheduled backup successful completion.</Description>
  </RegistrationInfo>
  <Triggers>
    <EventTrigger>
      <Enabled>true</Enabled>
      <Subscription>&lt;QueryList&gt;&lt;Query Id="0" Path="Microsoft-Windows-Backup"&gt;&lt;Select Path="Microsoft-Windows-Backup"&gt;*[System[Provider[@Name='Microsoft-Windows-Backup'] and (EventID=4)]]&lt;/Select&gt;&lt;/Query&gt;&lt;/QueryList&gt;</Subscription>
    </EventTrigger>
  </Triggers>
  <Settings>
    <MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>
    <DisallowStartIfOnBatteries>true</DisallowStartIfOnBatteries>
    <StopIfGoingOnBatteries>true</StopIfGoingOnBatteries>
    <AllowHardTerminate>true</AllowHardTerminate>
    <StartWhenAvailable>false</StartWhenAvailable>
    <RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable>
    <IdleSettings>
      <StopOnIdleEnd>true</StopOnIdleEnd>
      <RestartOnIdle>false</RestartOnIdle>
    </IdleSettings>
    <AllowStartOnDemand>true</AllowStartOnDemand>
    <Enabled>true</Enabled>
    <Hidden>false</Hidden>
    <RunOnlyIfIdle>false</RunOnlyIfIdle>
    <WakeToRun>false</WakeToRun>
  </Settings>
  <Actions Context="Author">
    <Exec>
      <Command>powershell</Command>
      <Arguments>"C:\Scripts\app.backup.wsb.mail.ps1" -Type 'success'</Arguments>
    </Exec>
  </Actions>
</Task>
Авторы
Смотрите также
Мета
Лицензия
ID файла
UUID
Системный путь
Тип
Статистика
Количество слов
Время чтения
мин.