PowerShell · 19.04.2022

Удалённая работа с Exchange

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

Подключение ведётся New-PSSession с указанием конфигурации, поэтому позаботьтесь обо всех разрешениях на стороне сервера.

[System.Console]::Title = "Работа с почтовым сервером MS Exchange"

Write-Host
Write-Host "Для подключения к почтовому серверу MS Exchange через консоль PowerShell необходимо использовать только имя сервера!" -ForegroundColor Red
Write-Host "Запускать скрипт только с правами администратора!" -ForegroundColor Red
Write-Host

## Функция логирования ##
## Файл log.txt сохраняется в папку со скриптом ##
$Logfile = "log.txt"
function WriteLog
{
Param ([string]$LogString)
$Stamp = (Get-Date).toString("yyyy/MM/dd HH:mm:ss")
$LogMessage = "$Stamp $LogString $namepc"
Add-content $LogFile -value $LogMessage
}

while($true)
{

Write-Host "0. Подключиться к серверу" -ForegroundColor Green
Write-Host "1. Получить список баз данных сервера" -ForegroundColor Green
Write-Host "2. Обновить адресную книгу" -ForegroundColor Green
Write-Host "3. Получить список групп адресной книги" -ForegroundColor Green
Write-Host "4. Создать новую группу адресной книги" -ForegroundColor Green
Write-Host "5. Получить размер почтовых ящиков" -ForegroundColor Green
Write-Host "6. Общее количество почтовых ящиков" -ForegroundColor Green
Write-Host "7. Количество почтовых ящиков по заданному году" -ForegroundColor Green
Write-Host "8. Почтовые ящики пользователей по заданному году" -ForegroundColor Green
Write-Host

$choice = Read-Host "Выберите вариант"
          Write-Host

Switch($choice){


## Подключиться к серверу ##
  0{$server = Read-Host "Введите имя почтового сервера"
    if (!$server) {Write-Host "Необходимо ввести имя почтового сервера" -ForegroundColor Red
                   Write-Host
                   WriteLog "Сбой подключения. Было указано неверное имя сервера."}
    if ($server) {
        $session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri http://$server/PowerShell/ -Authentication Kerberos
        Import-PSSession $session
        Write-Host
        WriteLog "Попытка подключения к почтовому серверу."
        }
    }


## Получить список баз данных сервера ##
  1{Get-MailboxDatabase -Status | ft Name,DatabaseSize,AvailableNewMailboxSpace
    Write-Host
    WriteLog "Попытка получения список баз данных почтового сервера."}


## Обновить адресную книгу ##
  2{Get-AddressList | Update-AddressList
    Get-GlobalAddressList | Update-GlobalAddressList
    Get-OfflineAddressBook | Update-OfflineAddressBook
    Write-Host
    WriteLog "Попытка обновить адресную книгу почтового сервера."}


## Получить список групп адресной книги ##
  3{get-DistributionGroup | ft Name,DisplayName,Grouptype,PrimarySMTPAddress
    Write-Host
    WriteLog "Попытка получить список групп адресной книги."}


## Создать новую группу адресной книги ##
  4{$name = Read-Host "Введите имя группы на транслите (создаётся в ActiveDirectory)"
    $displayname = Read-Host "Введите отображаемое имя (будет видно в адресной книге)"
    $unit = Read-Host "Введите адрес подразделения для размещения группы в ActiveDirectory"
    New-DistributionGroup -name $name -DisplayName $displayname -alias $name -OrganizationalUnit $unit -SAMAccountName $name -type 'Distribution'
    Set-Group -identity $name -IsHierarchicalGroup:$true
    Write-Host
    WriteLog "Попытка создать новую группу адресной книги."}


## Получить размер почтовых ящиков ##
  5{$db = Read-Host 'Введите имя базы данных'
    Get-Mailbox -Database $db | Get-MailboxStatistics | ft displayname,totaldeleteditemsize,totalitemsize | Out-File allmail.txt
    Write-Host
      if(Test-Path -Path "allmail.txt")
         {Write-Host "РЕЗУЛЬТАТ СОХРАНЁН В ФАЙЛ ALLMAIL.TXT" -ForegroundColor Green
          Write-Host "ИЩИТЕ ФАЙЛ В ПАПКЕ С ТЕКУЩИМ СКРИПТОМ!" -ForegroundColor Green}
      else {Write-Host "ПРОИЗОШЛА ОШИБКА СОХРАНЕНИЯ ФАЙЛА ИЛИ ЖЕ ФАЙЛ НЕ НАЙДЕН!" -ForegroundColor Red}
      Write-Host
      WriteLog "Попытка получения размера почтовых ящиков."}


## Общее количество почтовых ящиков ##
  6{Write-Host "Общее количество почтовых ящиков"
    Get-Mailbox | sort Name | Measure-Object | select count
    Write-Host
    WriteLog "Попытка получения количества почтовых ящиков."}


## Количество почтовых ящиков по заданному году ##
  7{$year = Read-Host 'Год создания ящиков'
    Get-Mailbox | Where-Object {($_.WhenCreated).Year –eq $year} | Measure-Object | select count
    Write-Host
    WriteLog "Попытка получения количества почтовых ящиков по заданному году."}


## Почтовые ящики пользователей по заданному году ##  
  8{$year = Read-Host 'Год создания ящиков'
    Get-Mailbox | Where-Object {($_.WhenCreated).Year –eq $year} | ft name, servername
    Write-Host
    WriteLog "Попытка получения почтовых ящиков пользователей по заданному году."}


## Неверный выбор ##
    default {Write-Host "Неверный выбор. Попробуйте снова." -ForegroundColor Red
             Write-Host
             WriteLog "Неверный выбор задачи"}
 }

}