Скрипт для увеличения квоты пользователей 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 | Запускаем командлет для расширения квоты пользователя |