Тематические термины: Exchange , Powershell .
При нарушении состояния индекса в MS Exchange будут наблюдаться проблемы при поиске в Outlook — среди результатов будут отображаться письма до определенной даты. При возникновении проблемы, необходимо переиндексировать базу . Но получать информацию о проблеме лучше самостоятельно, а не от пользователей системы.
Описанный скрипт, позволит проверить корректность индекса и, в случае проблем, отправить письмо администратору.
Подготовка
Перед запуском скрипта открываем powershell и выполняем:
read-host -assecurestring | convertfrom-securestring | out-file C:Scriptspassword.txt
Система запросит ввести пароль — введите пароль администратора Exchange (пользователя, из под которого будем подключаться к почтовому серверу); после данный пароль будет сохранен в виде хэш-суммы в файл C:Scriptspassword.txt .
Пример скрипта
- $username = «remontkaadministrator»
- $password = cat C:Scriptspassword.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.remontka.com/powershell -Credential $cred
- Import-PSSession $session
- function Send-Alert ($bodyMessage) {
- $it = «Дмитрий Моск <master@remontka.com>»
- $from = «Служба проверки индексации почты <index_check@remontka.com>»
- $enc = New-Object System.Text.utf8encoding
- Send-MailMessage -to $it -from $from -Subject «Проблема с индексом Exchange» -bodyAsHTML $bodyMessage -smtpServer mx.remontka.com -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.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 , то есть, отправляем сообщение. |