Заметки IT Менеджера

28.04.2011

Скрипт для автоматической очистки ящиков в Exchange 2007/2010 от ненужных сообщений


У нас в компании есть служебные рассылки в которые приходят служебные сообщения с разного рода информацией: ошибки, предупреждения и т.д. Временами оттуда может прилететь “волна” в сотни мегабайт или того больше, т.к. и самих сообщений может быть десятки тысяч, да и их размер в особо неприятных случаях может достигать нескольких десятков мегабайт.

В былые времена это приводило к ступору сервера. Затем мы перешли на Exchange 2007 и сервера стали намного мощнее и падать сервер перестал. Зато получалась такая себе DOS атака, т.к. вся очередь была забита такими сообщениями, а все остальные проходили тяжело. Мы переформировали очереди, проставили приоритеты и все вроде бы исправилось … Но теперь возникла та проблема, что если такая “волна” проходит на праздниках или во время отпуска, то ящик пользователя может заблокироваться.

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

Итак, сам скрипт:

#Автор: itpadla.wordpress.com
#Дата создания: 26.04.2011
#Дата изменения: 28.04.2011
#Автор изменения: itpadla.wordpress.com
#Описание: скрипт для удаления сообщений старше n дней направленных в рассылку

# количество дней, старше которых нужно удалять сообщения
$dny = 1

# адрес рассылки
$rassylka = ‘EML maillist01’

# для кого применяем, в случае применения к единичному ящику – раскомментировать
# $kogo = ‘mailtest@domain.ua’

# кто применяет
# для текущего доменного пользователя
$kto = [Environment]::UserName + "@domain.ua"

# в какой папке искать
$ifold = ‘\dbg-folder’
# для какого получателя искать
$recpkey = $rassylka
# для какого отправителя искать
$sendkey = ‘dbg@domain.ua’

$CurrDateTime = [datetime]::Parse((Get-Date -Format ‘HH:mm’))
$ShutdownDateTime = $CurrDateTime.adddays(-$dny)
$shutdowndatetime.tostring()

# Добавляю право полного доступа пользователю к ящикам членов рассылки
Get-DistributionGroupMember $rassylka | Remove-MailboxPermission -User $kto -Deny -InheritanceType ‘All’ -AccessRights ‘FullAccess’ -WarningAction:SilentlyContinue -Confirm:$False
Get-DistributionGroupMember $rassylka | Add-MailboxPermission -User $kto -AccessRights ‘FullAccess’ -Confirm:$False

# Добавляю право полного доступа пользователю к ящику, в случае применения к единичному ящику — раскомментировать
# Remove-MailboxPermission -Identity $kogo -User $kto -Deny -InheritanceType ‘All’ -AccessRights ‘FullAccess’ -WarningAction:SilentlyContinue -Confirm:$False
# Add-MailboxPermission -Identity $kogo -User $kto -AccessRights ‘FullAccess’ -Confirm:$False

# скрипт выполняется для всех членов рассылки $rassylka
Get-DistributionGroupMember $rassylka | Export-Mailbox -Enddate $shutdowndatetime -IncludeFolders $ifold -RecipientKeywords $recpkey -SenderKeywords $sendkey -deletecontent -Confirm:$False

# скрипт выполняется для $kogo, в случае применения к единичному ящику — раскомментировать
# Export-Mailbox -identity $kogo -Enddate $shutdowndatetime -IncludeFolders $ifold -RecipientKeywords $recpkey -SenderKeywords $sendkey -deletecontent -Confirm:$False

 
# Убираю право полного доступа пользователя к ящикам членов рассылки
Get-DistributionGroupMember $rassylka | Remove-MailboxPermission -User $kto -InheritanceType ‘All’ -AccessRights ‘FullAccess’ -Confirm:$False
Get-DistributionGroupMember $rassylka | Add-MailboxPermission -User $kto -Deny -AccessRights ‘FullAccess’ -Confirm:$False -WarningAction:SilentlyContinue

# Убираю право полного доступа пользователя к ящику, в случае применения к единичному ящику – раскомментировать
# Remove-MailboxPermission -Identity $kogo -User $kto -InheritanceType ‘All’ -AccessRights ‘FullAccess’ -Confirm:$False
# Add-MailboxPermission -Identity $kogo -User $kto -Deny -AccessRights ‘FullAccess’ -Confirm:$False -WarningAction:SilentlyContinue

# Зачистка логов операции export-mailbox.
Remove-Item "C:\Program Files\Microsoft\Exchange Server\Logging\MigrationLogs\*.*"

Теперь скрипт или cmd-шник, который его стартует нужно поставить как задачу и все закрутится.

Не забудьте, что нужно один раз на машинке дать возможность запускать неподписанные скрипты локально

Set-ExecutionPolicy RemoteSigned

Для запуска и использую простенький .cmd файл:

@ECHO OFF
C:\WINDOWS\system32\WindowsPowerShell\v1.0\PowerShell.exe -PSConsoleFile "C:\Program Files\Microsoft\Exchange Server\bin\exshell.psc1" -command ". ‘c:\bats\delete-messages-from-maillist.ps1’" -NonInteractive -nologo

Скрипт и cmd можно скачать в виде файла content-delete.rar, подправить под себя и пользоваться.

Реклама

2 комментария »

  1. А если сообщение не было прочитано и вы его удалите, то отправителю придет уведомление об удавлении без прочтения

    комментарий от kkv — 24.11.2011 @ 09:17 | Ответить

    • Ну, роботы, обычно, не шлют письма с уведомлением о прочтении :-) Кроме того, сами уведомления можно и «зарубить» правилами, при желании.

      комментарий от itpadla — 24.11.2011 @ 11:38 | Ответить


RSS feed for comments on this post. TrackBack URI

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s

Создайте бесплатный сайт или блог на WordPress.com.

%d такие блоггеры, как: