10 мая 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, подправить под себя и пользоваться.

Комментариев нет:

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