При удалении почтового ящика Exchange или удалении учетной записи пользователя в Active Directory, почтовый ящик сразу не удаляется, продолжая храниться в почтовой базе определенное время (по умолчанию 30 дней), в течении которого администратор может восстановить данные из ящика или переназначить его другому пользователю. В этой статье мы поговорим о типах удаленных ящиков, способах управления и восстановления таких ящиков в Exchange.
Что происходит с ящиком Exchange после его удаления
Почтовый ящик Exchange состоит из двух частей: учетной записи пользователя в Active Directory (в атрибутах которой хранится конфигурационные данные ящика) и самого ящика в почтовой базе Exchange. Удаленный ящик Exchange (наверно, более правильно говорить отключенный) представляет собой ящик, хранящийся в базе, но не связанный ни с одной учетной записью в AD. Есть два типа удаленных ящиков Exchange:
- Disabled– ящики, отключенные с помощью командлетов Disable-Mailbox или Remove-Mailbox (первый командлет отключает ящик от учетки, второй – еще и удаляет учетную запись в AD)
- Soft Deleted– копии ящиков, которые сохраняются в хранилище после перемещения ящика в другую почтовую базу. Тем самым обеспечивается дополнительная защита данных от проблем, который могут возникнуть в процессе или после переноса ящика в другую базу.
Оба типа удаленных ящиков хранятся в базе Exchange до истечения срока хранения, заданного администратором. Время, после которого ящик удаляется, указывается в настройках каждой базы Exchange на вкладке Limits -> Keep deleted mailboxes for days (скриншоты для Exchange 2013 и Exchange 2010).
Чтобы вывести список всех имеющихся отключенных ящиков во всех базах организации, выполните команду:
Get-MailboxDatabase | Get-MailboxStatistics | Where { $_.DisconnectReason -eq "Disabled" } | ft DisplayName,Database,DisconnectDate,MailboxGUID
Если нужно найти удаленные ящики в одной базе:
Get-MailboxStatistics –database Msk-DB1 | Where { $_.DisconnectReason -eq "Disabled" } | ft DisplayName,Database,DisconnectDate,MailboxGUID
Список удаленных ящиков со статусом SoftDeleted можно получить командой:
Get-MailboxDatabase | Get-MailboxStatistics | Where { $_.DisconnectReason -eq "SoftDeleted" } | ft DisplayName,Database,DisconnectDate,MailboxGUID
Очистка баз Exchange от удаленных ящиков
В течении заданного времени Exchange автоматически очищает базу от отключенных ящиков. Но отключенные ящики продолжают занимать место в базе, поэтому при массовых миграциях/переносах/удалении пользователей, бывает необходимо принудительно удалить такие ящики, освободив место в почтовых базах.
Чтобы окончательно удалить из базы конкретный отключенный ящик (без возможности его восстановления), нужно воспользоваться командлетом Remove—StoreMailbox, указав MailboxGUID удаленного ящика.
Remove-StoreMailbox -Database Msk-DB1 -Identity "2532944e-8eeb-4c7e-8bd3-ee2a223b071e" -MailboxState Disabled
Чтобы удалить все отключенные ящики в организации:
Get-MailboxDatabase | Get-MailboxStatistics | where {$_.DisconnectReason -eq "Disabled"} | foreach {Remove-StoreMailbox -Database $_.database -Identity $_.mailboxguid -MailboxState SoftDeleted}
Если нужно удалить оставшиеся после переноса копии ящиков в определенной базе, выполните команду:
Get-MailboxStatistics –Database Msk-DB1 | Where-Object {$_.DisconnectReason –eq “Softdeleted”} | ForEach {Remove-StoreMailbox –Database $_.database –identity $_.mailboxguid –MailboxState Softdeleted –Whatif}
Подключение удаленного ящика пользователю
Отключенный ящик можно переподключить к той же или другой учетной записи пользователя Active Directory (естественно, учетка должна быть без ящика). Чтобы переподключить ящик к тому же аккаунту, выполните команду:
Connect-Mailbox -Identity "AAndreev" -Database Msk-DB1 -User AAndreev
Эту же операцию можно выполнить из интерфейса EAC: Exchange Admin Center -> Recipients -> Connect a Mailbox.
Восстановление удаленного ящика в ящик другого пользователя
Данные из удаленного ящика можно восстановить в имеющийся ящик другого пользователя с помощью командлета New-MailboxRestoreRequest (мы показывали, как использовать этот командлет в статье о восстановлении ящиков в Exchange):
New-MailboxRestoreRequest -SourceDatabase Msk-DB1 -SourceStoreMailbox "AAndreev" -TargetMailbox "Admin"
Либо можно восстановить ящик по его MailboxGuid, к примеру в отдельную папку RestoreBox:
New-MailboxRestoreRequest -SourceDatabase Msk-DB1 -SourceStoreMailbox “2532944e-8eeb-4c7e-8bd3-ee2a223b071e” -TargetMailbox “Admin” –TargetRootFolder “RestoreBox” –AllowLegacyDNMismatch
«…бывает необходимо принудительно удалить такие ящики, освободив место на дисках с почтовыми базами…»
Здесь не соглашусь, так как удалив ящики из базы, ее размер останется неизменным. При удалении ящика из базы, освобождается место внутри базы, так называемое White Space. При этом свободное место на диске остается неизменным. Далее это пространство используется при создании новых ящиков и заполнении старых. Чтобы освободить место на диске, можно выполнить оффлайновую дефрагментацию базы. Либо создать новую базу, переместить туда ящики, старую базу удалить. Размер white space можно узнать так: Get-MailboxDatabase DB01 | ft Name, AvailableNewMailboxSpace.
Также ничего не сказано про то, что бывают случаи когда ящик не сразу помечается как отключенный. В таком случае необходимо выполнять команду Clean-MailboxDatabase, чтобы просканировать базу на предмет отключенных ящиков.
Спасибо за дополнение!
Согласен, написал некорректно. При удалении ящика размер базы не уменьшается. Но в освободившееся whitespace будет ипользоваться для других ящиков, и размер файла базы не будет какое-то время расти.
Здравствуйте!
Никак не могу разобраться со временем через которое отключенный почтовый ящик появляется в списке отключенных. Среднее время получается 24-36 часов. За это время отключенный почтовый ящик не виден ни в учетке пользователя, ни в списке отключенных ящиков по команде
Get-MailboxDatabase | Get-MailboxStatistics | Where { $_.DisconnectReason -eq «Disabled» } | ft DisplayName,Database,DisconnectDate, MailboxGuid
Exchange 2013
Exchange запускает процедуру обновления статистики не сразу, а по расписанию:
Можно принудительно перестроить статистику для базы:
Get-MailboxStatistics -Database MbxDB01 | ForEach { Update-StoreMailboxState -Database $_.Database -Identity $_.MailboxGuid -Confirm:$false }
Спасибо огромное, все сразу заработало
Вот здесь:
Если нужно удалить оставшиеся после переноса копии ящиков в определенной базе, выполните команду:
Get-MailboxStatistics –Database Msk-DB1 | Where-Object {$_.DisconnectReason –eq “Softdeleted”} | ForEach {Remove-StoreMailbox –Database $_.database –identity $_.mailboxguid –MailboxState Softdeleted –Whatif }
пропущена закрывающая скобка }
Поправил, спасибо!
добрый день!
спасибо за статью!
1)Если надо *удалить оставшиеся после переноса копии ящиков*, то в команде надо удалить –Whatif (предназначен для эмуляции выполнения команды и вывода информации).
2)у меня через -eq не отработал, пришлось заменить на -like
Get-MailboxStatistics –Database NAME_DB | Where-Object {$_.DisconnectReason –like “Softdeleted”} | ForEach {Remove-StoreMailbox –Database $_.database.name –identity $_.mailboxguid –MailboxState Softdeleted }
3)у меня не отработал с ключем $_.database (ошибка: Cannot process argument transformation on parameter ‘Database’), заменил на $_.database.name
p.s. может кому поможет..
Спасибо большое, споткнулся об $_.database, долго голову ломал, пока не нашел ваше сообщение.
Сразу все заработало с $_.database.name
Почему у меня команда «Get-MailboxDatabase | Get-MailboxStatistics | Where { $_.DisconnectReason -eq «Disabled» } | ft DisplayName,Database,DisconnectDate,MailboxGUID» — выпадает с ошибками?
The specified mailbox «ИМЯ БАЗЫ ДАННЫХ» doesn’t exist.
Не очень силён в PS, но судя по команде конвейер берёт базы и передаёт эти базы команде Get-MailboxStatistics. Но зачем он передаёт базы? Для Get-MailboxStatistics нужны же ящики! Не пойму логики.
поздний ответ конечно, но вы в конвейер сначала передали список баз
Приветствую запускаю команду:
Get-MailboxStatistics –Database Msk-DB1 | Where-Object {$_.DisconnectReason –eq “Softdeleted”} | ForEach {Remove-StoreMailbox –Database $_.database –identity $_.mailboxguid –MailboxState Softdeleted –Whatif}
Выдает ошибку:
pipeline not executed because a pipeline is already executing. Piplines cannot be executed concurently.
+ CategoryInfo итд итп
В чем может быть причина? подскажите пожалуйста.
Попробуйте разбить командну на строки:
$Mailboxes = Get-MailboxStatistics –Database Msk-DB1 | Where-Object {$_.DisconnectReason –eq “Softdeleted”}
$Mailboxes | ForEach {Remove-StoreMailbox –Database $_.database –identity $_.mailboxguid –MailboxState Softdeleted –Whatif}
Попробуй скриптом:
$BoxList = Get-MailboxDatabase | Get-MailboxStatistics | Where { $_.DisconnectReason -eq «SoftDeleted» }
foreach ($mailbox in $BoxList){
Remove-StoreMailbox –Database $mailbox.database –identity $mailbox.mailboxguid –MailboxState Softdeleted –Confirm:$False
}
А как можно реализовать, чтобы при попадании учетной записи в определенную OU почтовый ящик отключался автоматически?
Скрипт в планировщике, который раз в сутки проверяет для каждого пользователя из целевой OU есть ли у него ящик. Если есть — отключате.
Чтобы удалить все отключенные ящики в организации:
Get-MailboxDatabase | Get-MailboxStatistics | where {$_.DisconnectReason -eq «Disabled»} | foreach {Remove-StoreMailbox -Database $_.database -Identity $_.mailboxguid -MailboxState SoftDeleted}
Надо поправить на — MailboxState Disabled
Не могу разобраться как законектить обратно отключенную учетку..стояла галочка не отображать в адресной книге я ее убрал, еще учетка была добавлена в группу отключенные тоже убрал, но учетка все равно неактивна
Думай можно пОдождать обновления адресной книги или назначить ящик через PowerShell
Я возможно-ли как-то централизовано для всех почтовых ящиков изменить срок хранения, не заходя по отдельности в каждый?