PowerShell позволяет значительно автоматизировать обслуживание системы Exchange и AD. В данной статье я привел несколько скриптов, здорово пригодившихся мне при выполнении некоторых задач.

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


Для удобства работы с AD я использовал командлеты компании Quest Software, они бесплатны для использования и доступны для скачивания здесь -
ActiveRoles Management Shell for Active Directory 32-bit
ActiveRoles Management Shell for Active Directory 64-bit
После установки рекомендую выполнить в Exchange Management Shell команду, позволяющую прикрепить оснастку Quest Software к профилю EMS:
Add-PSSnapin Quest.ActiveRoles.ADManagement

Exchange 2007

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

#Получаем список отключенных пользователей с русскими именами
Get-QADUser -Disabled -name [А-Я]* -IncludedProperties samaccountname, email |
#Предоставляем администратору Exchange права на почтовые ящики выбранных пользователей
ForEach-Object {(Add-MailboxPermission $_.samaccountname -User "
domain\ExchangeAdmin" -AccessRights FullAccess) |
#Производим экспорт почтовых ящиков
ForEach-Object (Export-Mailbox $_.email -PSTFolderPath D:\КУДА_БУДЕТ_ЭКСПОРТИРОВАТЬСЯ\ –Confirm:$false) |
#Отключаем почтовые ящики
ForEach-Object (Disable-Mailbox $_.email –Confirm:$false) }
#Чистим базу
Get-Mailboxdatabase | Clean-MailboxDatabase

Обращаю ваше внимание, что запуск данного скрипта возможен только с удаленной рабочей станции под управление 32-bit ОС и с установленной консолью Exchange Management Shell. Дополнительно используется параметр –Confirm:$false выключающий запрос подтверждения при экспорте и отключении почтового ящика, если вы хотите контролировать весь процесс, удалите этот параметр.

Получение списка 20 самых больших почтовых ящиков:

Get-MailboxStatistics -Server "ИМЯ_ПОЧТОВОГО_СЕРВЕРА" | sort TotalItemSize -desc |
ft "displayname", "ItemCount", "TotalItemSize" | select -First 20

Можно убрать последнюю часть конвейра (| select -First 20) и получить размер всех почтовых ящиков на сервере. Размер выводится в байтах, что не очень удобно для восприятия, но я, к сожалению, не смог найти решения для трансформации размера в Мб или Гб. Буду признателен, если кто подскажет.

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

Get-Mailbox -Database ИМЯ_БАЗЫ | Export-Mailbox -SubjectKeywords "КЛЮЧЕВЫЕ_СЛОВА_В_ТЕМЕ_ПИСЬМА" -DeleteContent

Для получения списка баз почтового сервера, пишем просто:
Get-MailboxDatabase
если же вы хотите получить количество почтовых ящиков, имеющихся в каждой из баз, используйте следующий скрипт:

Get-MailboxDatabase |
Select Server, StorageGroupName, Name, @{Name="Количество почтовых ящиков";
expression={(Get-Mailbox -Database $_.Identity |
Measure-Object).Count}} | Sort -Property Name | Format-Table -AutoSize

Active Directory

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

Находим и удаляем учетные записи компьютеров, не обращавшихся к AD последние 4 месяца

Get-QADComputer -IncludedProperties pwdLastSet | ft Name, pwdLastSet
$LastLogonDate = (Get-Date).AddMonths(-4)
Get-QADComputer -IncludedProperties pwdLastSet | where { $_.pwdLastSet -le $LastLogonDate } | Remove-QADObject

Находим учетные записи пользователей, имя которых начинается с любой буквы русского алфавита и которые не заходили в домен более полгода:

$logondate = (Get-Date).AddMonths(-6)
Get-QADUser -name [А-Я]* -IncludedProperties lastLogon | where { $_.lastLogon -le $logondate } | Select DisplayName, lastLogon

При первом запуске скриптов будет не лишним использовать параметр -whatif в конце конвейра, это позволит протестировать выполнение задачи без применения изменений.

Все приведенные в статье скрипты здорово помогли мне при обслуживании AD и Exchange, надеюсь пригодятся и вам :)

Случайная статья