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

Обновлено и опубликовано Опубликовано:

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

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

> read-host -assecurestring | convertfrom-securestring | out-file C:\Scripts\password.txt

* после нажатия Enter система запросит ввести пароль, после чего она его зашифрует и сохранит в файл (в данном примере, C:\Scripts\password.txt).

Пример скрипта

  1. $username = "dmosk\master"
  2. $password = cat C:\Scripts\password.txt | convertto-securestring
  3. $server = "exch01.dmosk.local"
  4. $percentNeedExpand = 99
  5. $percentExpand = 10
  6. $percentWarningQuota = 98
  7.  
  8. $DbQuotaArr = @{}
  9. $userQuotaArr = @{}
  10. $userItemSizeArr = @{}
  11.  
  12. function ExchangeQuota-ToInt($quota) {
  13.     return $quota.split('(')[1].split(')')[0].split(' ')[0].replace(',','')
  14. }
  15.  
  16. $cred = new-object -typename System.Management.Automation.PSCredential -argumentlist $username, $password
  17. $session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri http://$server/powershell -Credential $cred
  18. Import-PSSession $session
  19.  
  20. Get-MailboxDatabase | Select-Object Name,ProhibitSendQuota | ForEach-Object {
  21.     $database = $_.Name
  22.     $databaseQuota = $_.ProhibitSendQuota
  23.     if ($databaseQuota -ne "unlimited") {
  24.         $databaseQuota = ExchangeQuota-ToInt $databaseQuota
  25.     }
  26.     $DbQuotaArr[$database] = $databaseQuota
  27. }
  28.  
  29. $usersList = Get-Mailbox | Get-MailboxStatistics
  30. $usersList | Select-Object DisplayName,TotalItemSize,Database | ForEach-Object {
  31.     $user = $_.DisplayName
  32.     $userDatabase = $_.Database
  33.     $userItemSize = ExchangeQuota-ToInt $_.TotalItemSize
  34.     $userQuotaPars = Get-Mailbox -Identity $user | Select-Object ProhibitSendQuota,UseDatabaseQuotaDefaults
  35.     if ($userQuotaPars.UseDatabaseQuotaDefaults) {
  36.         $userQuota = $DbQuotaArr[$userDatabase]
  37.     } else {
  38.         $userQuota = ExchangeQuota-ToInt $userQuotaPars.ProhibitSendQuota
  39.     }
  40.     if ($userQuota -ne 'unlimited') {
  41.         $userQuotaArr[$user] = $userQuota
  42.         $userItemSizeArr[$user] = $userItemSize
  43.     }
  44. }
  45.  
  46. $userQuotaArr.Keys | % {
  47.     $userName = $_
  48.     $userNameQuota = [int64]$userQuotaArr[$userName]
  49.     $userNameItemSize = [int64]$userItemSizeArr[$userName]
  50.     $userNameItemSizePercent = [int](($userNameItemSize / $userNameQuota) * 100)
  51.     if ($userNameItemSizePercent -ge $percentNeedExpand) {
  52.         $prohibitQuota = [int64]($userNameQuota * ($percentExpand/100 + 1))
  53.         $issueWarningQuota = [int64]($prohibitQuota * (1 - (100-$percentWarningQuota)/100))
  54.         echo ""
  55.         echo $userName
  56.         Set-Mailbox  -UseDatabaseQuotaDefaults $false -IssueWarningQuota $issueWarningQuota -ProhibitSendQuota $prohibitQuota -ProhibitSendReceiveQuota $prohibitQuota -Identity $userName
  57.     }
  58. }

Описание скрипта

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 Запускаем командлет для расширения квоты пользователя
# Exchange # Powershell # Windows # Серверы # Почта
Дмитрий Моск — частный мастер
Был ли вам полезен этот скрипт?

Да            Нет