Скрипт для увеличения квоты пользователей Exchange

Данный скрипт сначала найдет всех пользователей, у которых заканчивается выделенное дисковое пространство и автоматически расширит квоту. Его можно использовать в случаях, когда руководство еще не приняло решение относительно политик выделения пространства пользователям. Также можно автоматически расширять квоту, если пользователю было отправлено уведомление о нехватки места, но чистка не помогла, так как почти все письма нужны и удалять их нельзя.
Для подключения к Exchange необходимо вводить логин и пароль. Чтобы автоматизировать этот процесс и при этом не хранить пароль в открытом формате, сохраняем его в зашифрованном виде следующей командой:
> read-host -assecurestring | convertfrom-securestring | out-file C:\Scripts\password.txt
* после нажатия Enter система запросит ввести пароль, после чего она его зашифрует и сохранит в файл (в данном примере, C:\Scripts\password.txt).
Пример скрипта
- $username = "dmosk\master"
- $password = cat C:\Scripts\password.txt | convertto-securestring
- $server = "exch01.dmosk.local"
- $percentNeedExpand = 99
- $percentExpand = 10
- $percentWarningQuota = 98
- $DbQuotaArr = @{}
- $userQuotaArr = @{}
- $userItemSizeArr = @{}
- function ExchangeQuota-ToInt($quota) {
- return $quota.split('(')[1].split(')')[0].split(' ')[0].replace(',','')
- }
- $cred = new-object -typename System.Management.Automation.PSCredential -argumentlist $username, $password
- $session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri http://$server/powershell -Credential $cred
- Import-PSSession $session
- Get-MailboxDatabase | Select-Object Name,ProhibitSendQuota | ForEach-Object {
- $database = $_.Name
- $databaseQuota = $_.ProhibitSendQuota
- if ($databaseQuota -ne "unlimited") {
- $databaseQuota = ExchangeQuota-ToInt $databaseQuota
- }
- $DbQuotaArr[$database] = $databaseQuota
- }
- $usersList = Get-Mailbox | Get-MailboxStatistics
- $usersList | Select-Object DisplayName,TotalItemSize,Database | ForEach-Object {
- $user = $_.DisplayName
- $userDatabase = $_.Database
- $userItemSize = ExchangeQuota-ToInt $_.TotalItemSize
- $userQuotaPars = Get-Mailbox -Identity $user | Select-Object ProhibitSendQuota,UseDatabaseQuotaDefaults
- if ($userQuotaPars.UseDatabaseQuotaDefaults) {
- $userQuota = $DbQuotaArr[$userDatabase]
- } else {
- $userQuota = ExchangeQuota-ToInt $userQuotaPars.ProhibitSendQuota
- }
- if ($userQuota -ne 'unlimited') {
- $userQuotaArr[$user] = $userQuota
- $userItemSizeArr[$user] = $userItemSize
- }
- }
- $userQuotaArr.Keys | % {
- $userName = $_
- $userNameQuota = [int64]$userQuotaArr[$userName]
- $userNameItemSize = [int64]$userItemSizeArr[$userName]
- $userNameItemSizePercent = [int](($userNameItemSize / $userNameQuota) * 100)
- if ($userNameItemSizePercent -ge $percentNeedExpand) {
- $prohibitQuota = [int64]($userNameQuota * ($percentExpand/100 + 1))
- $issueWarningQuota = [int64]($prohibitQuota * (1 - (100-$percentWarningQuota)/100))
- echo ""
- echo $userName
- Set-Mailbox -UseDatabaseQuotaDefaults $false -IssueWarningQuota $issueWarningQuota -ProhibitSendQuota $prohibitQuota -ProhibitSendReceiveQuota $prohibitQuota -Identity $userName
- }
- }
Описание скрипта
1 - 6 | Индивидуальные переменные. Для каждой среды и случая нужно менять только их, остальная часть скрипта не требует редактирования |
1 | Имя пользователя для подключения к Exchange Server |
2 | Пароль для подключения к Exchange Server. Читается хэш из файла |
3 | Имя почтового сервера к которому будем подключаться |
4 | Процент используемого пространства от 0 до 100, при превышении которого скрипт будет добавлять квоту |
5 | Процент пространства, на которое будет увеличиваться квота пользователя |
6 | Процент пространства от новой квоты для отправки пользователю предупреждения |
8 - 10 | Определение хэш переменных для будущего использования. Если это не сделать заранее в Powershell, сценарий вернет ошибку. |
8 | Массив баз данных с их лимитами по умолчанию |
9 | Массив пользовательских квот для каждого пользователя индивидуально |
10 | Массив занимаемого пространства для каждого пользователя индивидуально |
12 - 14 | Функция преобразования строки дискового пространства, которую возвращает командлет Exchange, в число, соответствующее занимаемому пространству в байтах |
16 - 18 | Подключение к серверу Microsoft Exchange |
16 | Создаем переменную с логином и паролем |
17 | Создаем переменную сессии с подключением к серверу, логином и паролем |
18 | Подключаемся к серверу, используя переменную сессии |
20 - 27 | Получаем массив баз данных, которые есть в нашем Exchange и их дисковые квоты по умолчанию. Данные нужны для пользователей, у которых не выставлены индивидуальные лимиты. |
20 | Запрашиваем список всех почтовых баз, выбираем из полученных данных имена и квоты и инициируем блок скрипт для каждого полученного объекта |
21 | Создаем переменную с именем базы |
22 | Создаем переменную с квотой для базы |
23 | Используем условие, если квота не безлимитная (unlimited) |
24 | Изменяем переменную с квотой — преобразовываем строку в число байт |
26 | Наполняем хэш-массив: добавляем элемент, где ключ — это имя почтовой базы, а значение — ее лимит по умолчанию |
29 - 44 | Получаем список почтовых ящиков и создаем массив пользователей, для которых необходим анализ квот |
29 | Создаем переменную, в которую поместим всю информацию по почтовым ящикам Exchange |
30 | Обратимся к каждому ящику из переменной, созданной строчкой 29 и запустим для нее блок-скрипт |
31 | Создадим переменную с именем пользователя ящика |
32 | Создадим переменную с базой, в которой хранится почта пользователя |
33 | Создадим переменную с объемом занимаемого пространства письмами пользователя |
34 | Создадим массив из двух элементов — квоты для пользователя и указание на использование лимитов по умолчанию для базы |
35 | Условие, если используются лимиты по умолчанию для почтовой базы пользователя |
36 | В качестве лимита пользователя используем квоту базы |
38 | Иначе, используем квоту пользователя, преобразовав ее в байты |
40 | Если квота пользователя не безлимитна |
41 | Добавляем элемент массива: ключ — пользователь, значение — его квота |
42 | Добавляем элемент массива: ключ — пользователь, значение — занимаемого им пространство на сервере |
46 - 58 | Проходим по всему списку пользователей и при необходимости, увеличиваем квоту на почтовый ящик Exchange |
46 | Обращаемся к ранее полученному массиву с пользователями и начинаем блок-скрипт |
47 | Создаем переменную для пользователя |
48 | Создаем переменную с квотой пользователя |
49 | Создаем переменную с занимаемым пространством пользователя |
50 | Рассчитываем переменную с процентом занимаемого пространства от квоты |
51 | Если процент занимаемого пространства выше или равен определенный нами в строке 4 |
52 | Рассчитываем новую квоту для пользователя |
53 | Рассчитываем новую квоту для отправки предупреждений |
54 | Выводим на экран пустую строку для разделения. Удобно, если скрипт запускать вручную |
55 | Выводим на экран пользователя, для которого меняем квоту. Удобно, если скрипт запускать вручную |
56 | Запускаем командлет для расширения квоты пользователя |