Мониторинг состояния индекса MS Exchange с помощью скрипта на Powershell
Тематические термины: Exchange, Powershell.
При нарушении состояния индекса в MS Exchange будут наблюдаться проблемы при поиске в Outlook — среди результатов будут отображаться письма до определенной даты. При возникновении проблемы, необходимо переиндексировать базу. Но получать информацию о проблеме лучше самостоятельно, а не от пользователей системы.
Описанный скрипт, позволит проверить корректность индекса и, в случае проблем, отправить письмо администратору.
Подготовка
Перед запуском скрипта открываем powershell и выполняем:
read-host -assecurestring | convertfrom-securestring | out-file C:\Scripts\password.txt
Система запросит ввести пароль — введите пароль администратора Exchange (пользователя, из под которого будем подключаться к почтовому серверу); после данный пароль будет сохранен в виде хэш-суммы в файл C:\Scripts\password.txt.
Пример скрипта
- $username = "dmosk\administrator"
- $password = cat C:\Scripts\password.txt | convertto-securestring
- $base_failed = ''
- $cred = new-object -typename System.Management.Automation.PSCredential -argumentlist $username, $password
- $session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri http://mx.dmosk.ru/powershell -Credential $cred
- Import-PSSession $session
- function Send-Alert ($bodyMessage) {
- $it = "Дмитрий Моск <master@dmosk.ru>"
- $from = "Служба проверки индексации почты <index_check@dmosk.ru>"
- $enc = New-Object System.Text.utf8encoding
- Send-MailMessage -to $it -from $from -Subject "Проблема с индексом Exchange" -bodyAsHTML $bodyMessage -smtpServer mx.dmosk.ru -Encoding $enc
- }
- (Get-DatabaseAvailabilityGroup) | ForEach {
- $_.Servers | ForEach {
- Get-MailboxDatabaseCopyStatus -Server $_ | Select Name,ContentIndexState | ForEach-Object {
- if ($_.ContentIndexState -ne 'Healthy') {
- $name = $_.Name
- $contentIndexState = $_.ContentIndexState
- $base_failed += "$name : $contentIndexState<br>"
- }
- }
- }
- }
- if ($base_failed.Count -gt 0) {
- Send-Alert $base_failed
- }
Описание скрипта
1 | Переменная, содержащая имя пользователя, под которым подключаемся к Exchange. |
2 | Пароль пользователя Exchange. |
3 | Определяем пустую переменную — в нее будем помещать базы с проблемами. |
5 - 7 | Подключаемся к консоли Exchange, используя логин и пароль, определенные на строках 1 и 2. mx.dmosk.ru — имя сервера Exchange. |
9 - 14 | Функция отправки сообщения. |
10 | Переменная с email адресом администратора, которому будут отправляться уведомления. |
11 | Адрес, от которого отправляются письма. |
12 | Кодировка сообщения. |
13 | Собственно, отправка письма функцией Send-MailMessage. В качестве текста сообщения берется переменная $bodyMessage, значение для которой передается функции. |
16 - 26 | Поиск всех баз данных и определение их состояния. Предусмотрено использование DAG-групп. Если последние не используются, скрипт можно немного сократить, оставив строки 18 - 24, а также заменив $_ в 18-й строке на имя сервера Exchange. |
16 | Получаем все группы DAG. |
17 | Получаем список всех серверов Exchange с DAG группами. |
18 | Запрашиваем статус всех баз, которые находятся на сервере $_. |
19 | Проверяем условие, если статус не в рабочем состоянии. |
20 - 21 | Определяем переменные и записываем в них значения имени базы и состояния. |
22 | Добавляем в переменную $base_failed строку с именем базы и ее состоянием. |
28 - 30 | Если переменная $base_failed не пустая, выполняем функцию Send-Alert, то есть, отправляем сообщение. |