Мониторинг состояния индекса 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.

Пример скрипта

  1. $username = "dmosk\administrator"
  2. $password = cat C:\Scripts\password.txt | convertto-securestring
  3. $base_failed = ''
  4.  
  5. $cred = new-object -typename System.Management.Automation.PSCredential -argumentlist $username, $password
  6. $session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri http://mx.dmosk.ru/powershell -Credential $cred
  7. Import-PSSession $session
  8.  
  9. function Send-Alert ($bodyMessage) {
  10.     $it = "Дмитрий Моск <master@dmosk.ru>"
  11.     $from = "Служба проверки индексации почты <index_check@dmosk.ru>"
  12.     $enc = New-Object System.Text.utf8encoding
  13.     Send-MailMessage -to $it -from $from -Subject "Проблема с индексом Exchange" -bodyAsHTML $bodyMessage -smtpServer mx.dmosk.ru -Encoding $enc
  14. }
  15.  
  16. (Get-DatabaseAvailabilityGroup) | ForEach {
  17.     $_.Servers | ForEach {
  18.         Get-MailboxDatabaseCopyStatus -Server $_ | Select Name,ContentIndexState | ForEach-Object {
  19.             if ($_.ContentIndexState -ne 'Healthy') {
  20.                 $name = $_.Name
  21.                 $contentIndexState = $_.ContentIndexState
  22.                 $base_failed += "$name : $contentIndexState<br>"
  23.             }
  24.         }
  25.     }
  26. }
  27.  
  28. if ($base_failed.Count -gt 0) {
  29.     Send-Alert $base_failed
  30. }

Описание скрипта

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, то есть, отправляем сообщение.

 

# Exchange # Powershell # Почта # Серверы
Дмитрий Моск — частный мастер
Был ли вам полезен этот скрипт?

Да            Нет