Массовые удаления объектов из почтового ящика

PowerShell LogoИлья Сазонов недавно жаловался на проблему массового удаления большого количества объектов из папки RecoverableItems. Решил он эту проблему с помощью редактора MFCMapi. Но, задача так же имеет решение через EWS. При этом необходимо держать в уме Throttling Policy, которые, возможно, необходимо будет подправить для учётной записи, из под которой мы будем удалять объекты. Не растекаясь долго мысью по древу просто выложу скрипт, который удаляет объекты из папки RecoverableItems ящика с адресом user.name@domain.com.

Import-Module -Name "C:Program FilesMicrosoftExchangeWeb Services2.0Microsoft.Exchange.WebServices.dll"
$FromMailbox = "user.name@domain.com"

$service = New-Object Microsoft.Exchange.WebServices.Data.ExchangeService([Microsoft.Exchange.WebServices.Data.ExchangeVersion]::Exchange2010_SP2)
# Impersonation
$service.ImpersonatedUserId = New-Object Microsoft.Exchange.WebServices.Data.ImpersonatedUserId([Microsoft.Exchange.WebServices.Data.ConnectingIdType]::SmtpAddress,$FromMailbox)
# Адрес CAS-сервера получаем через службу автообнаружения
$service.AutodiscoverUrl($FromMailbox)

# Размер страницы вывода (количество объектов, возвращаемых за один раз)
$pageSize = 50
$Offset = 0
do {
$ItemView = new-object Microsoft.Exchange.WebServices.Data.ItemView($pageSize,$Offset,[Microsoft.Exchange.WebServices.Data.OffsetBasePoint]::Beginning)
# Получаем объекты из папки RecoverableItemsRoot, параметры вывода берём из переменной $ItemView
$FindItems = $service.FindItems([Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::RecoverableItemsRoot, $ItemView)
foreach ($Item in $FindItems.Items){
# Операция жёсткого удаления объекта
$Item.Delete([Microsoft.Exchange.WebServices.Data.DeleteMode]::HardDelete) }
$Offset += $pageSize }
# Продолжаем перебор объектов, пока остаются непросмотренные
while ($FindItems.MoreAvailable)

Полезные ссылки:
EWS throttling in Exchange
WellKnownFolderName enumeration
ExchangeService.FindItems method (FolderId, ViewBase)
DeleteMode enumeration
ItemView constructor (Int32, Int32, OffsetBasePoint)
OffsetBasePoint enumeration
Configuring Exchange Impersonation

6 thoughts on “Массовые удаления объектов из почтового ящика

  1. 1. Я возмущен – я не жаловался 🙂
    2. Вот почему я не люблю такие штучки: любой запустивший такой скрипт тут же обломится, т.к. у него не будет прав. Поэтому предлагаю добавить в статью соответствующие пояснения http://msdn.microsoft.com/en-us/library/bb204095%28v=exchg.140%29.aspx

  2. Стас, у меня взлетает вот так если явно
    Import-Module -Name “C:Program FilesMicrosoftExchange ServerV15BinMicrosoft.Exchange.WebServices.dll”
    указать.

  3. Дим, EWS MAPI 2.0 по умолчанию ставится в %ProgramFiles%MicrosoftExchangeWeb Services2.0. А так можно поставить куда угодно и в скрипте прописывать путь к нужной dll-ке.

  4. Станислав, а можно ли этот скрипт модифицировать, чтобы он удалил из ящиков письма, которые больше n мегабайт?

  5. Антон, переменная $Item имеет свойство Size (описание – http://msdn.microsoft.com/en-us/library/microsoft.exchange.webservices.data.item.size(v=exchg.80).aspx), которое содержит размер письма в байтах. Так что можно использовать условие что-то типа if ($Item.Size -gt n*1024*1024) {$Item.Delete([Microsoft.Exchange.WebServices.Data.DeleteMode]::HardDelete)}

Leave a Reply

Your email address will not be published. Required fields are marked *