Илья Сазонов недавно жаловался на проблему массового удаления большого количества объектов из папки 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
1. Я возмущен – я не жаловался 🙂
2. Вот почему я не люблю такие штучки: любой запустивший такой скрипт тут же обломится, т.к. у него не будет прав. Поэтому предлагаю добавить в статью соответствующие пояснения http://msdn.microsoft.com/en-us/library/bb204095%28v=exchg.140%29.aspx
Илья, я про имперсонацию держал в уме, и в итоге забыл. Спасибо, что напомнил!
Стас, у меня взлетает вот так если явно
Import-Module -Name “C:Program FilesMicrosoftExchange ServerV15BinMicrosoft.Exchange.WebServices.dll”
указать.
Дим, EWS MAPI 2.0 по умолчанию ставится в %ProgramFiles%MicrosoftExchangeWeb Services2.0. А так можно поставить куда угодно и в скрипте прописывать путь к нужной dll-ке.
Станислав, а можно ли этот скрипт модифицировать, чтобы он удалил из ящиков письма, которые больше n мегабайт?
Антон, переменная $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)}