Мониторинг состояния индекса MS Exchange с помощью скрипта на Powershell

Тематические термины: Exchange , Powershell .

При нарушении состояния индекса в MS Exchange будут наблюдаться проблемы при поиске в Outlook — среди результатов будут отображаться письма до определенной даты. При возникновении проблемы, необходимо переиндексировать базу . Но получать информацию о проблеме лучше самостоятельно, а не от пользователей системы.

Описанный скрипт, позволит проверить корректность индекса и, в случае проблем, отправить письмо администратору.

Подготовка

Перед запуском скрипта открываем powershell и выполняем:

read-host -assecurestring | convertfrom-securestring | out-file C:Scriptspassword.txt

Система запросит ввести пароль — введите пароль администратора Exchange (пользователя, из под которого будем подключаться к почтовому серверу); после данный пароль будет сохранен в виде хэш-суммы в файл C:Scriptspassword.txt .

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

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

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

1 Переменная, содержащая имя пользователя, под которым подключаемся к Exchange.
2 Пароль пользователя Exchange.
3 Определяем пустую переменную — в нее будем помещать базы с проблемами.
5 — 7 Подключаемся к консоли Exchange, используя логин и пароль, определенные на строках 1 и 2. mx.remontka.com — имя сервера 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 , то есть, отправляем сообщение.

EnglishRussianUkrainian