Очистка транспортной очереди Exchange с большим количеством элементов

Однажды так случилось, что в транспортной очереди на сервере Exchange скопилось ну очень много писем – несколько сотен тысяч. Ввиду того, что письма эти были сгенерированы и разослан по ошибке, доставлять их было не нужно, а нужно было удалить. Казалось бы, все просто – есть статья на TechNet, которая рассказывает, как это сделать - White Paper: Remove Specific Messages from Exchange Server - https://technet.microsoft.com/en-us/library/hh547012(v=exchg.141).aspx#removeMQ. Т.е. план такой:

  • Ставим службу транспорта на паузу, чтобы сервер не принимал больше новых писем, но при этом мог обрабатывать имеющиеся:

net pause MsExchangeTransport

  • Далее получаем список элементов в очереди нужного нам сервера и удаляем их:

Get-TransportServer <имя сервера> | Get-Queue | Get-Message -ResultSize unlimited | Where {$_.Subject -eq "Surprise Party"} | Remove-Message -WithNDR $False

в качестве фильтра можно использовать и другое условие, или не использовать фильтр вовсе.

Вроде все просто, но в случае с большим количеством элементов в очереди, вы получите ошибку вида:

The query produced too many results. To reduce the number of results, use a more restrictive filter.
   + CategoryInfo : InvalidOperation: (:) [Get-Message], LocalizedException
   + FullyQualifiedErrorId : 88B8D789,Microsoft.Exchange.Management.QueueViewerTasks.GetMessageInfo

Чтобы обойти эту ошибку, я предлагаю попробовать использовать следующую конструкцию:

Get-Message -filter {Subject -eq "…"} -resultsize 1000 | remove-Message -withNDR $False

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

Но к сожалению, и здесь вы можете натолкнуться на некоторые ограничения, например, ограничение размера объема передаваемых данных на виртуальном каталоге IIS.

Sending data to a remote command failed with the following error message: The total data received from the remote client exceeded allowed maximum. Allowed maximum is 524288000. For more information, see the about_Remote_Troubleshooting Help topic.
    + CategoryInfo : OperationStopped: (System.Manageme...pressionSyncJob:PSInvokeExpressionSyncJob) [], PSRemotingTransportException
    + FullyQualifiedErrorId : JobFailure

Чтобы обойти это ограничение, нужно изменить этот лимит в настройках виртуального каталога PowerShell (в IIS) на том сервере, куда подключилась консоль. Нужно поменять два атрибута в файле web.config - PSMaximumReceivedObjectSizeMB и PSMaximumReceivedDataSizePerCommandMB.

Нажмите на виртуальный каталог powershell правой кнопкой -> Explore, в открывшейся папке Вы найдете web.config (для Exchange 2013 надо смотреть на Back-End`e):

           <InitializationParameters>
             <Param Name="PSVersion" Value="2.0" />
             <Param Name="ApplicationBase" Value="%ExchangeInstallPath%Bin" />
             <Param Name="AssemblyName" Value="Microsoft.Exchange.Configuration.ObjectModel.dll" />
             <Param Name="PSSessionConfigurationTypeName" Value="Microsoft.Exchange.Configuration.Authorization.ExchangeAuthorizationPlugin" />
             <Param Name="PSMaximumReceivedObjectSizeMB" Value="75" />
             <Param Name="PSMaximumReceivedDataSizePerCommandMB" Value="500" />
           </InitializationParameters>

Далее выполнить IISRESET

!После выполнения работ желательно значения этих атрибутов вернуть в дефолтные.

Если у вас есть вопросы\педложения\пожелания, или вы столкнулись с другим типом ошибки при выполнении подобных действие - добро пожаловать в комментарии.

Alexey Bogomolov,

CTS Support Escalation Engineer, Microsoft