среда, 18 мая 2011 г.

Import / Export Mailbox в Exchange Server (практика)

imageРазобравшись в прошлой статье “Import / Export Mailbox в Exchange Server (теория)” с теорией, перейдем к практике. Рассмотрим варианты реализации нескольких наиболее часто встречающихся задач.

Для начала нужно выполнить предварительные условия, речь о которых шла ранее:

  • Дадим пользователю права на выполнение командлетов экспорта и импорта записей. Для этого создадим группу ролей RBAC, например Import-Export Admins, включим в неё роль Mailbox Import Export и добавим сотрудников в эту группу ролей (рис.2).

2

Рис.2: Добавление пользователя User роли Mailbox Import Export.

  • Создадим сетевую папку на сервере - \\server\pst, и дадим разрешения Full Control для группы Exchange Trusted Subsystems (рис.3)

3

Рис.3: Права на папку с PST файлами.

  • Проверим, запущена ли служба Exchange Mailbox Replication. Для этого откроем консоль управления сервером, перейдем в оснастку Services (Службы) и убедимся, что служба Microsoft Exchange Mailbox Replication находится в состоянии Started.

Теперь приступим к решению практических задач.

Задача №1:

Необходимо экспортировать из почтового ящика user@test.local все письма, в том числе удаленные, содержащие слова «Test» или «Dogovor» в теле или заголовке письма.

Для решения задачи необходимо создать запрос на экспорт со следующими параметрами:

  • Mailbox – почтовый ящик пользователя, из которого экспортируем данные;
  • ContentFilter – условия поиска:
    • (All –like “dogovor”) – ищем везде слово Dogovor;
    • (All –like “test”) либо слово Test;
  • FilePath – указываем куда экспортировать данные.

В итоге получиться следующая команда:

New-MailboxExportRequest –Mailbox User –ContentFilter {(All –like “dogovor”) –or (All –like “test”)} –FilePath \\server\pst\user-mail.pst

После запуска команды можно проконтролировать состояние её выполнения при помощи командлета Get-MailboxExportRequest (рис.4)

4

Рис.4: Генерация запроса на экспорт и проверка его выполнения.

После того как запрос будет выполнен (Completed), можно подключить полученный PST-файл к Microsoft Outlook. В нем содержимое файла отображается в виде дерева папок пользователя, при этом в папке Recoverable Items\Deletions можно найти удаленные пользователем файлы, а в остальных папках другие записи, удовлетворяющие условиям поиска (рис.5).

5

Рис.5: Подключенный PST-файл в Microsoft Outlook 2010.

Задача №2:

Экспорт писем, полученных пользователем User1 от пользователя User2 за январь 2010 года.

Для решения этой задачи используем параметр –ContentFilter с ключами Sender и Received следующим образом:

New-MailboxExportRequest -Mailbox User1 -ContentFilter {(Sender –eq User2) -and (Received -lt "01/02/2010") -and (Received -gt '01/01/2010')} -FilePath "\\SERVER\PST\User1ToUser2.pst"

Задача №3:

Требуется выполнить миграцию с Microsoft Outlook 2003/2007 на Microsoft Outlook 2010, у которого в связке с Microsoft Exchange Server 2010 появилась возможность хранить архивные данные не на компьютере пользователя в PST файле, а централизованно — в базе данных

Реализовать миграцию содержимого локального PST-файла пользователя в его архивный почтовый ящик можно следующим образом:

  • Собираем PST-файлы с локальных компьютеров в сетевую папку \\SERVER\PST-users и называем их в соответствии с псевдонимом почтового ящика пользователя;
  • Выполняем следующую команду:

Dir \\SERVER\PST-users\*.pst | %{ New-MailboxImportRequest -Name $_.BaseName -Mailbox $_.BaseName -FilePath $_.FullName -IsArchive}

Данная команда по очереди берет файлы из папки \\SERVER\PST-users и подставляет их в командлет New-MailboxImportRequest, причем в качестве имени целевого почтового ящика используется имя PST-файла без расширения ($_.BaseName), а в качестве источника данных используется полное имя PST-файла ($_.FullName). При этом полученные записи помещаются в архивный почтовый ящик при помощи параметра IsArchive.

Что касается экспорта всей базы данных в одни PST-файл то его можно осуществить с помощью простого скрипта (рис.6):

6

Рис.6: Множественный экспорт в один PST файл.

Нельзя просто передать вывод команлета Get-Mailbox по конвейеру командлету New-MailboxExportRequest, поскольку при этом будут сгенерированы запросы автоматически и оригинальные имена будут присвоены только первым 10-и запросам, соответственно для всех остальных будет выведено сообщение об ошибке. Чтобы этого не произошло необходимо использовать параметр –Name, в который в данном примере подставляем имя почтового ящика и тогда каждый запрос будет с именем того почтового ящика, который он обслуживает.

Задача №4:

В локальную сеть предприятия проник вирус, распространяющийся через почтовые рассылки. Чтобы от него избавиться, необходимо найти у всех пользователей определенные письма и удалить.

До выхода Service Pack 1 эта задача решалась при помощи командлета Export-Mailbox с параметрами DeleteContent — для удаления содержимое из исходного почтового ящика и DeleteAssociatedMessages — для удаления сопоставленных сообщений. К сожалению, c помощью новых командлетов удалить содержимое в почтовых ящиках невозможно, поэтому используем другой способ.

Для удаления содержимого почтовых ящиков в Microsoft Exchange Server 2010 SP1 используют командлет Search-Mailbox с параметром -DeleteContent. При использовании параметров -TargetMailbox и -TargetFolder найденные записи будут скопированы в указанную папку другого почтового ящика.

Для удаления сообщений содержащих в поле тема фразу “Virus message” необходимо воспользоваться следующей командой:

Search-Mailbox -Identity "User" -SearchQuery "Subject:'Virus message'" –DeleteContent

При этом запрос на поиск записей формируется при помощи Advanced Query Syntax (AQS). Подробнее про AQS читаем здесь (http://technet.microsoft.com/en-us/library/ff601762.aspx).

Примечание: Перед удалением записи, рекомендуется оценить результат выполнения команды по журналу, который можно сгенерировать при помощи параметра LogOnly, указав куда будет скопирован файл параметрами TargetMailbox и TargetFolder.

Обслуживание операций импорта и экспорта

Разобрав несколько практических примеров по использованию функций импорта и экспорта данных уделим внимание обслуживанию уже запущенных запросов.

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

Get-MailboxExportRequest -Status InProgress

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

Get-MailboxExportRequest -Status Failed | Set-MailboxExportRequest -BadItemLimit 5 -BatchName BadItemLimitTo5

Затем, необходимо возобновить выполнение запросов с помощью командлета Resume-MailboxExportRequest.

Подробную информацию о выполненном запросе можно получить с помощью командлета:

Get-MailboxExportRequestStatistics -Identity <alias>\<name> | fl

Где <alias> — это псевдоним почтового ящика из которого осущетвляется экспорт данных, а <name> — это имя самого запроса.

После того, как все запросы на импорт и экспорт данных будут завершены, необходимо их удалить, т.к. сам сервер такую очистку не производит:

Get-MailboxExportRequest | Remove-MailboxExportRequest

Подключение отключенных баз данных

Часто возникают необходимость восстановить информацию из базы данных, почтовые ящики которой в данный момент не подключены к серверу, например из архивной базы. Если раньше достаточно было указать параметр –Database для командлета Export/Import-Mailbox, то теперь такого параметра нет, и необходимо подключить почтовые ящики к одной из существующих учетных записей в Active Directory. Делается это следующим образом:

  • Создаем временную учетную запись в AD, например temp;
  • Монтируем базу данных на сервер (Mount-Database RecDB);
  • Переходим на уровень Recipient Configuration – раздел Disconnected Mailbox, нажимаем на искомом почтовом ящике правой кнопкой мыши и выбираем действие Connect (рис.7);

7

Рис.7: Подключение отключенных почтовых ящиков.

Примечание: Если после подключения базы почтовые ящики не появились в Отключенных, то необходимо перезапустить службу Microsoft Exchange Information Store (Банк данных Microsoft Exchange) и выполнить команду Clean-MailboxDatabase.

  • В поле Existing user и выбираем пользователяTemp (рис.8);

8

Рис.8: Сопоставление отключенного ящика с учетной записью Temp.

После завершения процесса подключения, над почтовым ящиком Temp@test.local можно производить манипуляции с помощью командлетов импорта и экспорта.

Заключение

C выходом пакета исправлений для сервера Microsoft Exchange Server2010 подход к операциям экспорта и импорта данных сильно изменился. Стал он лучше, либо хуже — покажет время. Одно можно сказать с уверенностью — использование PowerShell дает администраторам огромные простор для фантазии и возможность автоматизации рутинных задач путем несложного скриптинга.

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

IT_Prof комментирует...

Как удалять письма с точным соответствием?
Т.е. если я делаю
New-MailboxExportRequest -Mailbox user_name -ContentFilter {Subject -eq "Ипать колотить"}, то экспортируются только те письма, где тема ПОЛНОСТЬЮ совпадает, а если делаю:
Search-Mailbox -SearchQuery "Subject:'колотить' -DeleteContent
То удаляет все письма, СОДЕРЖАЩИЕ в любом месте темы слово "колотить"

Unknown комментирует...

[PS] D:\>New-MailboxExportRequest -Name mzvtest06 -Mailbox mzv -ContentFilter {(Received -lt "01/06/2013") -and (Received -gt "01/05/2013")} -FilePath "\\xxxxxxx\tmpmzv$\mzv1.pst"

Name Mailbox Status
---- ------- ------
mzvtest06 xxxxxxxxx.xxxxx.xx/Users/mzv Queued


проверяю данные в mzv1.pst все красиво - ровно данные за месяц май….

Но если попытаться разбить данный интервал

[PS] D:\>New-MailboxExportRequest -Name mzvtest07 -Mailbox mzv -ContentFilter {(Received -lt "31/05/2013") -and (Received -gt "16/05/2013")} -FilePath "\\ххххххххх\tmpmzv$\mzv2.pst"

Указано недопустимое значение ContentFilter. Недопустимое значение "ContentFilter". Значение "31/05/2013" не может быть преобразовано в тип System.DateTime. --> Значение "31/05/2013" не может быть преобразовано в тип System.DateTime.
+ CategoryInfo : InvalidArgument: ((Received -lt "...t "16/05/2013"):String) [], ContentFilterInvalidPerm anentException
+ FullyQualifiedErrorId : 1C1CF0B
+ PSComputerName : xxxxxxx.xxxxxx.xxxxxx.xx

Проблема явно с форматом даты
Потому как

[PS] D:\>New-MailboxExportRequest -Name mzvtest07 -Mailbox mzv -ContentFilter {(Received -lt "05/31/2013") -and (Received -gt "05/16/2013")} -FilePath "\\xxxxxxxx\tmpmzv$\mzv2.pst"

Name Mailbox Status
---- ------- ------
mzvtest07 xxxxxx.xxxxx.xx/Users/mzv Queued

Но, увы результат mzv2.pst не данные ящика за вторую половину мая, а архив без единого сообщения…

Unknown комментирует...

Используйте такой синтаксис (вместо {} - "" ; дата в формате mm/dd/yyyy):

[PS] D:\>New-MailboxExportRequest -Name mzvtest07 -Mailbox mzv -ContentFilter "(Received -lt "05/31/2013") -and (Received -gt "05/16/2013")" -FilePath "\\xxxxxxxx\tmpmzv$\mzv2.pst"

Unknown комментирует...

если использую " " вместо {}, то тогда просит дату брать в ' '

Lordaster комментирует...
Этот комментарий был удален автором.
Lordaster комментирует...
Этот комментарий был удален автором.
Unknown комментирует...

Добрый день, Алексей!
Спасибо Вам большое за статью!
У меня возник следующий вопрос, какой командой можно начать экспорт нескольких ящиков в pst у которых задан определенный атрибут?

Unknown комментирует...

Сделал. Если кому надо оставлю тут. Спасибо!

Экспорт определенных ящиков с заданным Настраиваемым атрибутом 1 - archive.
Доступ в папку назначения должен быть у группы "domain.local\exchange trusted subsystem".
Очень полезно когда надо какие-то определенные ящики экспортировать.

foreach ($i in (Get-Mailbox -Filter {CustomAttribute1 -eq "archive"})) { New-MailboxExportRequest -Mailbox $i -FilePath "\\server\pst\archive\$($i.Alias).pst" }

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