понедельник, 27 декабря 2010 г.

Очистка базы данных от отключенных и удаленных почтовых ящиков

clip_image002В одной из прошлых статей мы говорили о восстановлении удаленных почтовых ящиков на сервере Exchange. Умение оперативно восстановить удаленные ящики – это хорошо, но иногда этого не достаточно. Бывают ситуации, когда необходимо знать, как выполнить очистку базы данных от «недоудаленных» почтовых ящиков. В этой статье речь пойдет именно о том, как реализовать подобную задачу на серверах Exchange 2007, 2010 и 2010 SP1.

Сервера Exchange 2007/2010

Что касается этих серверов, то здесь ни чего сложного нет. Если вы хотите удалить все отключенные ящики на сервере, то необходимо взять стандартный командлет Remove-Mailbox, и применить его по отношению к набору почтовых ящиков. Массив из отключенных ящиков мы можем получить точно таким же способом, как и в статье описывающей восстановление, далее его нужно будет сохранить в переменную, DeletedMailbox, но не весь целиком, а только значения DisplayName, MailboxGuid, Database. В результате команда будет выглядеть примерно так:

$DeletedMailbox = Get-MailboxStatistics –Database <Your_MailboxDB> | where {$_.DisconnectDate -ne $null} | Select DisplayName, MailboxGuid, Database

Если нужно избавиться ещё и от архивных почтовых ящиков сервера Exchange 2010, то добавим условие:

-and ($_.IsArchiveMailbox -eq $true)

Далее применяем командлет Remove-Mailbox к элементам массива DeletedMailbox:

$DeletedMailbox | ForEach { Remove-Mailbox -Database $_.Database -StoreMailboxIdentity $_.MailboxGuid -confirm:$false }

clip_image004

Рис.1: Очистка базы данных от удаленных почтовых ящиков.

На рис.1 первой командой мы получаем массив из отключенных почтовых ящиков, затем выводим этот массив на экран, чтобы уточнить, что именно мы хотим удалить, и следующей командой выполняем непосредственно само удаление. Для проверки результатов мы снова получаем массив из отключенных ящиков первой командой, и снова выводим массив на экран, как вы видите, в последнем случае массив оказывается пустым.

Сервер Exchange 2010 SP1

Теперь несколько слов о сервер Exchange 2010 SP1, собственно именно он является виновником написания этой статьи, т.к. я хотел показать новый командлет, который появился с выходом первого сервис пака. Командлет зовут Remove-StoreMailbox и подробнее узнать о нем можно как всегда на страницах TechNet`a. Командлет специально «заточен» под очистку базы данных от отключенных либо удаленных почтовых ящиков. Если вы попытаетесь применить его к действующему почтовому ящику, то получите ошибку.

Как известно, ящик можно отключить (Disable-Mailbox) либо удалить (Remove-Mailbox). После чего, его состояние можно проверить командлетом Get-MailboxStatistics, у которого в свойстве DisconnectReason будет значиться Disabled либо SoftDeleted соответственно.

Примечание: Свойство DisconnectReason появилось у почтового ящика только после установки Exchange 2010 SP1

Командлет Remove-StoreMailbox может обрабатывать отдельно отключенные и отдельно удаленные ящики, такое поведение задается параметром MailboxState, который может принимать значения Disabled или SoftDeleted.

Для обработки всех почтовых ящиков в базе данных можно воспользоваться той же командой, что и в первой части статьи, только необходимо изменить условие на следующее:

{$_.DisconnectReason -eq "SoftDeleted"}

либо соответственно

{$_.DisconnectReason -eq "Disabled"}

В результате команда будет иметь вид:

$DeletedMailbox = Get-MailboxStatistics –Database <Your_MailboxDB> | where {$_.DisconnectReason -eq "Disabled"} | Select DisplayName, MailboxGuid, Database

$DeletedMailbox | ForEach { Remove-StoreMailbox -Database $_.Database -Identity $_.MailboxGuid –MailboxState Disabled }

clip_image006

Рис.2: очистка базы данных от удаленных почтовых ящиков на сервере Exchange 2010 SP1.

На рис.2, аналогично первому – сначала получаем массив удаленных ящиков (Disabled), далее выводим этот массив на экран, очищаем базу, снова получаем массив удаленных ящиков и убеждаемся, что команда отработала правильно.

Заключение

Как мы видим, SP1 для Exchange 2010 затронул очень много компонентов сервера и даже такая процедура, как очистка базы данных не осталась без внимания.

10 комментариев:

Алексей комментирует...

Спасибо, весьма полезно!

Анонимный комментирует...

Отлично! все работает.

Анонимный комментирует...

Спасибо! Очень помогло!

Анонимный комментирует...

Алексей, браво! Больше года назад помогла ваша статья. Второй раз я её нашел быстрее :) Такие сведения нужны редко, но метко!

Анонимный комментирует...

Супер спасибо!
только мне пришлось по 2-му варианту...

$DeletedMailbox = Get-MailboxStatistics –Database 'first mailbox database' | where {$_.DisconnectReason -eq "SoftDeleted"} | Select DisplayName, MailboxGuid, Database

$DeletedMailbox

$DeletedMailbox | ForEach { Remove-StoreMailbox -Database $_.Database -Identity $_.MailboxGuid –MailboxState SoftDeleted }

Vasya Pupkin комментирует...

Добрый день,в организации есть одна особенность, при отключении почтового ящика пользователя из поддомена, просто удаляет этот почтовый ящик, а не помещает в "отключенные" . Есть какие-нибудь предположения почему так происходит?

Алексей Богомолов (Alexx) комментирует...

Нет, ни разу не сталкивался с подобным, к сожалению

Konstantin Vinokurov комментирует...

Добрый день, возникла проблема с подключением мобильных устройств к серверу.После восстановления базы Exchange 2010 мобильные устройства которые использовались до восстановления не отображают календари. При этом на вновь подключаемых устройствах все ОК. А на старых при подключении учетных записей созданных после восстановления тоже все ОК. Не подскажите куда копать?

admin MUP комментирует...

можно уточнить полную команду, если нужно избавиться ещё и от архивных почтовых ящиков сервера Exchange 2010. Вы пишите, что необходимо добавить условие:

-and ($_.IsArchiveMailbox -eq $true)

Добавить куда?

Алексей Богомолов (Alexx) комментирует...

Вот сюда:
$DeletedMailbox = Get-MailboxStatistics –Database | where {($_.DisconnectDate -ne $null) -and ($_.IsArchiveMailbox -eq $true)}

- выводим что получилось:
$DeletedMailbox

- после чего удаляем командой:
$DeletedMailbox | ForEach { Remove-Mailbox -Database $_.Database -StoreMailboxIdentity $_.MailboxGuid -confirm:$false }

Отправить комментарий